SpamAssassin (spamd) bellek kullanımını en aza indirme


15

Debian'da SpamAssassin kullanıyorum (Pyzor, AWL ve Bayes ile varsayılan yapılandırma devre dışı bırakıldı ve sa-derleme etkin) ve spamd alt işlemlerinin her biri 32'de yaklaşık 100 ila 150MB bellek (yaklaşık 50MB gerçek bellek) tüketiyor bit sunucuları ve 64 bit sunucularda bunun iki katı (mantıklı bir şekilde). Genellikle iki alt süreç vardır, ancak yoğun zamanlarda beş (maksimum) çalışma olabilir.

ISTM, 200 ila 600MB'ın bu görev için çok fazla bellek olduğunu. Filtreleme yapımın bir parçası olarak SA'yı kullanmaya devam etmek istiyorum, ancak çok fazla belleği haklı çıkarmak zorlaşıyor.

Her alt işlemin kullandığı bellek miktarını azaltmanın herhangi bir yolu var mı? (Veya alternatif olarak, tek bir çocuk işlemini o kadar hızlı yapın ki, maksimum çocukları 2 gibi bir şeye ayarlayabilirim.). Kesinliği azaltacak veya azaltabilecek olanlar da dahil olmak üzere herhangi bir seçeneği dikkate almaya hazırım.

Ben zaten SA wiki "Bellek Yetersiz Sorunlar" sayfasını okudum ; hiçbir faydası yoktur. 5 MB'tan büyük mesajlar SA ile taranmaz.


1
Çatallı çocukların ps veya top show sayılarının toplamından çok daha az fiziksel RAM kullanabileceğini unutmayın. Bunun nedeni çatallama sırasında yazma-kopyalama stratejisidir.
David Schmitt

Yanıtlar:


5

Sanırım Linux'un bellek kullanımını rapor etme biçimini yanlış anlıyorsunuz. Bir işlem çatallandığında, orijinal işlemle çok fazla kaynağı paylaşan ikinci bir işlemle sonuçlanır. Buna hafıza dahildir. Ancak, Linux bunun için Yazarken Kopyala (COW) olarak bilinen bir teknik kullanır. Bunun anlamı, her çatallı alt işlemin bellekte orijinal işlemle aynı verileri görmesidir, ancak bu veri her değiştiğinde (alt veya üst tarafından), değişiklikler kopyalanır ve yalnızca yeni bir yeri gösterir.

İşlemlerden biri bu verilerde değişiklik yapana kadar aynı kopyayı paylaşır. Sonuç olarak, 100MB RAM kullanan bir işlem yapabilir ve 10 kez çatallayabilirim. Bu çatallı işlemlerin her biri 100MB RAM kullanıldığını gösterir, ancak kutudaki genel bellek kullanımına bakarsanız, yalnızca 130MB RAM'in kullanıldığını gösterebilir (işlemler arasında 100MB paylaşılan artı birkaç MB ek yük , artı sistemin geri kalanı için bir düzine MB veya iki).

Son bir örnek olarak, şu anda 30 apache işlemi çalışan bir kutu var. Her işlem 22 MB RAM kullanımını gösteriyor. Ancak, genel RAM kullanımımı göstermek için free -m komutunu çalıştırdığımda şunu elde ederim:

topher@crucible:/tmp$ free -m
             total       used       free     shared    buffers     cached
Mem:           349        310         39          0         24         73
-/+ buffers/cache:        212        136
Swap:          511         51        460

Gördüğünüz gibi, bu kutuda her biri 18MB "gerçek" RAM kullanan 30 işlemi çalıştırmak için yeterli RAM yok. Kelimenin tam anlamıyla RAM'iniz bitmedikçe veya uygulamalarınız çok fazla değişmedikçe, şeyler hakkında endişelenmezdim.

GÜNCELLEME: Ayrıca, burada Linux bellek kullanımı ile ilgili başka bir sorunun cevabında jldugger tarafından belirtilen smem adlı aracı kontrol edin .


1
Kelimenin tam anlamıyla RAM bitiyor, bu yüzden endişelenmem gerekiyor. Ancak, RAM tüketen diğer süreçler olabilir ve SA çok fazla kullanmıyor olabilir.
Tony Meyer

Gözlemimden ve araç kokusundan , spamassassin yaklaşık 50 MB RAM kullanıyor gibi görünüyor ve birden fazla işleme bölerseniz neredeyse tüm bellekleri paylaşılan hafızadır, bu yüzden toplamda yaklaşık 50 MB RAM kullanacaktır. ps her biri 50 MB'lık bir RSS'ye sahip olduğunu bildirmesine rağmen, tüm süreçler arasında . YMMV.
thomasrutter

