Я использую экземпляр 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"?