syslog界隈

syslogd・・・言わずと知れたSyslogの収集、記録を行うデーモンなんですけど。最近syslog-ngに切り替えが進んでるらしい。


実際のところ、かなり昔からsyslogdについて言われてる問題ってのがあって、大分すると
  1. ログの量が多い場合、ディスクI/Oの負荷が問題になる
  2. リモートホストからのログを取りこぼす場合がある(udpだから)
  3. ログの制御が細かく行えない(ファシリティとレベルで分類して、指定したファイルに書き出すのが基本だから)
ってのが問題と言われてる部分。
1については結局のところ、ログが1行出る度にディスクに書き込んでたら、ディスクのI/Oが多発しちゃって、I/O性能に悪影響を及ぼす・・・ってこと なんだけど、バッファにためられてしまうとtail -f等でログファイルを見てても、タイムリーに記録されないというか、そういう問題も起こるので、通常Syslogdってのはファイルをオープンしっぱな しにして、順次レコードを書き込む→fsync()を発行する・・・という流れで動作しています。ただ、fsync()の発行ってがバッファをディスクに はき出すって事なんだけど、結局1行毎にそれをやってる(=昔風なプログラム)から、重くて遅い、と。実際にはsyslogdが遅くなるだけなら問題は無いんだけど、元のログを吐いてるプログラムから見るとsyslog()を発行して、/dev/log経由でsyslogdにメッセージを渡すまでは解放されない。fsync()が多発している状況だと、/dev/logの反応も落ちるので、結果としてシステム全体のレスポンスも低下しますよという。。。そこで、Syslog-ngではsync(nnn)とい う設定が追加されていて、ファイル単位でどのくらいの頻度でfsync()させるのかという設定ができるようになってたりします。ただ、これも善し悪し で、結局tail -f等でログを見ていても、ログが書かれない!って焦る事になる・・・ケースも考えられるので、その辺は色々考えて設定してね!という事。Linuxとかで動いてるsyslogdの場合、syslog.confファイルのログファイル名の頭に-(ハイフン)を付けることでfsync()の発行を抑止できるんだけど。
2については通信にudpを使ってる上に、syslogの実装でデータの再送とか実装してるわけじゃないので、ネットワーク上でパケットがドロップしてし まったら取りこぼしますという話。syslog-ngではTCPを使っているので、再送で取りこぼさなくなりますという。
3についてはファイル名の指定にマクロ機能が使えるようになりましたという話。本来syslogではずっと一つのファイルにはき続ける仕様なので、ファイルが肥大化してしまう。そこで、Linuxならlogrotate.conf、Solarisならlogadm.confとかログのローテートを行うプログラムやスクリプトが準備されていて、一日一回とかの頻度でファイルをローテートして、Syslogのプロセスを再起動する・・・という事をしてるんですけど。syslog-ngの場合は最初からファイル名にマクロが使えて、ファイル名に月や日を入れる指定ができるので、そもそもローテートさせる必要が無くなります。。。という話。あと、必ずしもファイルに書き出すだけじゃなくて、プログラムをキックすることもできるので、ログからアラートをあげるのにswatchのようなプログラムを使う必要が無くなったってのもメリット。

・・・とここまで書いてて思ったけど、必ずしもsyslog-ngが素晴らしいって訳じゃなさそう。それに、商用のUNIX(SolarisやHP-UXやAIX等々)の場合、名前は元のままだけど、独自に手を入れられてたりして、性能改善や機能強化が図られている場合もあるので、一概にSyslog-ngを搭載してないからダメともいえない部分があるけど。
どうなんだろ?と思って調べてみた。

[linux-users:38957] Re: syslog の限界?
私もちょっと興味があったので、試しに私の手元のマシンいくつかで、
elapsを計測するテストをやってみました。

※ syslogdではなく, 単純なテストプログラムを使用.
数バイトのメッセージを write(),fsync()、10万回 続けるだけ.
秒(sec)しか見てないので,正確さは今一欠けてると思いますが.

□ Linux 2.0.34 (RHL 4.2) on 98MateNX MA20C + IDE
fsyncあり 507 sec
fsyncなし 2 sec

□ FreeBSD 2.2.1 on Gateway 2000 P5-200 + IDE
fsyncあり 2267 sec
fsyncなし 5 sec

□ HP-UX 10.20 A 9000/712 + SCSI
fsyncあり 2261 sec
fsyncなし 6 sec

□ SunOS 5.6 Sparc Station Ultra5 + SCSI
fsyncあり 3 sec ← 御注目 :-)
fsyncなし 3 sec

それぞれのOSのfsync(もしくはfctlのO_SYNC)の実装がどのように違うか
存じませんし、CPUもHDDもマシンそのものがすべて違うので、もちろん
一概にいえません。

ですが、私のところのマシンではなぜかSunだけがむちゃくちゃ早いように
思えます。
# 本当かよ, って感じがするくらい (^^;

ちょっと古いけど、Solaris(SunOS)だけ結果が変?って事で、あまり参考にはならなそうだけど。。。