Eclipseが回転している理由を理解しようとしているので、straceを起動することにしました。
私はEclipseプロセスを使用して見つけました:
_$ ps ax | grep Java
5546 ? Sl 19:04 /usr/bin/Java ... [arguments omitted]
_
このプロセスでstrace
を実行すると、別のプロセスを待機していることがわかります。
_$ Sudo strace -p 5546
Process 5546 attached - interrupt to quit
futex(0x7f6c416679d0, FUTEX_WAIT, 5547, NULL^C <unfinished ...>
Process 5546 detached
_
興味深いことに、プロセス5547はps
に表示されません(理由を誰かに教えてもらえますか?)が、strace
できます。それは繰り返し多くのEAGAINの失敗を吐き出している(時折成功する)
_read(16, 0x7f6c41664d10, 16) = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {67410, 357843264}) = 0
poll([{fd=16, events=POLLIN}, {fd=15, events=POLLIN}, {fd=68, events=POLLIN}, {fd=128, events=POLLIN}, {fd=69, events=POLLIN}], 5, 0) = 0 (Timeout)
read(16, 0x7f6c41664cb0, 16) = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
...
_
出力から判断すると、ファイル記述子16、15、68、128、および69をポーリングしているように見えます。特にEAGAIN
エラーは、read(2)
およびrecvfrom(2)
呼び出し。
これらのfdsに関する詳細情報を見つけるにはどうすればよいですか? _lsof -p 5547
_を試しましたが、出力が出力されません。これらはいくつかのウェブサイトに公開されているソケットだと思いますが、EAGAIN
の失敗でタイトなループで回転している理由は不可解です...
一部のPIDは、threadsに属しているため、リストされていません。 htop
を押すと、それらを表示できます Shift+H (およびオプションで T ツリービューの場合)、ただしlsof
はメインプロセスのPIDを必要とします。 (とにかく、プロセス内のすべてのpthreadはファイル記述子を共有します。)_/proc/5546/fd/
_および_/proc/5546/task/
_も確認できます。
EAGAINは、非ブロッキングI/Oでは正常です。たとえば、読み取るデータがない場合はread()
によって返されます。 read(2)、write(2)などの「エラー」を参照してください。これらのfdの一部は、X11サーバーへの接続である可能性があります。非ブロッキングI/OはX11クライアントライブラリによって使用されます。
futex(2)
の3番目のパラメータは必ずしもプロセスIDである必要はなく、マニュアルにはfutex(uaddr, op, val, timeout, ...)
と記載されており、opがFUTEX_WAIT
の場合、「futexアドレスを原子的に検証します- addrにはまだ値valが含まれており、このfutexアドレスでFUTEX_WAKEを待機してスリープします。[When] timeoutがNULLの場合、呼び出しは無期限にブロックされます。」
あなたの場合、プロセス5546がそこに座って何か(おそらくスレッド5547または関連するもの)を待っていたようですが、これだけに基づいて正確に何を確認するかはわかりませんが、指定されたメモリにその番号を書き込みます住所。
ps -eLf
などを使用してスレッドを表示できることにも注意してください。