Назад | Перейти на главную страницу

fork: ресурс временно недоступен под управлением JVM

Я использую экземпляр Tomcat 6 на экземпляре EC2 объемом 34 ГБ. Я изо всех сил пытался уменьшить объем памяти, но эта штука обслуживает много запросов, и куча часто достигает 13 ГБ. Но куча - это отдельная история.

Настоящая проблема сейчас в том, что через некоторое время сервер перестает отвечать, а консольные команды встречают сообщение «fork: Resource временно недоступен».

Поскольку в этот момент сервер сильно выходит из строя и на консоли EC2 или ssh ничего нет, я не знаю, как это диагностировать. После перезапуска и ненадолго простоя, top выглядит так:

Mem:  35847580k total, 28719420k used,  7128160k free,   221432k buffers
Swap:        0k total,        0k used,        0k free, 11103780k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                   
 xxxx tomcat    25   0 19.9g  15g 9832 S   86 44.1  36:01.69 java        

Я почти уверен, что у меня достаточно высокие ограничения, и ничего /etc/security.conf это ограничило бы процесс Java. У меня около 30 000 потоков и столько же FD. В системном журнале ничего нет, кроме некоторых сообщений о переполнении SYN (это происходит, когда сборщик мусора JVM находится под большой нагрузкой)

На что еще я должен посмотреть? (2.6.21.7-2.fc8xen-ec2-v1.0 кстати)

Звучит ужасно, как будто у вас заканчивается память. fork () в основном будет терпеть неудачу только из-за ограничений ulimit (количество дескрипторов процесса или файлов) или нехватки памяти. Итак, если вы не достигли своих пределов, это означает, что у вас не хватает памяти.

root обычно не входит в ограничения, такие как максимальное количество процессов, но для уверенности проверьте свой файл limits.conf. Однако, в зависимости от вашей настройки EC2, вы не сможете напрямую войти в систему как root, поэтому в этом случае вам, вероятно, придется держать корневую оболочку открытой в коробке ...

Система, в которой возникла проблема, может быть не в состоянии вести журнал на диск, поэтому единственный способ узнать, что происходит, вероятно, через команду «dmesg» (которая печатает кольцевой буфер ядра). Попробуйте оставить корневую оболочку открытой в коробке, выполнив следующие действия:

while true ; do dmesg -c ; sleep 0.1 ; done

Кроме того, сохраняя vmstat 1 бег может выявить что-то интересное, например, тяжелая подмена ...

Вы нашли в системном журнале "oom-killer"?