Linux 系の各種アプリケーションのインストールメモやチューニング情報

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分程度と思います。

この記事を読んでいる方は、以下の関連記事も読んでいます。よろしければ一緒にご覧ください!

2006年5月 9日 | drk | コメント(8)  

コメント(8)

何度もすみません。以下コメントありがとうございます。
通常qmailの起動は、
/etc/rc.d/init.d/qmail start
ですが、上記にあるように、「/etc/init.d/qmail のサービスを停止しておく。」
ということは、/etc/rc.d/init.d/qmailは使わないということだと思うのですが、
今回の移行によって、qmailをstart又はrestartしたい場合、
どのように行ったらいいのでしょうか?
お手数ですがよろしくお願いいたします。

佐藤 さん
この記事の手順にしたがって順に作業を進めていけば切り替えることができると思います。起動スクリプトに関しては、ちょうど、
作業 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 の移行の際に
上記のような記述を行えばいいということでしょうか?

ご存じかもしれませんが、起動スクリプトから抜粋した以下の

/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 \

の間違いではないでしょうか?

watanabeさん>マイナスオプションで fsync されないという情報を初めて知りました。これは試したことがありません。一番簡単にioを減らすならマイナスオプションが良いような気がします。

なにせ、移行作業は検証作業とかいろいろと面倒ですからね。

実際どの程度高速化するかを検証する必要はありますね。暇を見つけてやってみたいと思います。

ふと思ったのですが、syslogdの設定でたとえば
mail.* -/var/log/maillog ("-"がポイント)
のようにするとfsync()されなくなってio負荷が減る(らしい)んですが、
それでもやっぱりsyslogdは見捨てるほうがいいんでしょうか。

ゆうすけさん>初めまして。いつも参考になるプログラムが更改されていくのを楽しみに見ています。

multilog いいですね。結構高速です。その他にもいろいろとログはき出すヤツありますが、未検証です。qmailって結構はまるんですよね。そろそろPostfix使った方がいいかなぁ〜とおもう今日この頃です。

確かに、qmail でメール数が尋常に増えたりすると、ログの書き込みだけで処理が遅くなりますね! ログの影響で、余計にメールの処理が遅くなって、さらにメール数が溜まってしまう悪循環になりえます。
※ syslog でなくて multilog を使ってるわけですね。

コメントする

CONTACTご相談・お問い合わせ

drk7.jpでは、小規模な CGI 開発から技術支援まで幅広くご相談にのります。

ご相談・お問い合わせはこちら からお気軽にどうぞ。

ページのTOPへ

Copyright © drk7.jp, All Rights Reserved.