JVM 仅使用服务器上的一半内核

tuj*_*tuj 5 java multithreading hyperthreading

我有许多使用 OpenJDK 11 的 Java 进程在 Windows Server 2019 上运行。该服务器有两个物理处理器和 36 个总内核;这是一台惠普机器。当我启动我的流程时,我会在任务管理器中看到所有内核的工作分配。这很好。然而,在进程运行一段时间后,不是一致的时间量,机器开始只使用一半的内核。

我正在研究一些理论:

  1. JDK 存在一些问题,阻止它始终如一地访问所有内核。

  2. Windows Server 2019 出现问题,限制 Java 访问所有内核。

  3. 存在热管理问题,一个处理器变得太热,操作系统将所有处理工作转移到另一个处理器。

  4. 超线程和“逻辑”处理器存在一些问题,导致进程无法利用所有内核。

我试过搜索 JDK 问题,但没有找到类似的内容。我去了服务器,虽然它运行起来有点热,但看起来并没有过热。我还没有尝试禁用超线程。我已经尝试了许多参数来强制 JVM 使用所有内核,实际上该进程最初确实使用了所有内核;我可以在任务管理器中看到活动。

有人有什么想法吗?这是一个非常令人困惑的问题,我很感激任何想法。

更新:通过使用任务管理器将 java.exe 进程之一分配给另一个处理器,我能够使其使用另一个处理器。这也适用于命令行上的 java 调用以及使用哪个套接字的参数。

话虽如此,这感觉就像一个黑客。我不明白为什么我必须手动为每个 java 进程分配一个套接字;该工作应该留给操作系统。我仍然不确定问题到底出在哪里,是操作系统还是什么。