Проблема с производительностью Tomcat

У меня есть веб-приложение, которое работает очень медленно и иногда зависает. Это школьное приложение Wicket с отчетами и редактированием, а также сервлет, который используется автоматическими клиентами для получения/отправки данных через HTTPS.

В загруженное время, когда происходит много редактирования/загрузки/загрузки, приложение становится вялым и не отвечает. Я получаю ошибки Wicket "PageMap все еще заблокирован". Tomcat, кажется, продолжает пыхтеть. Использование памяти управляемо, около 50M.

Я настроил YourKit, чтобы получить некоторую информацию о профилировании, и в период занятости обнаружил, что 81% процессорного времени Tomcat тратится здесь:

org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run()
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(Object[])
org.apache.jk.common.ChannelSocket.processConnection(MsgContext)
org.apache.jk.common.ChannelSocket.receive(Msg, MsgContext)
org.apache.jk.common.ChannelSocket.read(MsgContext, byte[], int, int)
java.io.BufferedInputStream.read(byte[], int, int)
java.io.BufferedInputStream.read1(byte[], int, int)
java.io.BufferedInputStream.fill()
java.net.SocketInputStream.read(byte[], int, int)
[Wall Time]  java.net.SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int)

В этом приложении около 250 клиентов опрашивают сервер через SSL, запрашивая обновления каждые 30 секунд. В большинстве случаев это быстро возвращает пустой ответ. Иногда происходит всплеск активности БД, и клиенту может быть отправлено множество данных (несколько МБ).

Так откуда же эти 81% активности? Могут ли несколько клиентов с очень медленными соединениями тормозить потоки tomcat, заставляя его ждать тела входящих запросов?

Кто-нибудь видел что-нибудь подобное, или есть какие-либо советы о том, как проверить/устранить неполадки/исправить это?


person Sam Barnum    schedule 26.10.2009    source источник
comment
Насколько велики наборы данных, которые передаются по сети?   -  person popester    schedule 26.10.2009
comment
Когда на сервере редактируется одна запись, все клиенты загружают только измененные записи. 1 или 2 к. Если клиент сброшен, он загружает все данные для школы. Вероятно, не более 5 МБ.   -  person Sam Barnum    schedule 26.10.2009
comment
Загрузка всех данных звучит довольно противно. Нужны ли клиенту все эти данные? Можете ли вы сделать что-то вроде пейджинга? Кроме того, как клиент получает данные? Скрипты вызовов какой-то веб-службы?   -  person popester    schedule 26.10.2009
comment
Вы уверены, что здесь тратится процессорное время, а не простое ожидание? используйте «top» или что-то в этом роде, чтобы увидеть, насколько высока загрузка ЦП. Какая версия Tomcat, Java? Почему бы немного не увеличить кучу, чтобы посмотреть, поможет ли это? у вас есть свидетельство того, что собирается много мусора, что указывает на нехватку памяти в системе. Как вы уверены, что ваше приложение не использует всю память?   -  person Sean Owen    schedule 26.10.2009
comment
@popester: клиенту действительно нужны данные. Я мог бы делать это партиями, но это сильно усложнило бы ситуацию. Я транслирую его, поэтому он должен поддерживать большие наборы.   -  person Sam Barnum    schedule 26.10.2009
comment
@Sean: Я считаю, что использование ЦП Tomcat высоко во время тяжелых нагрузок, оно достигает 25%, на том, что я считаю четырехъядерным компьютером, поэтому я думаю, что он полностью использует одно из ядер (я немного не уверен в аппаратная штука однако)   -  person Sam Barnum    schedule 26.10.2009
comment
Версия Tomcat — 5.5.27 Java — версия jre1.5.0_19\bin\client\jvm.dll Размер кучи установлен равным 1400 МБ. Когда я устанавливаю его выше, Tomcat отказывается запускаться. Я считаю, что это потому, что это 32-битная Java. На сервере доступно 8 ГБ, на котором также работает база данных MS-SQL. Должен ли я перейти на 64-битную Java и выделить больше оперативной памяти?   -  person Sam Barnum    schedule 26.10.2009
comment
каковы ваши параметры JVM .. увеличение кучи может не быть ответом.   -  person Ryan Fernandes    schedule 26.10.2009
comment
Единственными пользовательскими параметрами виртуальной машины является установка максимальной кучи: -Xmx1400m Повышение ее выше этого значения предотвращает запуск Tomcat.   -  person Sam Barnum    schedule 26.10.2009


Ответы (2)


Вам следует настроить тестовую среду и попытаться воспроизвести это с помощью нагрузочного теста.
Так вы сможете выявить причину. В противном случае факторов слишком много.
Кроме того, таким образом вы можете исправлять ошибки, не ставя под угрозу рабочую среду.

person thethinman    schedule 26.10.2009

Возможно, причиной является использование памяти.
Вам следует проверить использование памяти для процесса java, чтобы увидеть, сколько он получает.
Если памяти недостаточно, вы должны установить параметр Xmx jvm везде, где он установлен для tomcat. .

person thethinman    schedule 26.10.2009
comment
Сегодняшнее тестирование показывает, что GC работает стабильно, так как я увеличил размер кеша объектов JPA. Приложение использует около 1,1 ГБ оперативной памяти. - person Sam Barnum; 26.10.2009