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.
źródło
Odpowiedzi:
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ę:
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 .
źródło
Korzystając z sa-compile, możesz poprawić szybkość dopasowania wielu reguł.
źródło
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.
Ponadto zaczynam
spamd
z pewnymiulimit
ograniczeniami. Numery zostały wyjęte z http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-masses , tyle że usunąłemulimit -u
ograniczenie. (Nie jestem pewien, co się dzieje. 32 jest w każdym razie zdecydowanie za małe. Z czymś takim, jak 500, mógłbymspamd
biegać jeszcze przez jakiś czas, ale w końcu doszedłem do limitu).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.
źródło
Ś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.
źródło
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.
źródło