Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

ForkJoinPool - работа на нескольких ядрах

#java #многопоточность


ForkJoinPool общий имеет параллельность "кол-во ядер - 1", соответственно если есть
4 ядра, то из 4 запущенных потоков 1 будет чередоваться с остальными в выполнении на
ядре. Но почему если я создаю собственный FJP, и задаю ему параллельность равную 4,
то все равно те же 4 потока выполняются на 3 ядрах? Это я проверил так: запустил объемную
задачу для каждого из 2 потоков - в каждом из потоков выполнилась за 3.3 сек, запустил
задачу для 3 потоков - те же 3.3 сек для каждого потока, запустил задачу для 4 потоков
- все, выполнение в каждом заняло 4-5 сек.
Разве JVM резервирует себе аж одно ядро на GC и т д?
    


Ответы

Ответ 1



Общий ответ наверное такой - зависит от реализации JVM. При создании своего ForkJoinPool в системе появляются два ForkJoinPool, потому что один системный используется например в StreamAPI. В таком случае планировать загрузку ЦПУ становится намного сложнее. Поэтому для создания еще одного ForkJoinPool нужно иметь конкретное обоснование. Рекомендуется использовать системный Надо еще смотреть каким образом разбилась задача.Т.е. оптимальное соотношение - размер задачи делится на число ядер, а потом еще на поправочный коэффициент 10..100. Иначе либо ядра не будут задействованы, либо большая часть времени пойдет не на задачу, а ее деление ее на подзадачи. Надо осторожно относиться к замерам, измеренным "на коленке". Слишком много подводных камней в этой теме. И конечно нужен код чтоб понять что измерилось, желательно с указанием конкретной JVM и операционной системы, имеющегося "железа". Но если говорить о тестах "на коленке" то вот что дал запуск теста ForkJoinPool на моей машине: Прошу не обращать внимание на конкретные числа - просто это время выполнения. Важны относительные показатели. Выигрыш при паралелизме = 4 есть, просто здесь как и во многих других областях жизни соблюдается закон предельной полезности - каждая следующая единица ресурса приносит все меньше пользы. Удивило что семерка при параллелизме = 1 лучше оказалась. Вот нагрузка на процы - т.е. в моем случае нагрузка полная при параллелизме 4:

Комментариев нет:

Отправить комментарий