syslog と multilog の I/O負荷の差を調査
what
http://neta.ywcafe.net/000582.html
現在、大量メール配信サーバの I/O 負荷が高い問題があり、上記の記事をきっかけに、実際に syslog と multilog で I/O 負荷が違うのか見てみた。I/O負荷が高いのは、おそらく /var/log/maillogへの書き込みに負荷がかかっているものと思われる。
実験環境
coLinux on CentOS 5.1(セットアップ方法はこちら) に qmail をインストールして、ユーザ admin を作成します。絵で見ると以下のような構成です。
OS | Windows XP Professional Version 2002 Service Pack 3 |
CPU | ADM Athlon(tm) 64 X2 Dual Core Proccessor 3600+ 190 GHz |
メモリ | 2.00 GB RAM |
coLinuxに割り当てたメモリ | 768 MB |
qmailバージョン | 1.03 |
qmail の設定
# /var/qmail/bin/qmail-showctl qmail home directory: /var/qmail. user-ext delimiter: -. paternalism (in decimal): 2. silent concurrency limit: 509. subdirectory split: 23. user ids: 502, 503, 504, 0, 505, 506, 507, 508. group ids: 502, 503. badmailfrom: (Default.) Any MAIL FROM is allowed. bouncefrom: (Default.) Bounce user name is MAILER-DAEMON. bouncehost: (Default.) Bounce host name is dev_pv_web. concurrencylocal: Local concurrency is 120. concurrencyremote: Remote concurrency is 120. databytes: (Default.) SMTP DATA limit is 0 bytes. defaultdomain: Default domain name is dev_pv_web. defaulthost: (Default.) Default host name is dev_pv_web. doublebouncehost: (Default.) 2B recipient host: dev_pv_web. doublebounceto: (Default.) 2B recipient user: postmaster. envnoathost: (Default.) Presumed domain name is dev_pv_web. helohost: (Default.) SMTP client HELO host name is dev_pv_web. idhost: (Default.) Message-ID host name is dev_pv_web. localiphost: (Default.) Local IP address becomes dev_pv_web. locals: Messages for dev_pv_web are delivered locally. me: My name is dev_pv_web. percenthack: (Default.) The percent hack is not allowed. plusdomain: Plus domain name is dev_pv_web. qmqpservers: (Default.) No QMQP servers. queuelifetime: (Default.) Message lifetime in the queue is 604800 seconds. rcpthosts: SMTP clients may send messages to recipients at dev_pv_web. morercpthosts: (Default.) No effect. morercpthosts.cdb: (Default.) No effect. smtpgreeting: (Default.) SMTP greeting: 220 dev_pv_web. smtproutes: (Default.) No artificial SMTP routes. timeoutconnect: SMTP client connection timeout is 20 seconds. timeoutremote: SMTP client data timeout is 20 seconds. timeoutsmtpd: (Default.) SMTP server data timeout is 1200 seconds. virtualdomains: (Default.) No virtual domains.
qmailインストール時に以下のパッチをあてています。
tcpserverの同時接続数
240 に設定しました。基準は、メール配信同時プロセス(concurrencylocal)が 120 であるためです。余裕をもって設定しました。
# ps aux | grep tcp qmaild 1439 0.0 0.0 1716 512 ttyp0 S 15:59 0:00 tcpserver -qv -l0 -HR -u 503 -g 502 -c 240 -x /etc/tcp.smtp.cdb 0 smtp qmail-smtpd dev_pv_web /bin/checkpassword /bin/true
sysstat(sar)のcronの設定状況
1分ごとに sar の結果を出力するように設定しました。
# cat /etc/cron.d/sysstat # Run system activity accounting tool every 10 minutes */1 * * * * root /usr/local/lib/sa/sa1 -d 1 1 # 0 * * * * root /usr/local/lib/sa/sa1 -d 600 6 & # Generate a daily summary of process accounting at 23:53 53 23 * * * root /usr/local/lib/sa/sa2 -A
coLinux on CentOS5.1の状況
# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/cobd0 6047492 2093996 3646296 37% / none 387980 0 387980 0% /dev/shm
# free total used free shared buffers cached Mem: 775964 166268 609696 0 7696 130700 -/+ buffers/cache: 27872 748092 Swap: 102392 0 102392
coLinux on CentOS5.1 に割り当てたドメインとMXレコード
coLinux on CentOS5.1 のIP 10.20.138.175 に dev.fukushige.live-revolution.co.jp というドメインを向け、MXレコードを向けます。社内DNSに設定しました。
# dig dev.fukushige.live-revolution.co.jp MX ; <<>> DiG 9.3.3rc2 <<>> dev.fukushige.live-revolution.co.jp MX ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47218 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; QUESTION SECTION: ;dev.fukushige.live-revolution.co.jp. IN MX ;; ANSWER SECTION: dev.fukushige.live-revolution.co.jp. 86400 IN MX 10 dev.fukushige.live-revolution.co.jp. ;; AUTHORITY SECTION: dev.fukushige.live-revolution.co.jp. 86400 IN NS ns.live-revolution.co.jp. ;; ADDITIONAL SECTION: dev.fukushige.live-revolution.co.jp. 86400 IN A 10.20.138.175 ns.live-revolution.co.jp. 86400 IN A 10.20.138.9 ;; Query time: 49 msec ;; SERVER: 10.20.138.1#53(10.20.138.1) ;; WHEN: Tue Apr 21 15:29:14 2009 ;; MSG SIZE rcvd: 118
配送テスト
root から admin へ配送
# echo to:admin@dev.fukushige.live-revolution.co.jp | /var/qmail/bin/qmail-inject
/var/log/maillog の内容
Apr 21 15:33:21 dev_pv_web qmail: 1240295601.900032 new msg 703526 Apr 21 15:33:21 dev_pv_web qmail: 1240295601.900115 info msg 703526: bytes 270 from <root@dev.fukushige.live-revolution.co.jp> qp 1298 uid 0 Apr 21 15:33:21 dev_pv_web qmail: 1240295601.932297 starting delivery 1: msg 703526 to local admin@dev.fukushige.live-revolution.co.jp Apr 21 15:33:21 dev_pv_web qmail: 1240295601.932377 status: local 1/120 remote 0/120 Apr 21 15:33:21 dev_pv_web qmail: 1240295601.954598 delivery 1: success: did_1+0+0/ Apr 21 15:33:21 dev_pv_web qmail: 1240295601.954682 status: local 0/120 remote 0/120 Apr 21 15:33:21 dev_pv_web qmail: 1240295601.954726 end msg 703526
ちゃんと、 success している。
メールボックス確認
$ find /home/admin/Maildir/new/ -type f | wc -l 5 $ ls -la /home/admin/Maildir/new/ total 12 drwx------ 2 admin admin 4096 Apr 21 15:33 . drwx------ 5 admin admin 4096 Apr 21 14:52 .. -rw------- 1 admin admin 382 Apr 21 15:33 1240295601.1301.dev_pv_web
ちゃんと届いている。
実験に用いたスクリプトのテスト
- mass_mail_test.sh
#!/bin/bash CNT=0 while [ ${CNT} -lt 4 ] do echo to:admin@dev.fukushige.live-revolution.co.jp | /var/qmail/bin/qmail-inject CNT=$(expr ${CNT} + 1) done
ためしに、4通送ってみる。rootで実行( # sh mass_mail_test.sh )。
メールボックスを確認
$ find /home/admin/Maildir/new/ -type f | wc -l 5 $ ls -la /home/admin/Maildir/new/ total 28 drwx------ 2 admin admin 4096 Apr 21 16:11 . drwx------ 5 admin admin 4096 Apr 21 14:52 .. -rw------- 1 admin admin 382 Apr 21 15:33 1240295601.1301.dev_pv_web -rw------- 1 admin admin 382 Apr 21 16:11 1240297869.1515.dev_pv_web -rw------- 1 admin admin 382 Apr 21 16:11 1240297869.1522.dev_pv_web -rw------- 1 admin admin 382 Apr 21 16:11 1240297869.1529.dev_pv_web -rw------- 1 admin admin 382 Apr 21 16:11 1240297869.1533.dev_pv_web
先ほどの、1通のテストをあわせて、5通ちゃんと届いている。
他にも、5通ほどテストしましたので、受信メールは合計 10 通になりました。
$ find /home/admin/Maildir/new/ -type f | wc -l 10
1000通テストで送ってみます
こんどは、1000通送ってみます。スタート時間と終了時間も取得してみます。
- mass_mail_test.sh
#!/bin/bash echo "start : `date`" CNT=0 while [ ${CNT} -lt 1000 ] do echo to:admin@dev.fukushige.live-revolution.co.jp | /var/qmail/bin/qmail-inject CNT=$(expr ${CNT} + 1) done echo "end : `date`"
1000通送るのに、ぴったり 1分かかりました。
# sh mass_mail_test.sh start : Tue Apr 21 16:35:59 JST 2009 end : Tue Apr 21 16:36:59 JST 2009
受信ボックスにも 1000 通ちゃんと追加されています。
$ find /home/admin/Maildir/new/ -type f | wc -l 1010
特に問題がないようです。
1万通送ってみる
そろそろ負荷テストっぽくなってきました。今度は、1万通送ってみましょう。1000通で 1分ほどでしたので、10分程度で終わるのかと思います。やってみます。
- mass_mail_test.sh
#!/bin/bash echo "start : `date`" CNT=0 while [ ${CNT} -lt 10000 ] do echo to:admin@dev.fukushige.live-revolution.co.jp | /var/qmail/bin/qmail-inject CNT=$(expr ${CNT} + 1) done echo "end : `date`"
途中で ps aux を見てみると、qmail-local がプロセスにいくつも存在しており、ローカル配送しているのがわかります。
Last login: Tue Apr 21 16:43:25 2009 from 10.20.138.71 [admin@dev_pv_web ~]$ ps aux | grep local pgsql 807 0.0 0.5 48060 3904 ? S 14:14 0:00 /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data admin 20822 0.0 0.0 1544 336 ttyp0 S 16:44 0:00 bin/qmail-local -- admin /home/admin admin dev.fukushige.live-revolution.co.jp root@dev.fukushige.live-revolution.co.jp ./Maildir/ admin 20824 0.0 0.0 1544 344 ttyp0 R 16:44 0:00 bin/qmail-local -- admin /home/admin admin dev.fukushige.live-revolution.co.jp root@dev.fukushige.live-revolution.co.jp ./Maildir/ admin 20829 0.0 0.0 3912 712 ttyp3 S+ 16:44 0:00 grep local
結果
# sh mass_mail_test.sh start : Tue Apr 21 16:42:51 JST 2009 end : Tue Apr 21 16:52:59 JST 2009
予想通り、10分程度かかりました。 tail -f /var/log/maillog で眺めていましたが、ずっと success でした。失敗はなさそうです。
admin の受信ボックスを見てみると、
$ find /home/admin/Maildir/new/ -type f | wc -l 11010
しっかりと、1万通プラスされています。
ここで、その 10 分間の負荷状況を見てみましょう。(時間は16:42:51〜16:52:59の部分です)
multilogを採用して、I/O負荷を見てみる
mailログを multilogへ移行後、10000通送信してみました。
multilogへの移行はsyslog は I/O 負荷が高い → daemontool に移行しよう! - drk7jpを参考にしました。
- 送信プログラム( mass_mail_test.sh )
#!/bin/bash echo "start : `date`" CNT=0 while [ ${CNT} -lt 10000 ] do echo to:admin@dev.fukushige.live-revolution.co.jp | /var/qmail/bin/qmail-inject CNT=$(expr ${CNT} + 1) done echo "end : `date`"
わさわさと、 /var/log/qmail/current にログが流れ込んできます。
- 結果
# sh mass_mail_test.sh start : Tue Apr 21 21:42:27 JST 2009 end : Tue Apr 21 21:52:37 JST 2009
時間は変わりませんでした。10分です。もちろん、メールボックスにはしっかり届いていました。
その 10 分間の負荷状況を見てみましょう。(時間は21:42:27~21 21:52:37の部分です)
・・・あまり変化がない・・・・orz
今回のテストのまとめ
syslog と multilog の差があまり変化が見られない・・・。ローカル配送で1万通送った程度では、あまり変化がないのでしょうか・・・。それとも、何かやりかたを間違えているのでしょうか・・・。
今回のテストについて、つっこみ大歓迎です><
おまけ( qmailmrtg7 )
multilogにしていると、qmailmrtg7 というソフトが使え、qmailのログの状況をグラフ化して見れます。やってみます。
ツールを使った効率的なログ分析術 (2/2):実用qmailサーバ運用・管理術(10) - @ITを参考にやりました。
グラフで見れるのはよいですね。