Linux futex_wait()カーネルのバグにより、ノードが応答していないように見える
ノードがランダムにフリーズし、応答しなくなります(理由は不明)。
ノードがランダムにフリーズし、応答しなくなります(理由は不明)。
バグはRHEL 6.6、CentOS 6.6以降で発生します。
このバグの影響を受けるノードには、次の特徴があります。
- ログにガーベージ・コレクション・アクティビティーはありません。
- 実行中のコンパクションはありません。
- nodetoolコマンドを実行できません。
- ネイティブ・トランスポート、Thrift、またはJMXポートで応答がありません。
- CPU使用率が低いかゼロに近くなっています。
- CPU使用率が高くなっており、いずれノードが応答しなくなります。
ノード上のスレッド・ダンプは次のように表示されます。
Thread 104823: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
- java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=20, line=226 (Compiled frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) @bci=68, line=2082 (Compiled frame)
- java.util.concurrent.LinkedBlockingQueue.poll(long, java.util.concurrent.TimeUnit) @bci=62, line=467 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=141, line=1068 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1130 (Compiled frame)
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=615 (Interpreted frame)
- java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)
原因
この問題は、ユーザープロセスがデッドロックしてハングアップする原因となるLinuxのfutex_wait()
バグによって引き起こされます。futex_wait()
呼び出し(およびそれを呼び出しているプロセス)は永遠にブロックされたままになる可能性があります。lock()
、park()
、unpark()
などのJVM同期メソッド呼び出しはすべて、ある時点でfutex_wait()
を呼び出すため、このバグが原因で応答しなくなる可能性があります。
解決策
get_futex_key_refs() fixが含まれているLinuxカーネル(RHEL 6.6.zやCentOS 6.6.zなど)にアップグレードします。
RHELサーバーにインストールされているパッチを、次のコマンドを使用して確認します。
sudo rpm -q --changelog kernel-`uname -r` | grep futex | grep ref
このコマンドの出力例:
- [kernel] futex: Mention key referencing differences between shared and private futexes (Larry Woodman) [1167405] - [kernel] futex: Ensure get_futex_key_refs() always implies a barrier (Larry Woodman) [1167405]
パッチがインストールされていない場合、rpm
コマンドの結果として、何も表示されません。
修正が含まれているディストリビューションの詳細については、オペレーティング・システムの関連する製造元または販売元に問い合わせてください。