1

STDIN から読み取り、TCP 経由でスクライブされたロギング サーバーにデータを送信するカスタム ロギング プロセスがあります。私の場合、STDIN は、httpd.conf で次のように Apache httpd 2.2 に添付されたアクセス ログです。 CustomLog "|/usr/local/bin/serelog" default

私の serelog プロセスは、FreeBSD 9.0 で中断できないスリープ状態になることがあり、そこから復帰しません。ただし、FreeBSD 8、Linux 2.6、Linux 3.1 など、他のオペレーティング システムでも確実に動作します。

途切れないスリープの原因を突き止めるにはどうすればよいですか?

全体の構造は次のようになります: httpd --[PIPE]--> serelog --[TCP-CONNECTION]--> scribe

これまで、次の分析を行いました。

  • ps を使用: stat は "D" で、wchan は "-" です。そのため、プロセスが中断不可能なスリープ状態にあり、カーネルランドにある必要があるため、syscallは明らかにありません。これは私にはあまり意味がありません。
  • プロセスが状態「D」にあるため、プロセスは kill -9 に期待どおりに反応しません。
  • シェルの外部でトラスを serelog に取り付ける: トラスが取り付けられている限り、serelog はスムーズに動作します。トラスを serelog から切り離した直後 (数秒)、serelog は "D" 状態になります。
  • 「D」状態になった後にトラスを serelog に接続すると、トラスは何も出力しません
  • 「D」状態では、lsof は着信 PIPE がいっぱいであることを示します。「D」状態ではプロセスが「スリープ」し、それ以上読み取ることができないため、これは予想されます。発信 TCP-CONNECTION が空です。
  • 「周囲の」Apache httpd サーバーを強制終了すると、serelog プロセスは最終的に (たとえば) 40 分後に終了します。
  • 中断できない問題について他の人がフォーラムで報告した内容を確認してもうまくいきませんでした: 私のセットアップには NFS がありません。また、サーバーであるため、ユーザーが CD ドライブやプラグ可能なハードウェアとやり取りすることもありません。

そのため、中断できず、明らかにシステムコールになく、トレースすると確実に機能するプロセスに行き詰まっています。唯一の良い点は、JMeter 負荷テスト (JMeter で 5 スレッド) を介して多数の HTTP 要求を送信したときに、数秒または数分で動作を再現できることです。

デバッグ、カーネル パラメータの調整に関するヒントをいただければ幸いです。

ご挨拶

4

1 に答える 1

1

この問題は実際の FreeBSD カーネルのバグであることが判明しており、現在カーネルで修正されています。

PR へのリンク: http://www.freebsd.org/cgi/query-pr.cgi?pr=166340

提案されたパッチ: http://lists.freebsd.org/pipermail/freebsd-bugs/2012-May/048610.html

于 2012-06-13T15:05:37.747 に答える