現在、私のアプリケーションは定期的にIOでブロックされており、出力は非常に低くなっています。コマンドを使用してプロセスをトレースしています。
jstackを使用すると、アプリがFileOutputStream.writeBytesでハングしていることがわかりました。
strace -f -c -p pidを使用してシステムコール情報を収集することにより、私はそれを見つけました。通常の状況では、futexとwritesyscallの両方があります。しかし、それが正常でなくなったときは、futexシステムコールしかありません。アプリはfutexを呼び出し続けますが、すべて失敗し、次のようにETIMEDOUTをスローします。
<futex resumed> =-1 ETIMEDOUT (Connecton timed out)
futex(Ox7f823, FUTEX_WAKE_PRIVATE,1)=0
futex(Ox7f824, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME) =-1<unfinished>
<futex resumed> =-1 ETIMEDOUT (Connecton timed out)
futex(Ox7f823, FUTEX_WAKE_PRIVATE,1)=0
futex(Ox7f824, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME) =-1<unfinished>
この問題は定期的に発生し、数分または数時間続き、再び正常になります。
特に、IOでブロックされると、echo 3>/proc/sys/vm/drop_cachesは常に一時的に正常になります。私はそれをグーグルで検索し、以下にリストされているいくつかの同様の問題を見つけました。
私のシステムに関するいくつかの情報。 OS:Redhat 6.1、カーネルバージョン2.6.31
JDK:1.7.0_05
CPU:X5650、24コア
メモリ:24GBおよび48GB
たぶんfutex_wait()のカーネルバグ?
ここでそれについて読むことができます: https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64
クロックジャンプと前述の(かなり古い)THPカーネルのバグに加えて、Javaが予期せずにIOをブロックするもう1つの一般的な理由は、読み取り中です very低速でブロッキング/ dev/random 一部のライブラリは、より一般的に使用され、パフォーマンスがはるかに優れた/ dev/urandomよりも優先されます。
それが原因であるかどうかを判断する簡単な方法:
Sudo mv /dev/random /dev/random.real
Sudo ln -s /dev/urandom /dev/random
...次に、アプリを再起動して、ブロックが停止するかどうかを確認しますIOブロッキング。テストが完了したら、おそらく/ dev/randomを復元する必要があります。
Sudo mv /dev/random.real /dev/random
...そして、必要に応じて/ dev/urandomを使用するように要求するアプリケーションベンダーのバグを開きます。