So minimieren Sie den Speicherbedarf von SpamAssassin (SpamD)

15

Ich verwende SpamAssassin unter Debian (die Standardkonfiguration mit Pyzor, AWL und Bayes ist deaktiviert und Sa-Compile ist aktiviert), und jeder der untergeordneten Spam-Prozesse belegt ungefähr 100 bis 150 MB Speicher (ungefähr 50 MB realer Speicher) auf dem 32 Bit-Server und etwa doppelt so viel (logischerweise) auf den 64-Bit-Servern. In der Regel gibt es zwei untergeordnete Prozesse, in Stoßzeiten können jedoch maximal fünf ausgeführt werden.

ISTM, dass 200 bis 600 MB viel Speicher für diese Aufgabe ist. Ich möchte SA weiterhin als Teil meiner Filterstruktur verwenden, aber es wird schwierig, so viel Speicher zu rechtfertigen.

Gibt es Möglichkeiten, den Speicherbedarf der einzelnen untergeordneten Prozesse zu verringern? (Oder machen Sie alternativ einen einzelnen untergeordneten Prozess so schnell, dass ich die maximale Anzahl untergeordneter Elemente auf 2 festlegen kann?). Ich bin bereit, alle Optionen in Betracht zu ziehen, einschließlich solcher, die zu einer verminderten Genauigkeit führen oder führen können.

Ich habe bereits die Seite "Out of Memory Problems" im SA-Wiki gelesen . da nützt nichts. Nachrichten, die größer als 5 MB sind, werden mit SA nicht gescannt.

Tony Meyer
quelle
1
Beachten Sie, dass verzweigte Kinder möglicherweise weniger physischen Arbeitsspeicher benötigen als die Summe der Zahlen ps oder top show. Dies liegt an der Copy-on-Write-Strategie beim Gabeln.
David Schmitt

Antworten:

5

Ich glaube, Sie verstehen falsch, wie Linux die Speichernutzung meldet. Wenn sich ein Prozess teilt, führt dies zu einem zweiten Prozess, der viele Ressourcen mit dem ursprünglichen Prozess teilt. Darin enthalten ist Speicher. Linux verwendet hierfür jedoch eine Technik, die als Copy On Write (COW) bezeichnet wird. Dies bedeutet, dass für jeden untergeordneten Zweigprozess dieselben Daten im Speicher angezeigt werden wie für den ursprünglichen Prozess. Wenn sich diese Daten jedoch ändern (durch das untergeordnete oder übergeordnete Element), werden die Änderungen kopiert und zeigen nur dann auf einen neuen Speicherort.

Bis einer der Prozesse Änderungen an diesen Daten vornimmt, verwenden sie dieselbe Kopie gemeinsam. Infolgedessen könnte ich einen Prozess haben, der 100 MB RAM verwendet, und es 10-mal gabeln. Jeder dieser gespaltenen Prozesse würde 100 MB RAM verbrauchen. Wenn Sie sich jedoch die Gesamtspeicherauslastung der Box ansehen, wird möglicherweise nur 130 MB RAM verbraucht (100 MB werden von den Prozessen gemeinsam genutzt, plus ein paar MB Overhead plus ein weiteres Dutzend MB oder zwei für den Rest des Systems).

Als letztes Beispiel habe ich momentan eine Box mit 30 laufenden Apache-Prozessen. Jeder Prozess belegt 22 MB RAM. Wenn ich jedoch free -m ausführe , um meine gesamte RAM-Auslastung anzuzeigen, erhalte ich:

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

Wie Sie sehen, verfügt diese Box nicht über genügend RAM, um 30 Prozesse auszuführen, die jeweils 18 MB "echten" RAM verwendeten. Wenn Ihnen nicht buchstäblich der Arbeitsspeicher ausgeht oder Ihre Apps stark wechseln, würde ich mir keine Sorgen machen.

UPDATE: Schauen Sie sich auch dieses Tool namens smem an , das von jldugger in der Antwort auf eine andere Frage zur Speichernutzung unter Linux hier erwähnt wurde .

Christopher Cashell
quelle
1
Mir geht buchstäblich der Arbeitsspeicher aus, also muss ich mir darüber Sorgen machen. Es kann jedoch auch sein, dass andere Prozesse den Arbeitsspeicher belegen und SA nicht so viel verwendet.
Tony Meyer
Meiner Beobachtung nach und mit dem Tool smem sieht es so aus, als würde Spamassassin ungefähr 50 MB RAM verbrauchen. Wenn Sie es in mehrere Prozesse aufteilen, wird fast der gesamte Speicher gemeinsam genutzt, sodass immer noch ungefähr 50 MB RAM verbraucht werden unter allen Prozessen, obwohl ps meldet, dass jeder einen RSS von 50 MB hat. YMMV.
Thomasrutter
1

