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 項をみる。ちょろっと情報が記載されています。
7.7. How do I avoid syslog? It chews up a lot of CPU time and isn't reliable.
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分程度と思います。

- スポンサーリンク -