tuj*_*tuj 5 java multithreading hyperthreading
我有许多使用 OpenJDK 11 的 Java 进程在 Windows Server 2019 上运行。该服务器有两个物理处理器和 36 个总内核;这是一台惠普机器。当我启动我的流程时,我会在任务管理器中看到所有内核的工作分配。这很好。然而,在进程运行一段时间后,不是一致的时间量,机器开始只使用一半的内核。
我正在研究一些理论:
JDK 存在一些问题,阻止它始终如一地访问所有内核。
Windows Server 2019 出现问题,限制 Java 访问所有内核。
存在热管理问题,一个处理器变得太热,操作系统将所有处理工作转移到另一个处理器。
超线程和“逻辑”处理器存在一些问题,导致进程无法利用所有内核。
我试过搜索 JDK 问题,但没有找到类似的内容。我去了服务器,虽然它运行起来有点热,但看起来并没有过热。我还没有尝试禁用超线程。我已经尝试了许多参数来强制 JVM 使用所有内核,实际上该进程最初确实使用了所有内核;我可以在任务管理器中看到活动。
有人有什么想法吗?这是一个非常令人困惑的问题,我很感激任何想法。
更新:通过使用任务管理器将 java.exe 进程之一分配给另一个处理器,我能够使其使用另一个处理器。这也适用于命令行上的 java 调用以及使用哪个套接字的参数。
话虽如此,这感觉就像一个黑客。我不明白为什么我必须手动为每个 java 进程分配一个套接字;该工作应该留给操作系统。我仍然不确定问题到底出在哪里,是操作系统还是什么。