qmail の配信能力を極限まで引き出す方法(ログ関連)
「syslog は I/O 負荷が高い → daemontool に移行しよう!」でも書きましたが、メール配信サービスのような用途の場合、メールサーバの配信ログってのは極めて重要。qmail の配信能力を極限まで引き出すには、様々なチューニングの中でも重要なのがログの出力。
そこで思いついたのがログの出力を RAMディスク上に出力するって方法。もちろんログの出力は daemontool 経由で。
もちろん出力したログは日時バッチでローカルディスク上にバックアップログとして保存。OS フリーズ等でメモリ上のログが失われるって可能性は許容するって要件で構築。
実際に業務で採用して速度の計測をしていたところ、
net-qmail ベースにいろいろな patch を適用したSW環境で、
1万配信/5分 程度の過去最高値を計測しました!
以下作業メモ。メール配信が遅くて困ってる!って方は参考にしてみては如何でしょうか?
※RHEL 系列での動作確認をしております。
ramdisk にマウントポイント作成
/etc/fstab に以下を追加/dev/shm /ram tmpfs defaults 0 0
/etc/rc.sysinit 起動時スクリプトで RAM ディスク上にディレクトリを作成
/etc/rc.sysinit に以下を追加mkdir -p /ram/log/qmail mkdir /ram/log/qmail/pop3d mkdir /ram/log/qmail/smtpd chown -R qmaill:nofiles /ram/log/qmail chmod -R 777 /ram/log/qmail
qmailのログ出力先を daemontool 経由の RAMディスクに変更
/var/qmail/services/qmail/log/run のログ設定を以下のように変更exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s16777215 n10 /ram/log/qmail
/var/qmail/services/smtpd/log/run のログ設定を以下のように変更
exec /usr/local/bin/setuidgid qmails /usr/local/bin/multilog t s16777215 n10 /ram/log/qmail/smtpd
/var/qmail/services/pop3d/run のログ設定を以下のように変更
exec /usr/local/bin/setuidgid dnscache /usr/local/bin/multilog t s16777215 n10 /ram/log/dnscache
/ram/log/qmail 上のログを/var/log/qmail にバックアップする cron スクリプト作成
/var/qmail/DumpMailLog.sh を作成echo ' #! /bin/sh source /etc/bashrc cp -rf /ram/log/qmail /var/log/ ' > /var/qmail/DumpMailLog.sh chown qmaill:nofiles /var/qmail/DumpMailLog.sh chmod 755 /var/qmail/DumpMailLog.sh
後は適当な時間にこのスクリプトを実行させればOK。
crontab -e 30 5 * * * /var/qmail/DumpMailLog.sh
今回はメール配信専用のサーバとして新規に1台たてて上記設定を行ったので、/dev/shm 上に RAM ディスクを作成しても /dev/shm の使われ方をあまり気にする必要が無かったのですが、複数のミドルウェアを入れている場合には、容量が動的に変化する /dev/shm を使うこの方法は注意が必要です。
大量のメール配信時に top でリソースの状態を観測していましたが、iowait の値は多くて 1 くらい。殆どのリソースを cpu に使っている状況で、極めて効率的にかつ最大限マシンのリソースを使っているように見えました。実際、
tail -f ram/log/qmail/current
でログを見ていると、見たこともない速度でログの書き込みがされてます。流石 RAM ディスク。って思いました。今後も専用ミドルウェアには積極的にログを RAM 上にを実験していきたいと思ってます。
最後に、思いつきを実装に落としてくれた同僚の kuma さん。お疲れ様でした。
コメントやシェアをお願いします!
今更な話ですみません。
Postfix 2.3 で /var/spool/postfix を tmpfs にしてみました。
smtpstone で計測すると、10万通送信するのに6分48秒でした。
245通/秒 ってところですか。
注:CPU:2.6GHz DualOpteron×2、Memory:4GB
でも、spoolが tmpfs ってどうなんだろう。。。ちょっと微妙。
Bar
どっちかっていうと、qmailはメールをqueueで処理している部分でいちばん負荷がかかるような気がするんですけど、そこらへんはどうなんでっしゃろ?