Подходящие параметры запуска Tomcat 5.5 для настройки JVM для чрезвычайно высокого требования, веб-приложение с большой кучей?
Недавно мы перенесли большое веб-приложение с высокими требованиями к Tomcat 5.5 из Tomcat 4 и заметили некоторые странные замедления, которые, по-видимому, связаны с паузами JVM. Чтобы запустить наше приложение и поддерживать повышенную нагрузку на Tomcat 4 с течением времени, многие нестандартные параметры JVM были установлены и настроены в соответствии с приведенным ниже описанием, и я надеюсь, что кто-то, имеющий опыт настройки Tomcat JVM, может прокомментировать все, что может быть вредным установить Tomcat 5.5. Также обратите внимание, что некоторые из них могут быть перенесены из предыдущих версий Java (в течение некоторого времени мы успешно запускали Tomcat 4 на Java 1.6 с этими параметрами, но некоторые могли быть введены для помощи в сборке мусора в Java 1.4, которая была основой Наш Tomcat 4 устанавливается долго, и теперь может принести больше вреда, чем пользы).
Некоторые заметки:
- Объем памяти приложения составляет около 1 ГБ, возможно, немного больше.
- Процессор не является проблемой - все машины, обслуживающие приложение (с балансировкой нагрузки), < 30% CPU
- Много запаса по физической памяти на машинах.
- -XX: MaxPermSize = 512m был единственным параметром, добавленным как часть обновления 5.5, и реагировал на проблему нехватки памяти в permgen (которая была решена).
- Работает на Java 1.6, ОС Solaris
-server -Xms1280m -Xmx1280m -XX:MaxPermSize=512m -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio: 75 AggressiveOpts -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-TraceClassUnloading -Dsun.io.useCanonCaches=false -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=600
5 ответов
Один из Чемпионов Java, блог Кирка Пеппердина: http://kirk.blog-city.com/how_to_cripple_gc_ergonomics.htm.
Цитата 1
"Документация GC расскажет вам, на что влияет настройка, но часто не сообщая, каков будет эффект. Самый большой ключ к тому, что вы выбрали неправильный развил на дороге, - это когда вы явно устанавливаете значение, а затем подсказываете GC эргономика. Еще одна подсказка в том, что если у вас нет веской причины для настройки параметра. И только потому, что некоторые так называемые эксперты говорят, что этот параметр работает лучше всего, это только шум, а не звук и, конечно, не причина ".
Цитата 2 "Как я уже говорил в предыдущей записи блога, не трогайте ручки, если у вас нет веских причин для этого. Если вам нужно дотронуться до ручек, слегка используйте только те, которые помогают эргономике, а не те это ограничивает возможности эргономики для достижения ваших целей паузы и производительности ".
Итак, я бы предложил вам вернуться на равнину
-server -Xms1280m -Xmx1280m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:-TraceClassUnloading -Dsun.io.useCanonCun.net.conf = 600D -Dsun.net.client.defaultReadTimeout=60000
Найдите, если это даст вам лучшую производительность. Если да, придерживайтесь этого
Кстати, -XX:MaxPermSize=378m есть какие-либо проблемы?
Java 1.6 имеет намного лучшую эргономику, чем 1.4. Вы можете настроить его менее чем на 1,4
Кстати, вы пробовали Tomcat 6? Tomcat 6 работает намного лучше на Java 6, чем Tomcat 5.5.
PS: Я уже некоторое время использую Tomcat и обычно стараюсь дать JDK от Sun бесплатное господство с небольшими настройками здесь и там.
Только что нашел вебинар от разработчиков tomcat по настройке tomcat: http://springsource.com/node/555. продолжение вебинара: http://blog.springsource.com/2008/10/14/optimising-and-tuning-apache-tomcat-part-2/
BR,
~ A
Как кто-то, кто также занимается этим, у меня, конечно, нет никаких окончательных ответов, особенно с учетом того, насколько специфичны приложения такого рода вещи. Хорошая ссылка, которую вы, вероятно, видели, здесь:
http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html
Тем не менее, это довольно длинный список параметров jvm, что говорит о том, что, вероятно, установлены ненужные параметры, особенно если учесть, что у вас есть несколько параметров отладки (PrintGCDetails, PrintGCTimeStamps, TraceClassUnloading), которые не могут быть полезны в производственном приложении. 60 секундный тайм-аут может также потреблять ресурсы. "сервер" по умолчанию, но не принесет никакого вреда.
Как приложение работает с минимальными параметрами настройки (размер jvm, MaxPermSize)?
Вы также можете взглянуть на изменение минимального / максимального количества потоков, которые Tomcat будет использовать для обработки запросов в conf/server.xml
:
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" ...
Одно практическое правило, которое я слышал в предыдущей работе, состояло в том, что maxThreads должен быть равен количеству одновременных соединений, которые вы ожидаете обработать. Я не уверен, насколько научна эта претензия, хотя я, конечно, думаю, что это имеет смысл, поскольку вы не хотите, чтобы клиенты блокировались в ожидании освобождения потока для обработки их запроса.
Возможно, стоит поэкспериментировать с альтернативной JVM (например, JRockit), чтобы увидеть, хорошо ли подходят различия в модели сборки мусора для вашего приложения.