qmail の配信能力を極限まで引き出す方法(ログ関連)

syslog は I/O 負荷が高い → daemontool に移行しよう!」でも書きましたが、メール配信サービスのような用途の場合、メールサーバの配信ログってのは極めて重要。qmail の配信能力を極限まで引き出すには、様々なチューニングの中でも重要なのがログの出力。

そこで思いついたのがログの出力を RAMディスク上に出力するって方法。もちろんログの出力は daemontool 経由で。

もちろん出力したログは日時バッチでローカルディスク上にバックアップログとして保存。OS フリーズ等でメモリ上のログが失われるって可能性は許容するって要件で構築。

実際に業務で採用して速度の計測をしていたところ、

Intel(R) Xeon(TM) CPU 3.06GHz × 2、 メモリ4G (うち、RAMディスクは2G) なHW環境、
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 さん。お疲れ様でした。

- スポンサーリンク -