トップ «前の日記(07/07/2008) 最新 次の日記(07/11/2008)» 編集

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


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 オプションで制御できるっぽい.