2008-10-14 4 views
11

Недавно мы перевели большое приложение с высоким требованием к Tomcat 5.5 от Tomcat 4 и отметили некоторые особенности замедления, которые, как представляется, связаны с паузами JVM. Чтобы запустить наше приложение и поддерживать повышенную нагрузку с течением времени на Tomcat 4, многие нестандартные параметры JVM были настроены и настроены в соответствии с приведенным ниже, и я надеюсь, что кто-то с настройкой Tuncat JVM может прокомментировать все, что может быть вредным к установке Tomcat 5.5. Также обратите внимание, что некоторые из них могут переноситься из предыдущих версий Java (мы использовали Tomcat 4 на Java 1.6 с этими параметрами успешно в течение некоторого времени, но некоторые из них, возможно, были введены, чтобы помочь сборку мусора на Java 1.4, которая была основой наш Tomcat 4 устанавливается в течение длительного времени и может теперь принести больше вреда, чем пользы).Соответствующие параметры запуска Tomcat 5.5 для настройки JVM для чрезвычайно высокого спроса, большое приложение для кучи веб-страниц?

Некоторые примечания:

  • объем памяти приложений является около 1 Гб, вероятно, чуть больше.
  • процессора не является проблемой - все машины обслуживающих приложения (нагрузки сбалансировано) являются < 30% процессора
  • Много запаса по физической памяти на машинах.
  • -XX: MaxPermSize = 512m был единственным параметром, добавленным как часть обновления 5.5, и реагировал на проблему нехватки пространства памяти outofmemory (которая была решена).
  • Запуск на Java 1.6, ОС Solaris

-server -Xms1280m -Xmx1280m -XX: MaxPermSize = 512m -XX: ParallelGCThreads = 20 -XX: + UseConcMarkSweepGC -XX: + UseParNewGC -XX: SurvivorRatio = 8 -XX: TargetSurvivorRatio = 75 -XX: MaxTenuringThreshold = 0 -XX: + AggressiveOpts -XX: + PrintGCDetails -XX: + PrintGCTimeStamps -XX: -TraceClassUnloading -Dsun.io.useCanonCaches = false -Dsun.net.client.defaultConnectTimeout = 60000 -Dsun.net.client.defaultReadTimeout = 60000

ответ

7

Один из чемпионов Java, блог Кирка Пеппердина: http://kirk.blog-city.com/how_to_cripple_gc_ergonomics.htm.
Цитата 1 «Документация GC сообщит вам, что влияет на настройку, но часто, не сообщая, какой эффект будет. Самая большая подсказка, что вы взяли неправильную вилку на дороге, - это когда вы явно устанавливаете значение, а затем даете намек на эргономику GC. Еще одна подсказка заключается в том, что у вас нет разумной причины для настройки настройки. И только потому, что какой-то так называемый эксперт говорит, что этот параметр работает лучше всего, это только шум, а не звук и не обязательно причина ».

Цитата 2 «Как я уже говорил в предыдущей записи в блоге, не прикасайтесь к кнопкам, если у вас нет веских оснований для этого.Если вы должны прикасаться к ручкам, слегка используйте только те, которые помогают эргономике, а не те, которые вызывают проблемы, разрушая эргономичность, чтобы соответствовать вашим временам паузы и пропускной способности. »

Итак, я бы посоветовал вернуться к plain
-server -Xms1280m -Xmx1280m -XX: MaxPermSize = 512m -XX: + UseConcMarkSweepGC -XX: + PrintGCDetails -XX: + PrintGCTimeStamps -XX: -TraceClassUnloading -Dsun.io.useCanonCaches = false -Dsun.net.client. defaultConnectTimeout = 60000 -Dsun.net.client.defaultReadTimeout = 60000

Найти, если это дает лучшую производительность Если да, то придерживайтесь его
BTW, сделал -XX:.? MaxPermSize = 378m есть вопросы
Java 1.6 имеет гораздо лучшую эргономичность, чем 1,4. Возможно, вы захотите настроить его менее чем на 1,4
Кстати, вы пробовали Tomcat 6? Tomcat 6 работает намного лучше на Java 6, чем Tomcat 5.5.

P.S: Я использую Tomcat какое-то время и обычно стараюсь дать бесплатное правление JDK для солнца с небольшой настройкой здесь и там.

3

Как и кто-то, кто посреди общения с этим, я, конечно же, не имею окончательных ответов, особенно учитывая, как это относится к конкретным приложениям. Хорошая ссылка, что вы, вероятно, видели, здесь:

http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

Однако, это довольно длинный список параметров Jvm, что свидетельствует о том, что есть набор вероятно ненужные параметры, особенно с учетом того, что у вас есть несколько отладки параметры (PrintGCDetails, PrintGCTimeStamps, TraceClassUnloading), которые не могут быть хорошими в производственном приложении. 60 секундных таймаутов также могут потреблять ресурсы. «сервер» по умолчанию, но не повредит.

Как приложение работает с минимальными параметрами настройки (размер jvm, MaxPermSize)?

+1

У меня много рабочих JVM, работающих с PrintGCDetails, всегда есть * некоторые * накладные расходы, но незначительные для значения, которое они предоставляют. – Xailor

4

только что нашел вебинар от разработчиков tomcat по настройке tomcat: http://springsource.com/node/555. Последующий до вебинара: http://blog.springsource.com/2008/10/14/optimising-and-tuning-apache-tomcat-part-2/

BR,
~ A

+0

Ссылка на этот веб-семинар мертва. Не думаю, что у вас есть более поздняя ссылка на него, не так ли? –

1

Вы также можете взглянуть на изменение мин/макс количество потоков, Tomcat будет использовать для обработки запросов в conf/server.xml:

<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" ... 

Одно правило, которое я слышал в предыдущей работе было то, что MaxThreads должно быть равно количеству одновременных подключений, которые вы ожидаете в обращении. Я не уверен, что наука, которая утверждает, хотя, хотя я, конечно, считаю, что это имеет смысл, так как вы не хотите, чтобы клиенты были заблокированы, ожидая, когда поток освободится, чтобы обработать их запрос.

+0

Правило подсчета голосов, которое я слышал, - это принять процессор% от среднего потока и # из ядер выполнения. Нити должны быть Cores/Thread%. Если у вас 8 ядер, и каждый поток использует 25% процессор, тогда 8/.25 = 32 потока. Лучше для подключения ждать немного, чем для замедления любого другого соединения. –

+0

Я не думаю, что есть какое-либо правило, которое вы можете использовать для вычисления, оно полностью зависит от количества ресурсов, потребляемых каждой нитью. Я считаю, что максимальное число до тех пор, пока оно не достигнет максимума при максимальной нагрузке, является хорошим вариантом. То, что вы не хотите ни при каких обстоятельствах, заключается в том, что вы начинаете использовать файл с файлами, потому что сервер будет замедляться настолько, что он мог бы также разбиться! Больше потоков! = Больше пропускной способности. Если 1 Thread использует большую часть доступных ресурсов, то лучше всего придерживаться 1 потока. Вы сможете обрабатывать 10 потоков ALOT быстрее, чем 10 одновременных. – Brian

0

Может также быть стоит экспериментировать с альтернативной JVM (например, JRockit), чтобы увидеть, хорошо ли подходят для вашей модели различия в модели сбора мусора.