1

Sa-compile kullanarak birçok kuralın eşleşme hızını artırabilirsiniz.


Üzgünüm, zaten sa-derleme kullandığım soruda bahsetmiş olmalıydım. Yine de iyi bir öneri.
Tony Meyer

1

İşte yaptıklarım.

Birçok iletinin kabaca aynı anda teslim edileceği bir kurulum var; bir dizi deney için geçici bir makaraya kopyalanan ve daha sonra her beş dakikada bir bir cron işi tarafından teslim edilen mesajlarda SA çalıştırıyorum.

spamd "belki de max-children parametresini artırmalısınız" yazdırma devam eder ve bir noktada 40'a kadar yükseltti, ama tüm takas alanı tüketen ve çökmesini sunucu vardı.

Şimdi teslimatın bir Procmail kilit dosyası tarafından yönetildiği farklı bir rejim uyguladım. Yapması kolay olduğu için, sadece işlem kimliğinin son basamağını kullanıyorum ve 10 çocukla koşuyorum. Bunun en uygun olduğundan hiç emin değilim, ama zaman zaman deneyimlediğim çılgın yük zirvelerinden kaçınmaya zaten yardımcı oldu.

LINEBUF=10240

# Grab last digit of PID for lockfile
PID=$$
:0
* PID ?? ()\/[0-9]$
{ D=$MATCH }
:0
* > 512000
{ SA="(too large)" }
:0Ew:/tmp/20spamc.$D
SA=| spamc -p 38783 -l -y

Buna ek olarak, spamdbir dizi ulimitkısıtlamaya başlıyorum . Kısıtlamaları kaldırmam dışında , sayılar http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-masses adresinden çıkarıldı ulimit -u. (Neler olup bittiğinden emin değilim. 32 her durumda çok küçüktür. 500 gibi bir şeyle spamdbir süre koşmaya devam edebilirim , ama sonunda sınıra girebilirim.)

ulimit -v 204800
ulimit -m 204800
ulimit -n 256
#ulimit -u 32

perl -T -I lib -w spamd --min-children 2 --max-children 10 --max-spare 5 etc etc

Yükün uzun bir süre çok yüksek olması durumunda teslimat arızaları ile sonuçlanacağımı tahmin ediyorum, ancak şu ana kadar yükü yönetilebilir seviyelere indirmeyi başardım; ve bir dizi başarısız teslimat, takas biten makineden hala çok daha iyi.


0

Yüksek yük ortalamaları (bazen) makinenizin RAM'inin bittiği (ve sanal bellekten ileri geri CPU değiştirme işlemleri kullandığının) dolaylı bir belirtisidir, bu nedenle posta sunucunuzu SpamAssassin'den posta iletmeyecek şekilde yapılandırmayı deneyebilirsiniz. yük ortalamaları çok yüksek.

Hangi MTA'yı çalıştırdığınızı belirtmezsiniz, ancak SA'yı exim4'teki erişim denetim listesinden çağırıyorsanız, bu iletinin altındaki öneri etkilidir.

Ayrıca, önündeki diğer, daha az kaynak yoğun spam filtreleme yöntemlerini koyarak (yani SA'ya ulaşmadan önce bazı spam'leri işleyip reddederek) SA üzerindeki yükü hafifletebilir ve böylece bellek kullanımını azaltabilirsiniz. örneğin, gri liste ve gönderici ek bilgilerin nispeten az RAM kullandığını doğrular.


Ilgili bir not, ben ciddi dspam daha az RAM aç olduğu gibi ben çalıştırılan birkaç sunucu üzerinde dspam lehine SA hendek düşünüyorum.
David North

Orta yol olarak, ilk adım olarak bir Bayesian filtresi çalıştırabilir ve yalnızca ilk filtrenin net bir karar vermediği iletiler için SpamAssassin'e geri dönebilirsiniz. Spam gönderenler kendilerini çok tekrarlama eğilimindedir, bu nedenle muhtemelen SpamAssassin olmadan vakaların büyük çoğunluğunu halledebilirsiniz, ancak yine de yeni salgınlar
vb.İçin

0

Birkaç ay önce benzer bir durumdaydık. SpamAssassin ve ClamAV, barındırılan bir sunucuda çok fazla bellek kullanıyordu. Sunucuya daha fazla bellek ekleme seçeneğimiz vardı, ancak Postini'ye geçmek için daha uygun maliyetli ve zaman etkili olduğu ortaya çıktı. YMMV.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.