но я еще не пробовал.

я есть старый Java-код для службы REST, который использует отдельный поток для каждого входящего запроса. То есть основной цикл зацикливается на socket.accept () и передает сокет в Runnable, который затем запускает собственный фоновый поток и запускает run сам по себе. Некоторое время это работало восхитительно, пока недавно я не заметил, что задержка принятия на обработку запроса станет неприемлемой при высокой нагрузке. Когда я говорю восхищенно хорошо, я имею в виду, что он обрабатывает 100-200 запросов в секунду без значительной загрузки ЦП. Производительность ухудшалась только тогда, когда другие демоны добавляли нагрузку, а затем только после того, как нагрузка превысила 5. Когда машина находилась под высокой нагрузкой (5-8) из-за комбинации других процессов, время от принятия до обработки было бы невероятно высоким ( 500 мс до 3000 мс), в то время как фактическая обработка осталась меньше 10 мс. Это все на двухъядерных системах Centos 5.

Будучи привыкшим к Threadpools в .NET, я предположил, что создание потоков было виновником, и я подумал, что применил бы тот же шаблон в Java. Теперь мой Runnable выполняется с ThreadPool.Executor (а пул использует и ArrayBlockingQueue). Опять же, он прекрасно работает в большинстве сценариев, если только нагрузка на машину не становится высокой, тогда время от создания runnable до запуска run () показывает примерно одинаковое смешное время. Но что еще хуже, загрузка системы почти удвоилась (10-16) с логикой пула потоков. Так что теперь у меня такие же проблемы с задержкой при удвоении нагрузки.

Я подозреваю, что конкуренция за блокировку очереди хуже, чем стоимость запуска нового нового потока без блокировок. Может кто-нибудь поделиться своим опытом новой темы против Threadpool. И если мое подозрение верно, у кого-нибудь есть альтернативный подход к работе с пулом потоков без конфликта блокировок?

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

спасибо арне

ОБНОВЛЕНИЕ: я переключился наExecutors.newFixedThreadPool(100); и в то время как он поддерживал ту же вычислительную мощность, нагрузка почти сразу удваивалась, и при работе в течение 12 часов нагрузка оставалась стабильно равной 2x. Я предполагаю, что в моем случае новый поток на запрос дешевле.

Ответы на вопрос(4)

Ваш ответ на вопрос