2012-06-22 37 views
5

Tôi có một ứng dụng java chạy trên CentOS 6.0. Nó luôn luôn chạy trong nền qua cron. Đôi khi ứng dụng này đi vào trạng thái chờ trong khi sử dụng CPU 100%.java bằng 100% cpu

phiên bản java của tôi là:

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) 

Các triệu chứng khác bao gồm:

a. Một luồng của quá trình có vẻ như đang ở trong một vòng lặp chờ đợi thứ gì đó. Khi truy sử dụng strace, nó cho thấy sau o/p liên tục:

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. Dường như quá trình này đã hoàn thành công việc, xem các tệp đang sử dụng. Chỉ còn lại một vài tệp. Kết quả của 'ls/proc/pid/fd/show:

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 

Có ai gặp tình huống tương tự? Bất kỳ đầu mối hoặc tham chiếu nào sẽ rất hữu ích.

Cụ thể hơn, có bất kỳ vấn đề nào đã biết khi chạy các quy trình Java dựa trên openjdk trong nền trên CentOS 6 không?

Bây giờ tôi có thể mô phỏng các vấn đề với một vòng lặp vô hạn rất đơn giản, đưa ra dưới đây

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

Khi kịch bản này được chạy trong khoảng 3-4 giờ, tôi thấy quá trình một hoặc hai java mà treo hoặc trong vòng lặp vô hạn với triệu chứng giống hệt ví dụ

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

này đang xảy ra trên các hệ thống đa xử mà thôi, chứ không phải trên hệ thống xử lý duy nhất. Nó cũng có thể được mô phỏng trên RHEL6, không chỉ CentOS6.

Trả lời

1

Sự cố đã được giải quyết sau khi nâng cấp hạt nhân lên hạt nhân 2.6.32-220 là lõi CentOS 6.2.

+0

Vì ngược dòng [Lỗi hạt nhân 32922] (https://bugzilla.kernel.org/show_bug.cgi?id=32922), trong phiên bản hạt nhân ngược dòng từ 3,14 và được sửa trong 3,18. Tuy nhiên, lỗi đã được chọn trong backports cho các phiên bản hạt nhân trước đó trong một số bản phân phối (ví dụ: CentOS 6). Xem cuộc trò chuyện dài trong [thảo luận Google Groups] này (https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64) –

4

Có nhiều lý do có thể xảy ra. Những điều đó, mà tôi có thể nghĩ đến:

  1. Quá trình sử dụng bộ nhớ của bạn quá gần với kích thước tối đa. Bật nhật ký GC với các tùy chọn -Xloggc:/path/to/logFile.log -XX:+PrintGCDetails và sau đó phân tích bằng các công cụ như GCViewer hoặc HPJmeter.

  2. Quy trình của bạn thực sự đang thực hiện điều gì đó (giống như vòng lặp vô hạn) và bạn có thể kiểm tra bằng cách thực hiện một vài chuỗi luồng và phân tích chúng. Bạn có thể làm điều đó với VisualVMThread Dump Analyzer.

+0

Như tôi đã nói ở trên, tôi có thể mô phỏng prb với "/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin/java -version". Điều này chỉ ra rằng nó cũng không phải là một prc gc, không phải là một vòng lặp vô hạn trong ứng dụng. – amolkul

Các vấn đề liên quan