У меня есть java-приложение, работающее на CentOS 6.0. Он всегда работает в фоновом режиме через cron. Иногда это приложение переходит в состояние ожидания при использовании 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)
Другие симптомы:
a. Один поток процесса, кажется, находится в цикле, ожидая чего-то. При трассировке с использованием 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 (время ожидания соединения истекло)
б. Похоже, что процесс завершил работу, глядя на файлы, которые он использует. Осталось всего несколько файлов. Вывод 'ls /proc/pid/fd/ показывает:
lr-x------ 1 root root 64 22 июня 13:13 0 -> pipe:[77107601] l-wx------ 1 root root 64 22 июня 13:13 1 -> pipe:[77120162] l-wx------ 1 root root 64 22 июня 13:13 2 -> /var/log/mithi/mcs/agent_account_mailstore_exceed_limit.sh.log lr-x------ 1 root root 64 22 июня 13:13 3 -> /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/rt.jar
Кто-нибудь сталкивался с подобной ситуацией? Любые подсказки или ссылки были бы очень полезны.
В частности, известны ли какие-либо известные проблемы с запуском Java-процессов на основе openjdk в фоновом режиме в CentOS 6?
Теперь я могу смоделировать проблему с помощью очень простого бесконечного цикла, приведенного ниже.
#!/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 часов, я обнаруживаю один или два java-процесса, которые зависли или находятся в бесконечном цикле. с идентичным симптомом, т.е.
futex(0x7fb8000ac754, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1340347489,> 822867000}, ffffffff) = -1 ETIMEDOUT (Connection timed out)
Это происходит только в многопроцессорных системах, а не в однопроцессорных. Его также можно смоделировать на RHEL6, а не только на CentOS6.