Jak zminimalizować wykorzystanie pamięci SpamAssassin (spam)

15

Używam SpamAssassin na Debianie (domyślna konfiguracja z wyłączonymi Pyzor, AWL i Bayes oraz włączoną kompilacją sa), a każdy ze spamowanych procesów potomnych zużywa około 100 do 150 MB pamięci (około 50 MB prawdziwej pamięci) na 32 serwery bitowe, a około dwukrotnie więcej (logicznie) na serwerach 64-bitowych. Są na ogół dwa procesy potomne, ale w zajętych momentach może być uruchomionych pięć (maksymalnie).

ISTM od 200 do 600 MB to dużo pamięci do tego zadania. Chciałbym nadal używać SA jako części mojej struktury filtrowania, ale trudno jest uzasadnić tak dużo pamięci.

Czy istnieją sposoby na zmniejszenie ilości pamięci używanej przez każdy proces potomny? (Lub alternatywnie, wykonaj proces pojedynczego potomka tak szybko, że mogę ustawić maksymalną liczbę potomków na coś takiego jak 2?). Jestem skłonny rozważyć wszelkie opcje, w tym te, które spowodują lub mogą skutkować zmniejszoną dokładnością.

Przeczytałem już stronę „Problemy z brakiem pamięci” na wiki SA ; nic z tego nie ma pożytku. Wiadomości większe niż 5 MB nie są skanowane za pomocą SA.

Tony Meyer
źródło
1
Zauważ, że rozwidlone dzieci mogą zużywać znacznie mniej fizycznej pamięci RAM niż suma liczb ps lub górnego programu. Wynika to ze strategii kopiowania przy zapisie podczas rozwidlania.
David Schmitt

Odpowiedzi:

5

Myślę, że nie rozumiesz sposobu, w jaki Linux zgłasza użycie pamięci. Gdy proces rozwidla się, powstaje drugi proces, który dzieli wiele zasobów z procesem oryginalnym. Obejmuje to pamięć. Jednak Linux używa do tego techniki znanej jako Copy On Write (COW). Oznacza to, że każdy rozwidlony proces potomny zobaczy w pamięci te same dane, co proces pierwotny, ale ilekroć dane te ulegną zmianie (przez dziecko lub rodzic), zmiany są kopiowane i dopiero wtedy wskazują nową lokalizację.

Dopóki jeden z procesów nie wprowadzi zmian do tych danych, współużytkują tę samą kopię. W rezultacie mógłbym mieć proces, który zużywa 100 MB pamięci RAM i rozwidla go 10 razy. Każdy z tych rozwidlonych procesów pokazywałby, że używane jest 100 MB pamięci RAM, ale jeśli spojrzysz na ogólne użycie pamięci na pudełku, może to tylko pokazać, że zużywa się 130 MB pamięci RAM (100 MB współdzielone między procesami, plus kilka MB narzutu , plus jeszcze kilkanaście MB lub dwa dla reszty systemu).

Jako ostatni przykład mam teraz pudełko z uruchomionymi 30 procesami Apache. Każdy proces pokazuje użycie 22 MB pamięci RAM. Jednak gdy uruchomię free -m, aby pokazać moje ogólne użycie pamięci RAM, otrzymuję:

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

Jak widać, to pudełko nie ma nawet wystarczającej ilości pamięci RAM, aby uruchomić 30 procesów, z których każdy zużywał 18 MB „prawdziwej” pamięci RAM. Chyba że dosłownie kończy Ci się pamięć RAM lub aplikacje znacznie się zmieniają, nie martwiłbym się o nic.

AKTUALIZACJA: Sprawdź także to narzędzie o nazwie smem , wspomniane przez jlduggera w odpowiedzi na inne pytanie dotyczące wykorzystania pamięci w systemie Linux tutaj .

Christopher Cashell
źródło
1
Dosłownie brakuje mi pamięci RAM, więc muszę się tym martwić. Możliwe jednak, że to inne procesy zużywają pamięć RAM, a SA nie używa tak dużo.
Tony Meyer
Z moich obserwacji i korzystania z narzędzia smem , wygląda na to, że spamassassin zużywa około 50 MB pamięci RAM, a jeśli rozwidlisz go na wiele procesów, prawie cała ich pamięć to pamięć współdzielona, ​​więc nadal zużywa około 50 MB pamięci RAM ogółem spośród wszystkich procesów, nawet jeśli ps zgłasza, że ​​każdy ma RSS 50 MB. YMMV.
thomasrutter,
1

Korzystając z sa-compile, możesz poprawić szybkość dopasowania wielu reguł.

David Schmitt
źródło
Przepraszam, powinienem wspomnieć w pytaniu, że już używam kompilacji sa. Jednak dobra sugestia.
Tony Meyer
1

Oto co zrobiłem.

Mam konfigurację, w której wiele wiadomości jest zwykle dostarczanych z grubsza w tym samym czasie; dla serii eksperymentów uruchamiam SA na wiadomościach, które są kopiowane do tymczasowej buforu, a następnie dostarczane przez zadanie crona co pięć minut.

spamd nadal drukowałby „może powinieneś zwiększyć parametr max-child” i kazałem go zwiększyć do 40 w pewnym momencie, ale kazałem serwerowi zużywać całą przestrzeń wymiany i zawieszać się.

Teraz wdrożyłem inny system, w którym dostarczanie jest regulowane przez plik blokady Procmail. Ponieważ było to proste, po prostu używam ostatniej cyfry identyfikatora procesu i uruchamiam z 10 dziećmi. Nie jestem wcale pewien, czy jest to optymalne, ale już pomogło uniknąć szalonych szczytów obciążenia, które od czasu do czasu budziłem doświadczenie.

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

Ponadto zaczynam spamdz pewnymi ulimitograniczeniami. Numery zostały wyjęte z http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-masses , tyle że usunąłem ulimit -uograniczenie. (Nie jestem pewien, co się dzieje. 32 jest w każdym razie zdecydowanie za małe. Z czymś takim, jak 500, mógłbym spamdbiegać jeszcze przez jakiś czas, ale w końcu doszedłem do limitu).

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

Chyba skończę z niepowodzeniem dostawy, jeśli obciążenie jest zbyt wysokie przez dłuższy czas, ale jak dotąd wydaje się, że udało mi się dzięki temu zmniejszyć obciążenie do możliwych do zarządzania poziomów; a kilka nieudanych dostaw jest nadal znacznie lepsze niż w maszynie, która kończy swap.

potrójny
źródło
0

Średnie obciążenia przy dużym obciążeniu są (czasem) pośrednim objawem braku pamięci RAM w komputerze (i używania dużej ilości procesów zamiany procesora z pamięci wirtualnej do przodu i do tyłu), więc możesz spróbować skonfigurować serwer pocztowy, aby nie przekazywał poczty przez SpamAssassin, jeśli średnie obciążenia są zbyt wysokie.

Nie wspominasz, z którego MTA korzystasz, ale jeśli dzwonisz do SA z listy kontroli dostępu w exim4, sugestia na dole tej wiadomości jest skuteczna.

Możesz także zmniejszyć obciążenie SA, a tym samym zmniejszyć zużycie pamięci, umieszczając przed nim inne, mniej wymagające zasoby metody filtrowania spamu (tj. Przetwarzają i odrzucają część spamu, zanim dotrze on do SA) - na przykład, greylisting i nadawca weryfikują objaśnienia używające stosunkowo mało pamięci RAM.

David North
źródło
W związku z tym poważnie zastanawiam się nad porzuceniem SA na korzyść dspam na kilku serwerach, które uruchamiam, ponieważ dspam jest podobno mniej wymagający pamięci RAM.
David North
Jako środek, możesz uruchomić filtr Bayesian jako pierwszy krok i wrócić do SpamAssassin tylko dla wiadomości, dla których pierwszy filtr nie otrzymał jasnego werdyktu. Spamerzy często powtarzają się często, więc prawdopodobnie możesz poradzić sobie ze zdecydowaną większością przypadków bez SpamAssassin, ale nadal masz dostęp do nowych epidemii itp.
tripleee
0

Kilka miesięcy temu byliśmy w podobnej sytuacji. SpamAssassin i ClamAV korzystały z dużej ilości pamięci na hostowanym serwerze. Mieliśmy opcję dodania większej ilości pamięci do serwera, ale przejście na Postini okazało się bardziej opłacalne i czasochłonne. YMMV.

Gerald Combs
źródło