syslog は I/O 負荷が高い → daemontool に移行しよう!
最近、とある用途のマシンを RedHat 7.x のサーバから RHEL 3.0 UP7 のマシンへ移行したら、同じ構成にもかかわらず syslog の負荷が異様に高いことが判明しました。原因を調べるよりも daemontool を使ってロギングする方法を採用することで、まずは結果を出すっでこと優先で実施しました。
今回の syslog の負荷が高い件は、qmail のログを info レベル(意図的に info )でデータを取得しているため、/var/log/maillog への iowait が多発しているといったものです。
※早い話、メールサーバのメールログの出力が遅いって事。
で、syslog から daemontool へ変更した結果、top で監視したところ、iowait が 50 %超→15 %前後まで軽減されました。
iowait が発生すると、OS が swap しているときと同じように、OS 全体のパフォーマンスが異様に低下するので、今回の syslog →daemontool はいろいろなところで応用が利くチューニングの1つです。
qmail のログを daemontool 経由にする方法
まずは、qmail 1.03 内の FAQ テキストの 7.7 項をみる。ちょろっと情報が記載されています。Answer: Install daemontools (http://pobox.com/~djb/daemontools.html). Make a /var/log/qmail directory, owned by qmaill, mode 2700. Do
qmail-start ./Mailbox /usr/local/bin/accustamp \ | setuser qmaill /usr/local/bin/cyclog /var/log/qmail &
in /var/qmail/rc.
If you are logging tcpserver connections, make a /var/log/smtpd directory, and use cyclog /var/log/smtpd for tcpserver. You shouldn't run several copies of cyclog with the same log directory.
By default, cyclog keeps 10 automatically rotated log files, each containing up to 100KB of log data. To keep 20 files with 1MB each, use cyclog -s 1000000 -n 20.
日本語での情報は「daemontoolsによるロギングとプロセス監視(1/3)」に詳しく解説があります。ほぼそのまま従って作業すれば何の問題もなし。以下は備忘録。
作業 1. daemontool をインストールします
何も考えず、以下のスクリプトをコピペして実行すればOKです。daemontool が適切にインストールされます。 ※RedHat系で動作確認しています。cd /usr/local/src mkdir -p /package chmod 1755 /package wget http://tools.qmail.jp/daemontools/daemontools-0.76.tar.gz tar -xvzf daemontools-0.76.tar.gz cd admin/daemontools-0.76 wget http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch patch -p1 < ./daemontools-0.76.errno.patch package/install kill -HUP 1
念のため、インストール後の確認。/etc/inittab の最後が以下のように追記されていることを確認。
SV:123456:respawn:/usr/local/bin/svscanboot
次に、daemontool の動作確認。以下のコマンドを実行する。例のように date 値が変換できればOK。
date | tai64n | tai64nlocal 結果の例→ 2006-05-09 11:22:49.024150500 2006年 5月 9日 火曜日 11:22:49 JST
ついでに、/command ディレクトリを見ておく。
ll /command lrwxrwxrwx 1 root root 41 5月 9 11:21 envdir -> /package/admin/daemontools/command/envdir lrwxrwxrwx 1 root root 44 5月 9 11:21 envuidgid -> /package/admin/daemontools/command/envuidgid lrwxrwxrwx 1 root root 41 5月 9 11:21 fghack -> /package/admin/daemontools/command/fghack lrwxrwxrwx 1 root root 43 5月 9 11:21 multilog -> /package/admin/daemontools/command/multilog lrwxrwxrwx 1 root root 43 5月 9 11:21 pgrphack -> /package/admin/daemontools/command/pgrphack lrwxrwxrwx 1 root root 48 5月 9 11:21 readproctitle -> /package/admin/daemontools/command/readproctitle lrwxrwxrwx 1 root root 42 5月 9 11:21 setlock -> /package/admin/daemontools/command/setlock lrwxrwxrwx 1 root root 44 5月 9 11:21 setuidgid -> /package/admin/daemontools/command/setuidgid lrwxrwxrwx 1 root root 44 5月 9 11:21 softlimit -> /package/admin/daemontools/command/softlimit lrwxrwxrwx 1 root root 44 5月 9 11:21 supervise -> /package/admin/daemontools/command/supervise lrwxrwxrwx 1 root root 38 5月 9 11:21 svc -> /package/admin/daemontools/command/svc lrwxrwxrwx 1 root root 39 5月 9 11:21 svok -> /package/admin/daemontools/command/svok lrwxrwxrwx 1 root root 41 5月 9 11:21 svscan -> /package/admin/daemontools/command/svscan lrwxrwxrwx 1 root root 45 5月 9 11:21 svscanboot -> /package/admin/daemontools/command/svscanboot lrwxrwxrwx 1 root root 41 5月 9 11:21 svstat -> /package/admin/daemontools/command/svstat lrwxrwxrwx 1 root root 41 5月 9 11:21 tai64n -> /package/admin/daemontools/command/tai64n lrwxrwxrwx 1 root root 46 5月 9 11:21 tai64nlocal -> /package/admin/daemontools/command/tai64nlocal
作業 2. qmail rc起動スクリプトからの移行の前に...
通常の syslog を使う場合の qmail の起動スクリプト /var/qmail/rc もしくは /etc/init.d/qmail で下記のような記述があると思います。※多少は設定が違うと思いますが・・・case "$1" in start) echo -n "Starting qmaild: " /usr/local/bin/tcpserver -H -R -x /home/vpopmail/etc/tcp.smtp.cdb \ -c 100 -u qmaild -g nofiles 0 smtp \ /var/qmail/bin/qmail-smtpd 2>&1 \ /var/qmail/bin/splogger smtpd & /usr/local/bin/tcpserver -R 0 pop3 \ /var/qmail/bin/qmail-popup drk7.jp \ /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1 \ /var/qmail/bin/splogger pop3d & /var/qmail/rc &
それぞれ以下のような意味を持っています。これらを全て /service に登録して、svscan で管理するよう変更します。
(青). qmail-smtpd の起動
(緑). qmail-pop3d の起動
(赤). /var/qmail/rc の起動
作業 3. /var/qmail/rc の移行
何も考えず、以下のスクリプトをコピペして実行すればOKです。/var/qmail/rc 起動が変更されます。 owner が qmaill:nofiles と違う場合は適宜変更下さい。mkdir /var/qmail/services mkdir /var/qmail/services/qmail mkdir /var/qmail/services/qmail/log chmod +t /var/qmail/services/qmail echo '#!/bin/sh PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin exec /var/qmail/rc ' > /var/qmail/services/qmail/run echo '#!/bin/sh exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s16777215 n10 /var/log/qmail ' > /var/qmail/services/qmail/log/run chmod +x /var/qmail/services/qmail/run chmod +x /var/qmail/services/qmail/log/run cp /var/qmail/rc /var/qmail/rc.bk echo '#!/bin/sh exec env - PATH="/var/qmail/bin:$PATH" qmail-start ./Maildir/ '> /var/qmail/rc chmod 755 /var/qmail/rc mkdir /var/log/qmail chown qmaill:nofiles /var/log/qmail chmod 777 /var/log/qmail ln -s /var/qmail/services/qmail /service/qmail
これで、既に qmail が svscan 経由で起動されていると思います。念のため確認。
ln -s /var/qmail/services/qmail /service/qmail ps -aef | grep qmail root 8456 1761 0 12:14 ? 00:00:00 supervise qmail root 8456 1761 0 12:14 ? 00:00:00 supervise qmail qmails 8458 8456 0 12:14 ? 00:00:00 qmail-send root 8459 8458 0 12:14 ? 00:00:00 qmail-lspawn ./Maildir/ qmailr 8460 8458 0 12:14 ? 00:00:00 qmail-rspawn qmailq 8462 8458 0 12:14 ? 00:00:00 qmail-clean qmaill 8598 8457 0 12:15 ? 00:00:00 [multilog] root 8600 8364 0 12:15 pts/2 00:00:00 grep qmail
作業 4. qmail-smtpd の移行
何も考えず、以下のスクリプトをコピペして実行すればOKです。/var/qmail/rc 起動が変更されます。 qmail-smtpd の設定や owner が qmaild:nofiles と違う場合は適宜変更下さい。mkdir /var/qmail/services/smtpd mkdir /var/qmail/services/smtpd/log chmod +t /var/qmail/services/smtpd echo '#!/bin/sh PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin exec tcpserver -H -R -x /home/vpopmail/etc/tcp.smtp.cdb \ -c 100 -u qmaild -g nofiles 0 smtp \ /var/qmail/bin/qmail-smtpd 2>&1 ' > /var/qmail/services/smtpd/run echo '#!/bin/sh exec /usr/local/bin/setuidgid qmails /usr/local/bin/multilog t s16777215 n10 /var/log/qmail/smtpd '> /var/qmail/services/smtpd/log/run chmod +x /var/qmail/services/smtpd/run chmod +x /var/qmail/services/smtpd/log/run mkdir /var/log/qmail/smtpd chown qmails:nofiles /var/log/qmail/smtpd chmod 777 /var/log/qmail/smtpd ln -s /var/qmail/services/smtpd /service/smtpd
これで、既に qmail-smtpd が svscan 経由で起動されていると思います。念のため確認。
ps -aef | grep qmail root 8456 1761 0 12:14 ? 00:00:00 supervise qmail qmails 9582 8456 0 12:24 ? 00:00:00 qmail-send root 9583 9582 0 12:24 ? 00:00:00 qmail-lspawn ./Maildir/ qmailr 9584 9582 0 12:24 ? 00:00:00 qmail-rspawn qmailq 9585 9582 0 12:24 ? 00:00:00 qmail-clean root 10124 10122 0 12:30 ? 00:00:00 /usr/local/bin/tcpserver -H -R -x /home/vpopmail/etc/tcp.smtp.cdb -c 100 -u qmaild -g nofiles 0 smtp /var/qmail/bin/qmail-smtpd qmails 10125 10123 0 12:30 ? 00:00:00 /usr/local/bin/multilog t 100000000 n10 /var/log/qmail/smtpd qmaill 10147 8457 0 12:30 ? 00:00:00 [multilog] root 10150 8364 0 12:30 pts/2 00:00:00 grep qmail
作業 4. qmail-pop3d の移行
ドメイン名など設定は適宜変更した後、何も考えず、以下のスクリプトをコピペして実行すればOKです。/var/qmail/rc 起動が変更されます。mkdir /var/qmail/services/pop3d mkdir /var/qmail/services/pop3d/log chmod +t /var/qmail/services/pop3d echo '#!/bin/sh PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin exec tcpserver -R 0 pop3 \ /var/qmail/bin/qmail-popup drk7.jp \ /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1 ' > /var/qmail/services/pop3d/run echo '#!/bin/sh exec /usr/local/bin/setuidgid qmailp /usr/local/bin/multilog t s16777215 n10 /var/log/qmail/pop3d '> /var/qmail/services/pop3d/log/run chmod +x /var/qmail/services/pop3d/run chmod +x /var/qmail/services/pop3d/log/run mkdir /var/log/qmail/pop3d chown qmailp:nofiles /var/log/qmail/pop3d chmod 777 /var/log/qmail/pop3d ln -s /var/qmail/services/pop3d /service/pop3d
これで、既に qmail-pop3d が svscan 経由で起動されていると思います。念のため確認。
ps -aef | grep qmail root 20756 1879 0 12:53 ? 00:00:00 supervise qmail root 10124 10122 0 12:30 ? 00:00:00 /usr/local/bin/tcpserver -H -R -x /home/vpopmail/etc/tcp.smtp.cdb -c 100 -u qmaild -g nofiles 0 smtp /var/qmail/bin/qmail-smtpd root 20847 20846 0 12:53 ? 00:00:00 /usr/local/bin/tcpserver -R 0 pop3 /var/qmail/bin/qmail-popup drk7.jp /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir qmails 20916 20756 0 12:54 ? 00:00:01 qmail-send root 20917 20916 0 12:54 ? 00:00:00 qmail-lspawn ./Maildir/ qmailr 20918 20916 0 12:54 ? 00:00:00 qmail-rspawn qmailq 20919 20916 0 12:54 ? 00:00:00 qmail-clean qmails 3657 20815 0 14:14 ? 00:00:00 /usr/local/bin/multilog t s16777215 n10 /var/log/qmail/smtpd qmailp 3660 20848 0 14:14 ? 00:00:00 /usr/local/bin/multilog t s16777215 n10 /var/log/qmail/pop3d qmaill 3937 20759 0 14:15 ? 00:00:00 /usr/local/bin/multilog t s16777215 n10 /var/log/qmail
これで、一通りの移行が済んだので、/etc/init.d/qmail のサービスを停止しておく。
chkconfig --level 012345 qmail off
ついでに、サービスの起動状況も確認しておく。以下のように起動時間が 0 以上なら大丈夫です。
svstat /service/*/log /service/qmail: up (pid 1111) 20 seconds /service/smtpd: up (pid 2222) 30 seconds /service/pop3d: up (pid 3333) 40 seconds
以上で移行作業完了です。/var/log/qmail/current に /var/log/maillog とほぼ同等のログが syslog より遙かに軽い処理で取りこぼしなくロギングされるようになります。
なお、date 型が TAI64N 形式なので、data 値を見やすく変換してやるには、
cat /var/log/qmail/current | tai64nlocal
でOKです。後はメールログを元に処理しているプログラムがあれば、それをちょっと修正すれば移行は完全に終了です。
記事にしてみると、非常に長くて超大変そうに見えるけど、移行作業は10分程度と思います。
コメントやシェアをお願いします!
佐藤
何度もすみません。以下コメントありがとうございます。
通常qmailの起動は、
/etc/rc.d/init.d/qmail start
ですが、上記にあるように、「/etc/init.d/qmail のサービスを停止しておく。」
ということは、/etc/rc.d/init.d/qmailは使わないということだと思うのですが、
今回の移行によって、qmailをstart又はrestartしたい場合、
どのように行ったらいいのでしょうか?
お手数ですがよろしくお願いいたします。
drk
佐藤 さん
この記事の手順にしたがって順に作業を進めていけば切り替えることができると思います。起動スクリプトに関しては、ちょうど、
作業 4. qmail-smtpd の移行
作業 4. qmail-pop3d の移行
の部分の tcpserver 部分を書き換えるイメージです。
と書きつつ亀レスでもうしわけありません。もう解決されてますよね?
佐藤
現在vpopmailを利用していて、qmailの起動をスクリプトを書いて、
/etc/rc.d/init.d/qmail start
で起動していますが、今回のような設定を行った場合、起動方法やrestart方法は
どのように行えばいいのでしょうか?
また、現在起動スクリプトは、
# SMTP
tcpserver -qv -l0 -HR -u `id -u vpopmail` -g `id -g vpopmail` \
-x /home/vpopmail/etc/tcp.smtp.cdb 0 smtp \
qmail-smtpd `hostname` /home/vpopmail/bin/vchkpw /bin/true 2>&1|\
splogger smtp &
# POP3
tcpserver -qvRH -u `id -u vpopmail` -g `id -g vpopmail` \
0 pop3 qmail-popup `hostname` /home/vpopmail/bin/vchkpw \
qmail-pop3d Maildir 2>&1 | splogger pop3 &
のように記述してるのですが、qmail-smtpd の移行やqmail-pop3d の移行の際に
上記のような記述を行えばいいということでしょうか?
suezo
ご存じかもしれませんが、起動スクリプトから抜粋した以下の
/usr/local/bin/tcpserver -H -R -x /home/vpopmail/etc/tcp.smtp.cdb \
-c 100 -u qmaild -g nofiles 0 smtp \
/var/qmail/bin/qmail-smtpd 2>&1 \
真ん中の行は
-c 100 -u (qmaild の UID) -g (nofiles の GID) 0 smtp \
の間違いではないでしょうか?
drk
watanabeさん>マイナスオプションで fsync されないという情報を初めて知りました。これは試したことがありません。一番簡単にioを減らすならマイナスオプションが良いような気がします。
なにせ、移行作業は検証作業とかいろいろと面倒ですからね。
実際どの程度高速化するかを検証する必要はありますね。暇を見つけてやってみたいと思います。
watanabe
ふと思ったのですが、syslogdの設定でたとえば
mail.* -/var/log/maillog ("-"がポイント)
のようにするとfsync()されなくなってio負荷が減る(らしい)んですが、
それでもやっぱりsyslogdは見捨てるほうがいいんでしょうか。
drk
ゆうすけさん>初めまして。いつも参考になるプログラムが更改されていくのを楽しみに見ています。
multilog いいですね。結構高速です。その他にもいろいろとログはき出すヤツありますが、未検証です。qmailって結構はまるんですよね。そろそろPostfix使った方がいいかなぁ〜とおもう今日この頃です。
ゆうすけ
確かに、qmail でメール数が尋常に増えたりすると、ログの書き込みだけで処理が遅くなりますね! ログの影響で、余計にメールの処理が遅くなって、さらにメール数が溜まってしまう悪循環になりえます。
※ syslog でなくて multilog を使ってるわけですね。