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()を呼び出し、このバグに起因する無応答の引き金になることがあります。

解決策 

RHEL 6.6.zやCentOS 6.6.zなど、get_futex_key_refs()バグ修正が含まれるLinuxカーネルにアップグレードします。

次のコマンドを使用して、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コマンドを実行しても何も表示されません。

バグ修正を含むディストリビューションの詳細については、オペレーティング・システムの関連ベンダーまたはディストリビューターにお問い合わせください。