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

Как я могу определить оптимальный размер maxThreads моего NIO / APR Connector для Tomcat?

Я использую соединитель NIO / APR для Tomcat7.

Например.

<Connector port="8080" 
        protocol="org.apache.coyote.http11.Http11AprProtocol" 
        connectionTimeout="3000"
        redirectPort="8443" 
        URIEncoding="UTF-8" 
        maxPostSize="0"
        maxThreads="200"
        enableLookups="false"
        disableUploadTimeout="false"
        maxKeepAliveRequests="-1"
        useBodyEncodingForURI="true"
        compression="on"
        compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"   
        />
  1. Как я могу определить оптимальный размер maxThreads моего NIO / APR Connector для Tomcat?

  2. Какое начальное значение maxThreads является хорошим?

Конфигурация OOTB обычно составляет 150-200 общих потоков приема для каждого соединителя. Это значение по умолчанию предназначено для приложений средней нагрузки / сложности на «среднем» оборудовании.

Как правило, легковесное высокопроизводительное приложение должно использовать максимум 150 (принимающих) потоков на одно ядро ​​ЦП (всего 600 на четырехъядерном корпусе). Более консервативная настройка для более тяжелых приложений будет 300 принимаемых потоков. Я ожидал, что большинство требований будут где-то посередине (но для этого потребуется некоторый анализ), но это очень ситуативно - см. Ответ @ zagrimsan.

Очевидно, что HTTPS имеет несколько более высокие накладные расходы, поэтому стандартной практикой является соответствующее уменьшение количества принимаемых потоков.

Использование APR / собственного коннектора может улучшить пропускную способность, но ограничивающим фактором обычно является профиль приложения, поэтому, опять же, никаких магических чисел.

Опасность использования слишком высокой настройки потока состоит в том, что сервер может стать «окончательно загруженным» - когда так много времени тратится на управление потоками и требованиями приложений, страдает все остальное (GC является одним из симптомов). Это кажется нелогичным, но обычно лучше меньше, да лучше.

Занятый сервер с правильно настроенным счетчиком потоков будет постепенно ухудшаться при большой нагрузке. Слишком высоко - он упадет!

Теперь есть ряд связанных настроек (количество приемов, минимальное количество потоков, ожидание и т. Д.), Которые также потребуют корректировки, но это выходит за рамки этого ответа.

Ответ зависит от нагрузки, которую вы ожидаете обслужить.

Цитируя принятый ответ от ветка из StackOverflow который, хотя и говорит о настройке с Tomcat и Apache, применим и здесь:

Вы должны учитывать рабочую нагрузку, которую могут получить серверы.

Наиболее важным фактором может быть количество одновременно подключенных клиентов в часы пик. Попробуйте определить его и настроить параметры таким образом, чтобы:

  • существует достаточно потоков обработки [...], поэтому им не нужно создавать новые потоки, когда сервер сильно загружен
  • на серверах не намного больше потоков обработки, чем необходимо, поскольку они будут тратить ресурсы.

[...]

Например, рассмотрим приложение, в котором у вас ~ 300 новых запросов в секунду. Для обслуживания каждого запроса требуется в среднем 2,5 секунды. Это означает, что в любой момент времени у вас есть ~ 750 запросов, которые необходимо обрабатывать одновременно. В этой ситуации вы, вероятно, захотите настроить свои серверы так, чтобы у них было ~ 750 потоков обработки при запуске, и вы можете добавить что-то вроде ~ 1000 потоков обработки максимум для обработки чрезвычайно высоких нагрузок.