3

http://www.jejik.com/files/examples/daemon.pyのモジュールを使用してpython2.7デーモンプロセスを作成しています

このプロセスは、約 40 GB の RAM を使用し、9 つの子スレッドを使用する重いプロセスです。サーバーは、192 GB の RAM と十分な CPU パワーを備えた RHEL 6.3 を使用します。

プロセスを開始した後、約 3 ~ 7 時間続きますが、その後、誰かによって強制終了されました。カーネルである可能性があります。しかし、dmesg にもカーネル ログ (手動でアクティブ化したもの) にもヒントは見つかりませんでした。デーモンとして起動していないとき、ターミナルに「killed」というメッセージが表示されました。

以下の予防措置が講じられています。

  • /proc//oom_score_adj の oom スコアをリセットして、リソースの並べ替え時に oom キラーがプロセスを選択しないようにする
  • すべての rlimit (増やすことができるもの) を最大に増やす
  • プロセスのナイス/プライオリティを高く設定します (prio -15)

この問題は、これらの予防措置を適用する前にすでに存在していたため、殺害の責任はありません。

また、すべての例外、STDERR、STDOUT をキャッチし、すべてをローテーションされたログ ファイルに記録するメカニズムもあります。しかし、プロセスが停止する直前には、興味深いものは何もありませんでした。

とりわけプロセス内で使用されるモジュール: oracle_cx、ibm_db、suds、wsgi_utils。ただし、エラーが発生した場合、それらはすべて常にログを書き込みます。

殺人を追跡する方法を知っている人はいますか?誰となぜ?

前もって感謝します

4

2 に答える 2

0

根本的な原因を見つけたと思いますが、Python2.7 のバグである可能性があります。キャッチ可能なすべてのシグナルをキャッチして無視した後、さらにエラー メッセージを追跡し、socket.error のヒントを得ることができました。問題は、そのようなエラーは最初に SIGTERM をトリガーし (実際にプロセスを強制終了しようとします)、次に STDERR に書き込みます。すべての STDOUT および STDERR をキャッチする私のメカニズムは、メイン プロセスが強制終了されたため、メッセージをログに記録できます。とにかく、これはデーモンの問題です。これらは、プロセスが終了する直前のログの最後の行です

2013-05-07 11:05:53,194 - STDERR - ERROR - Traceback (most recent call last):
2013-05-07 11:05:53,304 - STDERR - ERROR -   File "/var/lib/netcam_epd/lib/python2.7/SocketServer.py", line 582, in process_request_thread
2013-05-07 11:05:53,415 - STDERR - ERROR -     self.finish_request(request, client_address)
2013-05-07 11:05:53,489 - STDERR - ERROR -   File "/var/lib/netcam_epd/lib/python2.7/SocketServer.py", line 323, in finish_request
2013-05-07 11:05:53,587 - STDERR - ERROR -     self.RequestHandlerClass(request, client_address, self)
2013-05-07 11:05:53,684 - STDERR - ERROR -   File "/var/lib/netcam_epd/lib/python2.7/SocketServer.py", line 640, in __init__
2013-05-07 11:05:53,835 - STDERR - ERROR -     self.finish()
2013-05-07 11:05:53,887 - STDERR - ERROR -   File "/var/lib/netcam_epd/lib/python2.7/SocketServer.py", line 693, in finish
2013-05-07 11:05:54,084 - STDERR - ERROR -     self.wfile.flush()
2013-05-07 11:05:54,182 - STDERR - ERROR -   File "/var/lib/netcam_epd/lib/python2.7/socket.py", line 303, in flush
2013-05-07 11:05:54,326 - STDERR - ERROR -     self._sock.sendall(view[write_offset:write_offset+buffer_size])
2013-05-07 11:05:54,387 - STDERR - ERROR - error: [Errno 32] Broken pipe

どうやら、これは書き込み不可能なソケットに書き込もうとしたことが原因でした。ソケットは通常の実行でいつでも閉じることができるため、エラー/例外をスローするだけでなく、ライブラリは適切な戻り値でこれをより適切に処理する必要があると思います。

これが実際に根本原因であるかどうかを確認します。

于 2013-05-07T09:42:04.247 に答える