Apache Tomcat http умирает, перестает принимать запросы

На прошлой неделе я имел дело с агрессивным роботом-обходчиком / атакой. Бот распространяется со случайными IP-адресами и строкой агентов, поэтому их сложно заблокировать, но у меня есть другой поток для этого. Эта проблема заключается в том, что поток HTTP-запросов может привести к смерти Tomcat.

Процесс Tomcat все еще в порядке, и ему не хватает памяти, он просто перестает принимать запросы http или https. Он отключит любой http-запрос, но все равно будет принимать https-запросы (если http подвергается атаке, иногда https также умирает).

Я видел ошибку «слишком много открытых файлов», поэтому я изменил ограничение на количество файлов с 10000 до 50000, это, казалось, помогло, по крайней мере, https умирает, но http все еще умирает. В последнее время я не вижу «слишком много открытых файлов».

Похоже, слишком много открытых файлов, зачем Tomcat открывать так много файлов, может ли утечка файлов при высокой нагрузке? Иногда с сервером все в порядке в течение 6 месяцев (так что утечки не может быть при нормальных условиях), но раньше он останавливался из-за высокой нагрузки.

Веб-сайт - это большой сайт с> 1 миллионом страниц (динамическое содержимое) и> 1 миллионов обращений в день.

Что происходит, когда Tomcat получает поток HTTP-запросов (например,> 100 в секунду в течение длительного времени), я предполагаю, что запросы начнут резервное копирование, если при использовании пула потоков не останется потоков, будет ли он продолжать объединять запросы, пока что-то не сломается, или он начнет отклонять запросы?

Есть ли способ начать отклонять запросы после определенного объема резервного копирования? Кажется, это единственный способ предотвратить смерть или сбой при экстремальной нагрузке.

Мои настройки http и https отличаются, так что, возможно, это связано с тем, почему http умирает. https использует maxThreads, а http - нет (сколько потоков по умолчанию?)

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443"
               URIEncoding="UTF-8" />

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
               keystoreFile="..." keystorePass="..."
               URIEncoding="UTF-8"/>

Используя Tomcat v8.5.47, CentOS 7.6, Oracle Java 1.8

0
задан 29 February 2020 в 18:47
1 ответ

Оба этих коннектора будут использовать реализацию NIO.

Для 8.5.47 значение maxConnections по умолчанию - 10000, а невыполненное - 100.

Произойдет первые 10000 соединения будут приняты и будут по очереди выделены потокам в пуле потоков (по умолчанию 200 потоков) для обработки. Время, необходимое для обработки этих подключений, зависит от приложения.

Если текущих подключений 10000, следующие 100 запросов будут сохранены в журнале ожидания. В то время как Java пытается настроить это значение на 100, ОС может проигнорировать этот параметр.

После заполнения невыполненного журнала последующие соединения будут сброшены.

Вы можете (надеюсь) выяснить, почему HTTP не отвечает, взяв три дампа потока на расстоянии ~ 5 секунд, когда вы видите, что HTTP не отвечает.

1
ответ дан 30 March 2020 в 01:22

Теги

Похожие вопросы