Таймаут стресс-теста Tomcat - PullRequest
3 голосов
/ 15 ноября 2011

В настоящее время я изучаю проблемы в следующей системе:

  • 3,2 ГГц 8-ядерный компьютер, оперативная память 24 ГБ
  • Debian 6.0.2
    • ulimit-n 4096
    • ulimit -Sn 4096
    • ulimit -Hn 65535
  • Tomcat 6.0.28
    • -Xmx20g
  • MySQL 5.0.51a (через hibernate и несколько ручных запросов JDBC)
    • также достаточно места для кэширования

Я тестирую самые распространенные запросы к серверу с 2000 запросов в минуту удаленно.Инструмент тестирования является последним jMeter.Среднее время отклика составляет около 65 мс, минимальное значение равно 35, максимальное значение равно 4000 мс (в редких случаях, но у него есть причина).

Насколько я видел htop, системных характеристик достаточно как минимум в 3 разабольше запросов в минуту.(Среднее ЦП: 25%, ОЗУ: 5 из 22 ГБ) Сам сервер доступен постоянно.(Проверяйте его постоянно во время выполнения теста.)

Важным является тот факт, что каждый запрос приводит к 3 дополнительным запросам к локальному коту, где второй наконец получает необходимые данные, а последний - для статистики: jMeter (1) -> RESTeasy-Service (2) ->? -Service (2) -> Data-Service (2) - (новый поток)> Statistic-Service (2)

(1) - мой jMeterтестовый сервер и удаленный от (2), который является сервером Tomcat.Да, архитектура может быть немного странной, но это не моя вина.^^

Я переключил управление потоками на пул в server.xml.Установите максимальные потоки 1000 по умолчанию с 200 и 10 бездействующими с 4. Что я заметил, так это то, что число одновременных потоков, как никогда, уменьшается, а неуклонно возрастает до максимума tomcat , кажется .htop сообщает 160 потоков, пока tomcat остановлен.Около 460, когда это началось заново.(Кажется, что службы запускаются через несколько ...) После нескольких часов (иногда реже) попадания на сервер с 2000 запросами в минуту htop сообщает, что существует 1400 задач.Это кажется тем моментом, когда я начинаю получать тайм-ауты в jMeter.Поскольку это занимает очень много времени, я не смотрел его тысячу раз, и поэтому не могу гарантировать, что это причина, но именно так и происходит.

Основные вопросы:

  1. Математика говорит мне, что число одновременно используемых потоков никогда не должно превышать 600. (34 запроса * 4 запроса * 4 секунды = 544, даже меньше, но приблизительно 600 должно быть в порядке).Насколько я понимаю идею пула потоков, неиспользуемые потоки должны быть освобождены и остановлены, если простаивают слишком долго.Есть ли еще способ, которым я мог бы получить тысячи бездействующих (?) Потоков?И это нормально?

  2. Может ли поток, запущенный вручную в одном из процессоров запросов, запретить освобождение потоков tomcat?

  3. Shouldn 'Есть ли какие-либо сообщения в журнале, говорящие мне, что Tomcat не может создать / извлечь поток для запроса?

  4. Есть еще идеи?Я работаю над этим слишком долго, и теперь tomcat исчерпывает свой пул потоков, кажется единственной веской причиной этих странных таймаутов.Но, может быть, у кого-то есть другая подсказка.

Заранее спасибо, особенно если вы наконец-то сможете меня спасти от этого ...

Ответы [ 2 ]

1 голос
/ 16 апреля 2012

После нескольких часов и дней сногсшибательного я обнаружил, что таймауты случаются, когда Tomcat достигает своего предела потока, пока мы находимся в середине этих 3-х локальных отверстий подключения. Я предполагаю, что если он когда-нибудь достигнет этого предела, один поток ожидает открытия другого, что не произойдет, пока предыдущий не закроется. На немецком я бы назвал это Teufelskreis. ^^

Как бы то ни было, решением было поднять максимальное количество потоков до смешного большого числа:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="10000" minSpareThreads="10"/>

Я знаю, что это не должен быть путь, но, к сожалению, все мы здесь знаем, что наша архитектура несколько непрактична, и никто не получил время что-то изменить в этом.

Надеюсь, это кому-нибудь поможет. =)

0 голосов
/ 04 марта 2012

Полагаю, эта проблема требует понимания лежащего в основе соединения HTTP / 1.1 или HTTP / 1.1, поддерживающего соединение.

Если вы используете его для веб-службы REST, возможно, вы хотите установить для параметра maxKeepAliveRequests в конфигурации вашего коннектора значение 1.

    <Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000"
           maxKeepAliveRequests="1" 
           redirectPort="8443" />

Этот параметр можно найти в вашем $ CATALINA_HOME / conf / server.xml.

...