Проблема производительности Tomcat - PullRequest
0 голосов
/ 26 октября 2009

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

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

Я настроил 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, заставляя его ждать тела входящих запросов?

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

Ответы [ 2 ]

0 голосов
/ 26 октября 2009

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

0 голосов
/ 26 октября 2009

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

...