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

Диагностика причины большого количества «занятых серверов» Apache

Заранее извиняюсь за немного многословный вопрос.

Мы обеспечиваем хостинг и управление приложениями для веб-приложения J2EE. Стек технологий - CentOS 5.9 64 бит, Apache 2.2.17, Tomcat 5, JBoss 4.2.2. (Виртуальный) сервер имеет 6 ГБ ОЗУ. Обычно мы видим около 2500 одновременных пользователей в рабочее время, и, как правило, среда работает нормально (мы даже взломали 3300 одновременных пользователей без каких-либо проблем с производительностью). Недавно у нас было несколько кратковременных отключений, и мы не уверены в основной причине. Отключения длятся всего пару минут - достаточно долго, чтобы получить электронное письмо с предупреждением от программного обеспечения для мониторинга, убедиться, что приложение недоступно, открыть терминал на сервере и перезапустить службу - около 2-3 минут.

Некоторая информация относительно отключений:

Мы проанализировали файлы журналов, отчеты мониторинга, журналы сборки мусора и т. Д. Что мы можем сказать с уверенностью, так это то, что во время сбоев программное обеспечение мониторинга сообщало о наличии кучи занятых серверов Apache. Я не уверен, что такое «Занятый сервер», но во время сбоя это значение резко выросло до 150–200. Среднее значение для занятых серверов составляет около 5, редко превышая 10. Мы также можем видеть из журналов GC. что во время перебоев в работе возникла проблема с памятью, например:

4967.376: [Full GC [PSYoungGen: 17576K->0K(656384K)] [PSOldGen: 3131794K->628760K(3145728K)] 3149370K->628760K(3802112K) [PSPermGen: 157485K->157485K(315008K)], 2.6067200 secs]

Варианты JVM:

JAVA_OPTIONS="${JAVA_OPTIONS} -Xms4096m -Xmx4096m -XX:NewRatio=3 -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=4"
JAVA_OPTIONS="${JAVA_OPTIONS} -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -XX:+DisableExplicitGC -XX:+UseLWPSynchronization"
JAVA_OPTIONS="${JAVA_OPTIONS} -XX:+PrintClassHistogram -XX:+HeapDumpOnOutOfMemoryError -Xloggc:sabagc.log -XX:+PrintGCDetails"

Мы думаем, что произошло то, что Permgen исчерпало пространство, что, в свою очередь, заставляет Tomcat перестать принимать запросы (от Apache через mod_jk). Это приводит к тому, что Apache начинает очередь запросов, отсюда и большое количество занятых серверов. Перезапуск Apache был краткосрочным решением, поскольку на самом деле он не решал проблему с памятью. При перезапуске JBoss память освободилась.

Насколько это правдоподобно, исходя из имеющейся информации? А есть решение увеличить память для XX: PermSize и XX: MaxPermSize?