web-dev-qa-db-ja.com

Java定期的にfutexでハングし、非常に低いIO出力

現在、私のアプリケーションは定期的に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は常に一時的に正常になります。私はそれをグーグルで検索し、以下にリストされているいくつかの同様の問題を見つけました。

  1. うるう秒。動作しません。システムのntpdが停止しています。
  2. 透明なhugepageのバグ。 https://bugzilla.redhat.com/show_bug.cgi?id=879801 これは私の問題と非常に似ていますが、khugepagedプロセスは正常であり、負荷は常にほぼゼロです。特にdrop_cachesは私のアプリケーションでも機能します。また、私のシステムはマルチコアで大容量のメモリです。それは私にはうまくいきません。それで、誰かが同じ問題に遭遇したか、この問題に精通していますか?

私のシステムに関するいくつかの情報。 OS:Redhat 6.1、カーネルバージョン2.6.31

JDK:1.7.0_05

CPU:X5650、24コア

メモリ:24GBおよび48GB

15
bforevdr

たぶんfutex_wait()のカーネルバグ?

ここでそれについて読むことができます: https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64

3
Guy Sela

クロックジャンプと前述の(かなり古い)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を使用するように要求するアプリケーションベンダーのバグを開きます。

0
Aex Aey