6

CentOS 6.0 で Java アプリを実行しています。cron を介して常にバックグラウンドで実行されます。このアプリは、CPU を 100% 使用しているときに待機状態になることがあります。

私のJavaバージョンは次のとおりです。

java version "1.6.0_17"
OpenJDK Runtime Environment (IcedTea6 1.7.4) (rhel-1.21.b17.el6-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)

その他の症状は次のとおりです。

を。プロセスの 1 つのスレッドが、何かを待っているループになっているようです。strace を使用してトレースすると、次の o/p が連続して表示されます。

futex(0x7fb8000ac728, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)

b. 使用しているファイルを見ると、プロセスが完了したようです。残っているファイルはわずかです。'ls /proc/pid/fd/ の出力は次のとおりです。

lr-x------ 1 root root 64 Jun 22 13:13 0 -> pipe:[77107601]
l-wx------ 1 root root 64 Jun 22 13:13 1 -> pipe:[77120162]
l-wx------ 1 root root 64 Jun 22 13:13 2 -> /var/log/mithi/mcs/agent_account_mailstore_exceed_limit.sh.log
lr-x------ 1 root root 64 Jun 22 13:13 3 -> /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/rt.jar

誰も同じような状況に直面しましたか? 手がかりや参考文献は非常に役立ちます。

具体的には、CentOS 6 でバックグラウンドで openjdk ベースの Java プロセスを実行する際に既知の問題はありますか?

以下に示す非常に単純な無限ループで問題をシミュレートできるようになりました。

#!/bin/bash

while [ 1 ]
do
    /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin/java -version &
    sleep 1s
done

このスクリプトを約 3 ~ 4 時間実行すると、1 つまたは 2 つの Java プロセスがハングしているか、同じ症状で無限ループになっていることがわかります。

futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)

これは、シングル プロセッサ システムではなく、マルチプロセッサ システムでのみ発生します。CentOS6だけでなく、RHEL6でもシミュレーション可能です。

4

2 に答える 2

4

多くの理由が考えられます。私が考えることができるもの:

  1. プロセスのメモリ使用量は最大ヒープサイズに非常に近く、悪名高いフルGCが発生します。オプションを使用してGCログを有効にし、 GCViewerHPJmeter-Xloggc:/path/to/logFile.log -XX:+PrintGCDetailsなどのツールを使用して分析します。

  2. プロセスは実際に何か(無限ループなど)を実行しており、いくつかのスレッドダンプを実行して分析することで、プロセスを確認できます。VisualVMThreadDumpAnalyzerを使用してこれを行うことができます。

于 2012-06-22T08:11:51.930 に答える
1

この問題は、カーネルを CentOS 6.2 カーネルである kernel-2.6.32-220 にアップグレードした後に解決されました。

于 2012-07-27T11:11:20.933 に答える