У меня есть ряд Java процессов, использующих OpenJDK 11, работающих на Windows Сервер 2019. Сервер имеет два физических процессора и 36 ядер всего; это машина HP. Когда я запускаю свои процессы, я вижу распределение работы в диспетчере задач по всем ядрам. Это хорошо. Однако после того, как процессы выполняются в течение некоторого периода времени, а не определенного времени, машина начинает использовать только половину ядер.
Я работаю над несколькими теориями:
У JDK есть некоторая проблема, которая не позволяет ему постоянно обращаться ко всем ядрам.
Что-то с Windows Сервер 2019 вызывает проблему, ограничивая Java от доступ ко всем ядрам.
Существует проблема управления температурой, и один процессор перегревается, а ОС направляет всю обработку на другой процессор.
Существует некоторая проблема с гиперпоточностью и «логическими» процессорами, из-за которой процесс не может использовать все ядра.
Я пробовал поиск JDK проблем и не нашел ничего подобного упомянутому. Я спустился на сервер, и пока он работал немного тепло, он не выглядел чрезмерно горячим. Я еще не пробовал отключать гиперпоточность. Я пробовал ряд параметров, чтобы заставить JVM использовать все ядра, и действительно, процесс изначально использует все ядра; Я вижу активность в диспетчере задач.
У кого-нибудь есть мысли? Это действительно непонятная проблема, и я буду признателен за любые идеи.
ОБНОВЛЕНИЕ: я могу заставить его использовать другой процессор с помощью диспетчера задач, чтобы назначить один из процессов java .exe для другой процессор. Это также работает из вызова java в командной строке, а также с аргументом, для которого используется сокет.
Теперь все равно, что это похоже на хак. Я не понимаю, почему мне нужно вручную назначать сокет каждому из моих java процессов; эту работу следует оставить ОС. Я до сих пор не уверен, где именно проблема, если это ОС или что.