SpamAssassin(spamd)のメモリ使用を最小限に抑える方法


15

DebianでSpamAssassin(Pyzor、AWLおよびBayesが無効、sa-compileが有効なデフォルト構成)を使用しており、spamd子プロセスはそれぞれ32で約100〜150MB(実メモリ約50MB)を消費します。ビットサーバー、および64ビットサーバーではこれの約2倍(論理的には十分)です。一般に2つの子プロセスがありますが、混雑時には5(最大)が実行される可能性があります。

ISTMでは、200〜600MBがこのタスクの多くのメモリであるとしています。フィルター構造の一部としてSAを引き続き使用したいのですが、それほど多くのメモリを正当化することが難しくなっています。

各子プロセスが使用するメモリの量を減らす方法はありますか?(あるいは、単一の子プロセスを非常に高速にして、最大の子を2のような値に設定できるようにしますか?)。精度が低下する、または低下する可能性のあるオプションを含め、すべてのオプションを検討します。

私はすでにSA wikiの「メモリ不足の問題」ページを読みました。何の役にも立ちません。5 MBを超えるメッセージはSAでスキャンされません。


1
フォークされた子は、psまたはtop showの合計よりもはるかに少ない物理RAMを使用する場合があることに注意してください。これは、フォーク時のコピーオンライト戦略によるものです。
デビッドシュミット

回答:


5

Linuxがメモリ使用量を報告する方法を誤解していると思います。プロセスが分岐すると、2番目のプロセスが元のプロセスと多くのリソースを共有します。それにはメモリが含まれます。ただし、Linuxはこのためにコピーオンライト(COW)と呼ばれる手法を使用します。つまり、各フォークされた子プロセスは、メモリ内の元のプロセスと同じデータを参照しますが、そのデータが(子または親によって)変更されるたびに、変更はコピーされてから新しい場所を指すだけです。

プロセスの1つがそのデータに変更を加えるまで、それらは同じコピーを共有しています。その結果、100MBのRAMを使用するプロセスを作成し、10回フォークすることができました。これらのフォークされたプロセスのそれぞれは100MBのRAMが使用されていることを示しますが、ボックスの全体的なメモリ使用量を見ると、130MBのRAMが使用されていることしか表示されない場合があります(プロセス間で100MBが共有され、オーバーヘッドが数MB 、さらに残りのシステム用にさらに1ダースまたは2メガバイト)。

最後の例として、現在30のApacheプロセスが実行されているボックスがあります。各プロセスは、22MBのRAMの使用量を示しています。しかし、全体のRAM使用量を表示するためにfree -mを実行すると、次のようになります:

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

ご覧のとおり、このボックスには、それぞれ18MBの「実際の」RAMを使用していた30個のプロセスを実行するのに十分なRAMさえありません。あなたが文字通りRAMを使い果たしているか、アプリがひどくスワップしていない限り、私は何も心配しません。

更新:また、smemというこのツールをチェックしてください。jlduggerが、Linuxのメモリ使用量に関する別の質問への回答で言及しています


1
私は文字通りRAMを使い果たしているので、心配する必要があります。ただし、RAMを消費しているのは他のプロセスであり、SAはあまり使用していない可能性があります。
トニーマイヤー

私の観察とツールsmemの使用から、spamassassinは約50 MBのRAMを使用しているように見えます。複数のプロセスにフォークすると、メモリのほとんどすべてが共有メモリであるため、合計で約50 MBのRAMを使用しますpsが各プロセスのRSSが50 MBであると報告しても、すべてのプロセスの中で。YMMV。
thomasrutter


1

これが私がやったことです。

多くのメッセージがほぼ同時に配信される傾向があるセットアップがあります。一連の実験では、一時スプールにコピーされ、cronジョブによって5分ごとに配信されるメッセージに対してSAを実行します。

spamd 「max-childrenパラメーターを増やす必要があるかもしれません」と印刷を続け、一度に最大40に上げましたが、サーバーがすべてのスワップスペースを消費してクラッシュしました。

現在、配信がProcmailロックファイルによって管理されている別の体制を実装しています。簡単だったので、プロセスIDの最後の数字を使用し、10人の子で実行しました。これが最適であるかどうかはまったくわかりませんが、これは経験によって時々経験する極悪な負荷ピークを回避するのに役立ちました。

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

さらに、私spamdはいくつかのulimit制限から始めます。制限を取り除いた以外は、http://svn.apache.org/repos/asf/spamassassin/trunk/contrib/run-massesから数字を取り出しましたulimit -u。(何が起こっているのかわからない。どんな場合でも32は小さすぎる。500のようなものでspamdしばらく走り続けることができたが、最終的には限界に達する。)

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

負荷が長時間にわたって高すぎると、配信に失敗することになると思いますが、これまでのところ、これで管理可能なレベルまで負荷を減らすことができたようです。そして、失敗した配信の束は、スワップが不足しているマシンよりもはるかに優れています。


0

高負荷平均は(場合によって)マシンがRAMを使い果たしている(および仮想メモリとの間でCPUスワッピングプロセスを大量に使用している)間接的な症状であるため、メールサーバーが負荷平均が高すぎます。

実行しているMTAについては言及しませんが、exim4のアクセス制御リストからSAを呼び出している場合は、このメッセージの下部にある提案が有効です。

また、SAにかかる負荷を軽減し、リソース消費量の少ない他のスパムフィルタリングメソッドをSAの前に配置することにより、メモリ使用量を削減できます(つまり、SAに到達する前に一部のスパムを処理および拒否します)-たとえば、グレーリストと送信者は、コールアウトが比較的少ないRAMを使用することを確認します。


関連するノートでは、実行中の2つのサーバーでdspamを優先するようにSAを廃止することを真剣に検討しています。
デビッドノース

妥協点として、最初のステップとしてベイジアンフィルターを実行し、最初のフィルターで明確な判定が得られなかったメッセージに対してのみSpamAssassinにフォールバックできます。スパマーは、などの新しい流行のためにそれが可能なあなたはおそらくのSpamAssassinのない大多数のケースを扱うことができるように自分自身に多くのことを繰り返し、まだ持っている傾向がある
tripleee

0

私たちは数ヶ月前に同様の状況にありました。SpamAssassinとClamAVは、ホストされたサーバーで大量のメモリを使用していました。サーバーにメモリを追加するオプションがありましたが、Postiniに切り替える方が費用と時間の効率が高いことがわかりました。YMMV。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.