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