hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
07/09/2008 む [長年日記]
tDiary 2085日目
■ [日記] 夢
通ってた大学の廊下.
見覚えのある人とすれ違った.
振り返ると,死んだ知り合いだった.
「ちょ! おま!」
呼び止めようとしたけど,隣の研究室に入ってしまった.
すぐに俺も隣の研究室に入った.
けど誰もいなかった.
何だかとても悲しくなって,たくさん涙が出た.
というところで起きた. 何だ一体.
■ [日記] syslog-ng 云々
- dest driver "program" と syslog-ng は pipe でつながってるくさい (afprog.c afprogram_dd_init)
- syslog-ng 側 pipe はノンブロッキングモードで書き込みが行われるくさい (afprog.c afprogram_dd_init で g_fd_set_nonblock (実体は misc.c) を呼んでる)
- pipe への書き込みが失敗すると,EAGAIN でも EINTR でもない場合に限り最終的に afprogram_dd_deinit と afprogram_dd_init が呼ばれて program が再起動されるくさい (log_writer_broken → log_pipe_notify → notify (afprogram_dd_notify))
全体がぼんやりだからあんまし自信ないけど.
- pipe(7) によれば,O_NONBLOCK 有効, 書き込みサイズ <= PIPE_BUF の場合には,write(2) 失敗時には EAGAIN となる.この場合何事もなかったかのように partial flush の pos 0 で処理続行
- O_NONBLOCK 有効, 書き込みサイズ > PIPE_BUF の場合には,バッファがいっぱいの場合は write(2) が即座に EAGAIN で失敗するが,そうでない場合,一部のみ書き込みが行われる可能性がある.この場合 partial flush として処理され,次回へ持ち越し
- PIPE_BUF は Linux 2.6.11 以降では 65536 バイトらしい
例えば program が pipe (つまり stdin) からデータを吸い出すスピードが syslog-ng による pipe への write スピードよりも下回っていた場合,普通に考えれば pipe バッファがすぐに溢れる. 上記を踏まえると,このような場合は EAGAIN で正常終了処理続行なので,その間もどんどん queue に溜まっていくイメージか. そのうち queue も溢れて drop メッセージが出るようになるかな. いたるところにバッファがあってわけが分からんな.
更に言うならこれら全部想像でしかないという罠. 実はぜんぜん違ったりして.
syslog-ng の write queue は log_fifo_size オプションで制御できるっぽい.