Что такое хорошее отношение потоков Java к центральным процессорам на Солярисе?

У меня есть JAVA-приложение, которое имеет фиксированный пул потоков пятнадцать, машина, Солярис 10 SPARC, имеет шестнадцать центральных процессоров. Добавление пула значительно увеличило производительность, но я задаюсь вопросом, есть ли у меня слишком много потоков в пуле. Был бы производительность быть лучше с меньшим количеством потоков или делает Солярис, делают хорошее задание планирования потоков.

Скажите, что пул в большой степени использует пятнадцать центральных процессоров, затем другие потоки приложения требуют ЦП по различной причине, параллельная сборка "мусора" является хорошим примером. Теперь, пять центральных процессоров совместно используются пулом и другими потоками приложения. Затем центральные процессоры один - семь становятся свободными, Солярис переместит потоки, совместно использующие время на занятых центральных процессорах к свободным центральным процессорам?

В противном случае было бы лучше сохранить размер пула меньшим, так, чтобы всегда были свободные центральные процессоры для других потоков приложения? Соединяя проблему, использование ЦП является очень спорадическим в приложении.

6
задан paxdiablo 30 June 2010 в 12:27
поделиться

3 ответа

Если вы выполняете только интенсивные задачи на процессоре (без IO), N+1 потоков (где N - количество ядер) обеспечит оптимальное использование процессора.
+1, потому что у вас может произойти сбой страницы, терад может быть приостановлен по любой причине или небольшое время ожидания при синхронизации.

Для потоков, выполняющих IO, это не совсем просто, вам придется тестировать оптимальный размер.
В книге Java concurrency in practice предлагается этот алгоритм в качестве отправной точки:

N = number of CPUs
U = target CPU utilization (0 <= U <= 1)
W/C = ration of wait time to cpu time (measured through profiling)

threads = N * U * (1 + W/C)

IBM использует тот же алгоритм в своей статье Java theory and practice: Thread pools and work queues, с фиксированным U=1. Факт N+1 также можно прочитать в статье IBM, чтобы обеспечить происхождение обоих тезисов.

4
ответ дан 17 December 2019 в 20:28
поделиться

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

Причина в том, что несколько потоков могут быть заблокированы при вводе-выводе или в любой момент времени. Так что наличие еще нескольких потоков, готовых к выполнению, никогда не повредит.

1
ответ дан 17 December 2019 в 20:28
поделиться

Обычно, если вы можете установить соответствие 1: 1 между потоками и процессорами, вы получите оптимальную производительность. Это предполагает, что пользовательские потоки отображаются 1 к 1 с потоками ядра. Если я правильно помню, Solaris допускает использование нескольких потоков ядра, а также пользовательских потоков, так что в этом отношении у вас должно быть все в порядке. Вы столкнетесь с узкими местами, когда более одного потока используют один и тот же процессор.

Как всегда, лучший совет на ваш вопрос об уменьшении размера пула потоков: «Попробуйте и протестируйте его». (но я подозреваю, что в этом случае будет лучше.)

Что касается вашего вопроса о других запущенных приложениях, Solaris будет использовать ЦП для переключения между пулом потоков и другим приложением. Если ЦП становится свободным, Solaris переместит некоторые потоки на свободный ЦП.

РЕДАКТИРОВАТЬ: Здесь - ссылка от Sun о том, как взаимодействуют модели потоков Solaris и Java.

-3
ответ дан 17 December 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: