[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:43332] exim と spamassassin の負荷制御



佐野@浜松です。御無沙汰してます。

常時サーバーを起動させている方にはあまり関係ないかもしれない
ですし、マニュアルやらドキュメントやらをちょっと探せば書いて
あることなので、今さらかもしれませんが。

Crusoe 600MHz、メモリ 176MB なノート PC で一日一回程度、
仕事が終って帰宅してから起動してネットワークに接続して
メールの受信、とかしていると、まる一日読まずに溜まっていた
ぶんを一度にプロバイダのサーバーから引き出すので、300通〜
500通、ちょっと出かけていて 2〜3日溜まると 1000通くらいに
なることも珍しくない、という環境での話です。

去年の 4 月までは 28.8k なアナログモデム接続だったので、
ネットワークの通信速度がボトルネックになってそれほど
ひどくはなかったのですが、ようやく高速回線にしようと
 B フレッツ (マンションタイプですが) に乗り換えて、
やれ嬉しや、これで処理が速くなるぞ、とメールを受信すると、
なぜかシステムの負荷がやたらと上がって kterm が落ちる
 emacs が落ちる 果ては X が落ちる、という状態になりました。

毎日ネットワークに接続してから、溜まったメールの処理が
終わるまで他のことがなにもできない状態になっていたので
なんだろうなぁと思いつつ、面倒でしばらくそのままにして
いたのですが、1〜2ヶ月ほど経った頃にさすがに嫌になって
某所で愚痴ってみたところ、MTA に負荷制御のオプションが
あるはず、と教えてもらい、そこでようやく exim の資料を
調べてみる気になりました。

とりあえずは /usr/share/doc/exim4 以下を眺めるわけですが、
ファイルがたくさんあってひとつひとつ調べると時間がいくら
あっても足りなそうです。

そこで、負荷制御だからどうせ max とか limit とかの単語が
ついているだろう、と検討をつけて zgrep -i max *.gz で
検索してみると、 OptionLists.txt.gz というファイルに
なにやらそれらしきものが出ている様子。

で、実際に OptionLists.txt.gz を見ていると、option の
名前とタイプ、デフォルト値などはリストされていますが、
その意味とか働きなどが書かれていない。

しかたがないのでもう一度検索結果を眺めてみると、spec.txt.gz
というファイルにもなにかありそう。

そこで spec.txt.gz を眺めてみると、ありました。
"14.10 Resource control" これがどうやら関係してそうです。
このファイルには各オプションについての説明もあり、これを
見るといろいろわかりました。

で、結局、
 /etc/exim4/conf.d/main/99_exim4-config_localoptions
というファイルに

# no immediate delivery at all
queue_only = true

# comment_out # no immediate delivery if load high
# queue_only_load = 2.0

# allow command line to override
queue_only_override = false

# order in arrival
queue_run_in_order = true

# maixmum number of simultaneous queue runners
queue_run_max = 50

# no queue deliveries if load high
deliver_queue_load_max = 4.0

というオプションを付けてある程度マシになりました。

なお spec.txt.gz の remote_max_parallel のところには

    This option controls only the maximum number of parallel deliveries for
    one message in one Exim delivery process. Because Exim has no central
    queue manager, there is no way of controlling the total number of
    simultaneous deliveries if the configuration allows a delivery attempt as
    soon as a message is received. If you want to control the total number of
    deliveries on the system, you need to set the "queue_only" option. This
    ensures that all incoming messages are added to the queue without starting
    a delivery process. Then set up an Exim daemon to start queue runner
    processes at appropriate intervals (probably fairly often, for example,
    every minute), and limit the total number of queue runners by setting the
    "queue_run_max" parameter. Because each queue runner delivers only one
    message at a time, the maximum number of deliveries that can then take
 
という記載があり、queue_run_max だけ指定した場合、メッセージが
到着した際に queue を経由せずにそのまま配送されてしまうことが
あり queue_run_max だけでは制限がうまく効かないようです。

# 単に負荷制御だけなら queue_run_in_order = true とか
#  queue_only = true とかを使わずに queue_only_load と
#  queue_run_max / deliver_queue_load_max を組み合わせれば
# ある程度効果があると思いますが、受信したメールの順序が
# 逆転していると気分が悪いのでこのへんは好みです。

これでとりあえず X が落ちたり Emacs が落ちたりするようなことは
無くなったので、それからしばらくの間は使えていたのですが、
すこし前にまたメールの受信時にメモリー不足で Emacs や X が落ちたり
反応が非常に遅くなったりするようになりました。

で、今度は何が原因だろうといろいろ調べてたんですが、
結局 spamassassin のせいだったみたいです。

3.0.0 から spamd が最初に child を prefork するようになったという
説明を読んで、念のために child の同時起動数をデフォルトの 5 から
 3 に減らしてはあったのですが、ある時 top で確認したら 1 つの
 child が 40% 以上使っていました。これを見て、そりゃぁ 3 つも
起動すればメモリーが枯渇するなぁと思いました。

で、またまた資料を漁って、今は /etc/default/spamassassin で
OPTIONS に --max-children=2 と --max-conn-per-child=100 を追加し、
NICE="--nicelevel 19" としてあります。

--max-conn-per-chile のデフォルト値は 200 となっていたので
半分にして spamd child ひとつあたりのメモリー使用量を減らし、
さらに child を 2 つまでとしてトータルでの使用量も制限して
います。

これでまた、メールの処理が終わるまで X を起動せずに kon で
待っている必要も無くなり、まともに使えるようになりました。

あんまり他の人の参考にはならないかもしれませんが、
 exim や spamassassin と負荷制御をキーに ML 検索しても
関連するメールが見あたらなかったので、備忘録代わりに
投稿しておきます。

--
   # わたしのおうちは浜松市、アカウミガメもやってくる
    <kgh12351@xxxxxxxxx> : Taketoshi Sano (佐野 武俊)

Attachment: pgp4dFZCIvnt8.pgp
Description: PGP signature