Я использую соединитель 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"
/>
Как я могу определить оптимальный размер maxThreads моего NIO / APR Connector для Tomcat?
Какое начальное значение maxThreads является хорошим?
Конфигурация OOTB обычно составляет 150-200 общих потоков приема для каждого соединителя. Это значение по умолчанию предназначено для приложений средней нагрузки / сложности на «среднем» оборудовании.
Как правило, легковесное высокопроизводительное приложение должно использовать максимум 150 (принимающих) потоков на одно ядро ЦП (всего 600 на четырехъядерном корпусе). Более консервативная настройка для более тяжелых приложений будет 300 принимаемых потоков. Я ожидал, что большинство требований будут где-то посередине (но для этого потребуется некоторый анализ), но это очень ситуативно - см. Ответ @ zagrimsan.
Очевидно, что HTTPS имеет несколько более высокие накладные расходы, поэтому стандартной практикой является соответствующее уменьшение количества принимаемых потоков.
Использование APR / собственного коннектора может улучшить пропускную способность, но ограничивающим фактором обычно является профиль приложения, поэтому, опять же, никаких магических чисел.
Опасность использования слишком высокой настройки потока состоит в том, что сервер может стать «окончательно загруженным» - когда так много времени тратится на управление потоками и требованиями приложений, страдает все остальное (GC является одним из симптомов). Это кажется нелогичным, но обычно лучше меньше, да лучше.
Занятый сервер с правильно настроенным счетчиком потоков будет постепенно ухудшаться при большой нагрузке. Слишком высоко - он упадет!
Теперь есть ряд связанных настроек (количество приемов, минимальное количество потоков, ожидание и т. Д.), Которые также потребуют корректировки, но это выходит за рамки этого ответа.
Ответ зависит от нагрузки, которую вы ожидаете обслужить.
Цитируя принятый ответ от ветка из StackOverflow который, хотя и говорит о настройке с Tomcat и Apache, применим и здесь:
Вы должны учитывать рабочую нагрузку, которую могут получить серверы.
Наиболее важным фактором может быть количество одновременно подключенных клиентов в часы пик. Попробуйте определить его и настроить параметры таким образом, чтобы:
- существует достаточно потоков обработки [...], поэтому им не нужно создавать новые потоки, когда сервер сильно загружен
- на серверах не намного больше потоков обработки, чем необходимо, поскольку они будут тратить ресурсы.
[...]
Например, рассмотрим приложение, в котором у вас ~ 300 новых запросов в секунду. Для обслуживания каждого запроса требуется в среднем 2,5 секунды. Это означает, что в любой момент времени у вас есть ~ 750 запросов, которые необходимо обрабатывать одновременно. В этой ситуации вы, вероятно, захотите настроить свои серверы так, чтобы у них было ~ 750 потоков обработки при запуске, и вы можете добавить что-то вроде ~ 1000 потоков обработки максимум для обработки чрезвычайно высоких нагрузок.