У меня есть веб-приложение, которое работает очень медленно и иногда зависает. Это школьное приложение 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, заставляя его ждать тела входящих запросов?
Кто-нибудь видел что-то подобное, или есть какие-либо советы о том, как проверить / устранить / исправить это?