質問

私はプロダクションで走っているPythonデーモンを持っています。 7〜120のスレッドを使用します。最近、最小のインスタンス(7つのスレッド)がハングを示し始めましたが、他のすべてのインスタンスはこの種の問題を決して示しませんでした。 StraceをPythonプロセスに取り付けることは、すべてのスレッドがFutex futex_wait_privateを呼び出していることを示しているため、おそらく何かをロックしようとしています。

そのような問題をどのようにデバッグしますか?

これはフラッシュメモリから実行される生産システムであるため、ディスクの書き込みも制約されていることに注意してください。

役に立ちましたか?

解決

観察はわずかに間違っていました。 1つのスレッドはFutexを呼び出していませんでしたが、代わりにギルを保持しながら交換しました。問題のマシンは低いハードウェアであるため、このスワッピングは非常に長くかかり、デッドロックのように見えました。根本的な問題は、メモリリークです。 :-(

他のヒント

親愛なるヘルムート、私はfutext_wait_privateにぶら下がっている1つのスレッドと同じ問題です。

問題を解決したようです。ソリューションに関する詳細情報を共有できますか?

UPD:

ロックの理由が最終的に見つかりました(少なくとも私の場合は):それはPythonでロックをインポートするためでした。

次の状況を検討してください:

file1.py:

file2をインポートします

file2.py:

スレッド「thread2」を作成する

「thread2」を実行する

「thread2」が何らかの関数で終了するまで待ちます(Go()と言っておきましょう)

def go():

some_moduleをインポートします

....

ここでは、go()のインポートは、go()仕上げまでリリースされないメインスレッド(インポートFile2によって)にロックされているため、go()に電話を切ります。ユーザーは、futex_wait_privateでStrach Hangで表示されます。

この場所を回避するために、file2をdo()関数にインポートする間に実行されたコードを実行し、file2をインポートした後に実行します。

file2をインポートします

file2.do()

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top