2012-06-22 36 views
5

CentOS 6.0'da çalışan bir java uygulamasına sahibim. Her zaman cron ile arka planda çalışır. Bazen bu uygulama% 100 işlemci kullanırken bekleme durumuna geçer.java% 100 CPU Kullanıyor

Benim java sürümü:

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) 

Diğer belirtiler şunlardır:

a. Sürecin bir iş parçacığı bir şey bekliyor gibi görünüyor. strace kullanılarak izlendi, bu sürekli o/p aşağıdakileri gösterir:

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. Süreç, çalıştığı dosyaları inceleyerek çalışmayı bitirmiş gibi görünüyor. Sadece birkaç dosya kaldı. 'Ls/proc/pid/fd/gösterileri çıkışı:

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 

herkes benzer bir durumla karşı karşıya mı? Herhangi bir ipucu veya referans çok yardımcı olacaktır.

Daha açık söylemek gerekirse, openjdk tabanlı Java işlemlerini CentOS 6'da arka planda çalıştırırken bilinen herhangi bir sorun var mı? Ben bir veya iki java süreçleri bulmak, 4 saat -

Şimdi bu komut yaklaşık 3 için çalıştırıldığında

#!/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 

aşağıda verilen, çok basit bir sonsuz döngüye sorunu simüle açabiliyorum asılı ya da bu değil, yalnızca tek işlemcili sistemler, çok işlemcili sistemler üzerinde oluyor

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

yani aynı belirti ile sonsuz bir döngüde. Ayrıca sadece CentOS6 değil, RHEL6 üzerinde simüle edilebilir.

cevap

1

Bu sorun, çekirdeği CentOS 6.2 çekirdeği olan kernel-2.6.32-220'ye yükselttikten sonra çözüldü.

+0

Yukarı akış nedeniyle (Kernel bug 32922) (https://bugzilla.kernel.org/show_bug.cgi?id=32922), 3.14'ten beri gelen çekirdek sürümlerinde ve 3.18'de sabitlenmiştir. Ancak hata, bazı dağıtımlarda (örneğin, CentOS 6) eski çekirdek sürümlerine backport'larda toplanmıştı. Bu [Google Grupları tartışması] 'ndaki uzun sohbete bakın (https://groups.google.com/forum/#!Konu/mekanik-sempati/QbmpZxp6C64) –

4

Birçok olası nedeni vardır. Aklıma olanlar,:

  1. Sizin süreci bellek kullanımı namlı Tam GC'lerin neden maksimum yığın boyutu çok yakındır. GC loglarını -Xloggc:/path/to/logFile.log -XX:+PrintGCDetails seçenekleri ile etkinleştirin ve ardından GCViewer veya HPJmeter gibi araçları kullanarak analiz edin. İşleminiz aslında bir şey yapıyor (sonsuz döngü gibi) ve birkaç iş parçacığı dökümünü yaparak ve bunları analiz ederek kontrol edebilirsiniz. Bunu VisualVM ve Thread Dump Analyzer ile yapabilirsiniz.

+0

Yukarıda belirttiğim gibi, prb'yi "/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin/java -version" ile simüle edebilirim. Bu, ne bir gc prb, ne de uygulamada sonsuz bir döngü olduğunu gösterir. – amolkul