Как выбрать максимальное количество потоков для контейнера сервлетов HTTP?

Я разрабатываю спокойную веб-службу, которая работает как сервлет (с использованием блокировки ввода-вывода) в Jetty. Определить оптимальную настройку для максимального количества потоков кажется трудным.

Есть ли исследованная формула для определения максимального количества потоков на основе некоторых легко измеримых характеристик остальной части установки?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
0
4 959
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Нет, нет. Держите ваше количество потоков ограниченным и под контролем, чтобы вы не превышали системные ресурсы, предел Java обычно составляет около 100-200 живых потоков.

Хороший способ сделать это - использовать Executors из java.util.concurrent.

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

andreasmk2 неверно указывает количество потоков. Я запускал приложения с 1000 потоками и не имел проблем с системными ресурсами; конечно, это зависит от особенностей вашей системы. Вы столкнетесь с ограничением система, а не ограничением Ява.

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

Реалистичные рабочие нагрузки сложно смоделировать, поэтому я ищу формулу, уже изученную кем-то другим.

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

Ответ принят как подходящий

Очень простой и примитивный:

max_number_of_threads = количество_CPUs * C

Где C зависит от других факторов вашего приложения :-)

Задайте себе следующие вопросы:

  • Будет ли ваше приложение интенсивно использовать ЦП (ниже C) или проводить большую часть времени в ожидании третьей системы (выше C)?
  • Вам нужно более быстрое время отклика (ниже C) или у вас есть возможность обслуживать сразу несколько пользователей, даже если каждый запрос занимает больше времени (выше C).

Обычно я устанавливаю C довольно низко, например 2-10.

Спасибо. Я прочитал это так, будто не существует простой формулы. :-(

(Мое приложение является валидатором HTML5. Иногда оно явно ожидает на внешних серверах. Однако трудно определить, когда оно на самом деле связано с процессором, само по себе или через сборщик мусора.)

Я понимаю, что в то время, когда был задан этот вопрос, Servlet 3.0 еще не вышел. Но я подумал, что должен записать в этом вопросе возможность выполнения асинхронной обработки в контейнере сервлета с помощью сервлета 3.0. Это может помочь тем, кто сталкивается с этим вопросом. Излишне говорить, что для Servlet 3.0 достаточно ресурсов, которые указывают на то, что основные потоки сервлета теперь менее подвержены давлению! А у Jetty есть аналоги Async на тот случай, если кто-то не хочет использовать Servlet 3.0 API как таковой.

Другие вопросы по теме