Mit sa-compile können Sie möglicherweise die Übereinstimmungsgeschwindigkeit vieler Regeln verbessern.

David Schmitt
quelle
Entschuldigung, ich hätte in der Frage erwähnen sollen, dass ich sa-compile bereits verwende. Guter Vorschlag.
Tony Meyer
1

Folgendes habe ich getan.

Ich habe eine Einrichtung, in der viele Nachrichten ungefähr gleichzeitig zugestellt werden. Für eine Reihe von Experimenten führe ich SA für Nachrichten aus, die auf einen temporären Spool kopiert und dann alle fünf Minuten von einem Cron-Job zugestellt werden.

spamd Ich würde weiter drucken "Vielleicht sollten Sie den Parameter max-children erhöhen", und ich ließ ihn an einem Punkt auf 40 erhöhen, aber der Server verbrauchte all seinen Auslagerungsspeicher und stürzte ab.

Jetzt habe ich ein anderes Regime implementiert, bei dem die Zustellung durch eine Procmail-Sperrdatei gesteuert wird. Da dies einfach zu bewerkstelligen war, verwende ich nur die letzte Ziffer der Prozess-ID und starte mit 10 Kindern. Ich bin mir nicht sicher, ob dies optimal ist, aber es hat bereits dazu beigetragen, die wahnsinnigen Belastungsspitzen zu vermeiden, die ich von Zeit zu Zeit erlebt habe.

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

Außerdem starte ich spamdmit einigen ulimitEinschränkungen. Die Nummern wurden aus http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-masses entfernt, außer ich habe die ulimit -uEinschränkung aufgehoben. (Ich bin mir nicht sicher, was los ist. 32 ist auf jeden Fall viel zu klein. Mit so etwas wie 500 könnte ich spamdeine Weile weitermachen , aber irgendwann bis zum Limit.)

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

Ich schätze, ich werde mit Auslieferungsfehlern enden, wenn die Last für längere Zeit zu hoch ist, aber bisher scheint es mir gelungen zu sein, die Last auf ein handhabbares Maß zu reduzieren. und ein Haufen fehlgeschlagener Lieferungen ist immer noch viel besser, als wenn die Maschine keinen Swap mehr hat.

Tripleee
quelle
0

Hochlastdurchschnitte sind (manchmal) ein indirektes Symptom dafür, dass auf Ihrem Computer nicht genügend RAM zur Verfügung steht (und viele CPU-Auslagerungsprozesse vom virtuellen Speicher aus ausgeführt werden). Sie können also versuchen, Ihren Mailserver so zu konfigurieren, dass keine E-Mails über SpamAssassin weitergeleitet werden Lastmittelwerte sind zu hoch.

Sie erwähnen nicht, welchen MTA Sie ausführen, aber wenn Sie SA über eine Zugriffssteuerungsliste in exim4 aufrufen, ist der Vorschlag am Ende dieser Nachricht wirksam.

Außerdem können Sie die Belastung der Sicherheitszuordnung verringern und damit die Speichernutzung verringern, indem Sie andere, weniger ressourcenintensive Spam-Filtermethoden aktivieren (dh, sie verarbeiten Spam und lehnen ihn ab, bevor er die Sicherheitszuordnung erreicht). Zum Beispiel belegen Greylisting- und Absender-Überprüfungs-Callouts relativ wenig RAM.

David North
quelle
In einem ähnlichen Zusammenhang erwäge ich ernsthaft, SA zugunsten von dspam auf einigen meiner Server zu streichen, da dspam angeblich weniger RAM-hungrig ist.
David North
Als Mittelweg könnten Sie als ersten Schritt einen Bayes-Filter ausführen und nur für Nachrichten auf SpamAssassin zurückgreifen, für die der erste Filter kein eindeutiges Urteil ausgesprochen hat. Spammer wiederholen sich in der Regel häufig, sodass Sie wahrscheinlich die meisten Fälle ohne SpamAssassin bewältigen können, aber immer noch für neue Ausbrüche usw. zur Verfügung stehen
Tripleee,
0

Wir waren vor einigen Monaten in einer ähnlichen Situation. SpamAssassin und ClamAV verwendeten viel Speicher auf einem gehosteten Server. Wir hatten die Möglichkeit, dem Server mehr Speicher hinzuzufügen, aber die Umstellung auf Postini erwies sich als kostengünstiger und zeitsparender. YMMV.

Gerald Combs
quelle