特定のスレッドが数秒間実行されないように見えるマルチスレッド Linux プロセスの問題をデバッグしています。strace の出力を見ると、futex を待っていることが明らかになりまし
た
。
この futex(0x44b8d20) がユーザー空間で何を参照しているか、つまり、内部で futex を使用しているロック構造にこれをマップする方法を見つけるにはどうすればよいですか。
特定のスレッドが数秒間実行されないように見えるマルチスレッド Linux プロセスの問題をデバッグしています。strace の出力を見ると、futex を待っていることが明らかになりまし
た
。
この futex(0x44b8d20) がユーザー空間で何を参照しているか、つまり、内部で futex を使用しているロック構造にこれをマップする方法を見つけるにはどうすればよいですか。
シンプルな systemtap スクリプトを使用すると、競合する futex ロックのアドレスをすばやく見つけることができます。アドレスと言うときは、futex()
syscallの最初の引数を指しています。
競合するユーザー空間ロックを見つける単純なシステム タップ スクリプトは、
https ://sourceware.org/systemtap/examples/process/futexes.stp からダウンロードできます。
システムに systemtap がインストールされている場合は、次の
システム タップ スクリプトを開始します。stap futexes.stp
strace
前に行ったように、出力をキャプチャします。
単に Ctrl-C を実行してシステム タップ スクリプトの実行を終了する
と、競合した futex の出力が得られます。
最後に、strace 出力で
、2 番目の引数 (操作タイプ) が である futex 呼び出しを検索しますFUTEX_WAIT
。
例えば :futex(0x7f58a31999d0, FUTEX_WAIT, 4508, NULL) = 0
次に、システム タップ スクリプトの出力で最初の引数を検索できます。
何かのようなもの :ome[4489] lock 0x7f58a31999d0 contended 1 times, 7807 avg us
このシステム タップ スクリプトを見ると
、プロセス名とプロセス/スレッド ID が適切に表示されます。
これにより、探しているものを簡単に見つけることができます。
ただし、systemtap スクリプトを実行すると、実際にはシステム全体で syscall がフックされることに注意してください。