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




Нет, нет. Держите ваше количество потоков ограниченным и под контролем, чтобы вы не превышали системные ресурсы, предел Java обычно составляет около 100-200 живых потоков.
Хороший способ сделать это - использовать Executors из java.util.concurrent.
Ответ зависит от максимального количества одновременных подключений, которые вы ожидаете обработать. Вы должны разрешить столько потоков, сколько ожидаете соединений.
andreasmk2 неверно указывает количество потоков. Я запускал приложения с 1000 потоками и не имел проблем с системными ресурсами; конечно, это зависит от особенностей вашей системы. Вы столкнетесь с ограничением система, а не ограничением Ява.
Моя проблема в том, что я не знаю, как сформировать разумное ожидание количества одновременных подключений. Предположительно, в точке немного лучше отказаться от новых подключений, чем позволить всему замедляться, потому что слишком много обслуживаемых запросов make.
Реалистичные рабочие нагрузки сложно смоделировать, поэтому я ищу формулу, уже изученную кем-то другим.
(Очевидная верхняя граница - это максимальный размер кучи, деленный на минимальный объем памяти, необходимый для обслуживания запроса, но даже это трудно измерить в среде со сборщиком мусора.)
Очень простой и примитивный:
max_number_of_threads = количество_CPUs * C
Где C зависит от других факторов вашего приложения :-)
Задайте себе следующие вопросы:
Обычно я устанавливаю C довольно низко, например 2-10.
Спасибо. Я прочитал это так, будто не существует простой формулы. :-(
(Мое приложение является валидатором HTML5. Иногда оно явно ожидает на внешних серверах. Однако трудно определить, когда оно на самом деле связано с процессором, само по себе или через сборщик мусора.)
Я понимаю, что в то время, когда был задан этот вопрос, Servlet 3.0 еще не вышел. Но я подумал, что должен записать в этом вопросе возможность выполнения асинхронной обработки в контейнере сервлета с помощью сервлета 3.0. Это может помочь тем, кто сталкивается с этим вопросом. Излишне говорить, что для Servlet 3.0 достаточно ресурсов, которые указывают на то, что основные потоки сервлета теперь менее подвержены давлению! А у Jetty есть аналоги Async на тот случай, если кто-то не хочет использовать Servlet 3.0 API как таковой.