Назад | Перейти на главную страницу

Периодически очень долгое время отклика при загрузке документов

У меня есть веб-приложение Java, работающее на Tomcat 7 с Apache httpd 2.2, выходящим на mod_jk / AJP.

Одна часть приложения обслуживает файлы (размером до 4 МБ). Теперь, как правило, все идет очень гладко со стабильным низким временем отклика. Однако в редких случаях (<0,1% загрузок) время загрузки превышает 1 минуту. После активации ThreadStuckValve в Tomcat я вижу, что длинные ответы, похоже, застревают на

org.apache.tomcat.jni.Socket.sendbb(Native method)

то есть сетевой ввод / вывод. В лучшем случае эти длительные загрузки занимают 5 минут, что, как я подозреваю, связано с таймаутом по умолчанию в 300 секунд в Apache 2.2 (http://httpd.apache.org/docs/2.2/mod/core.html, "Директива TimeOut").

Для меня это похоже на проблемы с сетью. Тайм-аут Apache (если это то, что начинается на отметке 5 минут) указывает, что пакеты ACK не передаются правильно. Мои вопросы: что могло быть причиной этого? Браузер закрыт на принимающей стороне, но сокет не сигнализирует о закрытии должным образом? Потеря пакетов или другой отказ сети при передаче? С чего бы мне начать устранение неполадок?

Мы запускаем Tomcat и Apache на Windows server 2008-R2 на виртуализированном сервере vmware.

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

Также стоит отметить, что если такого рода неправильное поведение оказывает значительное влияние на ваше приложение, вы подвержены некоторым простым векторам DoS-атак (Slowloris приходит на ум как одна из возможностей, хотя что-то, что сводится к вашему приложению и исчезает, может быть более эффективным).