如何确认主机是否具有NUMA感知功能?在甲骨文的文档说,NUMA意识开始于内核2.6.19,但NUMA手册页说,它与2.6.14介绍.我想确保Java进程开始-XX:+UseNUMA实际上正在利用某些东西.
检查numa_maps,我看到我有它们:
# find /proc -name numa_maps
/proc/1/task/1/numa_maps
/proc/1/numa_maps
/proc/2/task/2/numa_maps
/proc/2/numa_maps
/proc/3/task/3/numa_maps
Run Code Online (Sandbox Code Playgroud)
虽然我的内核落后于Oracle所说的内容:
# uname -sr
Linux 2.6.18-92.el5
Run Code Online (Sandbox Code Playgroud)
我目前在RHEL5.1上使用64位jdk1.6.0_29.
我有许多使用 OpenJDK 11 的 Java 进程在 Windows Server 2019 上运行。该服务器有两个物理处理器和 36 个总内核;这是一台惠普机器。当我启动我的流程时,我会在任务管理器中看到所有内核的工作分配。这很好。然而,在进程运行一段时间后,不是一致的时间量,机器开始只使用一半的内核。
我正在研究一些理论:
JDK 存在一些问题,阻止它始终如一地访问所有内核。
Windows Server 2019 出现问题,限制 Java 访问所有内核。
存在热管理问题,一个处理器变得太热,操作系统将所有处理工作转移到另一个处理器。
超线程和“逻辑”处理器存在一些问题,导致进程无法利用所有内核。
我试过搜索 JDK 问题,但没有找到类似的内容。我去了服务器,虽然它运行起来有点热,但看起来并没有过热。我还没有尝试禁用超线程。我已经尝试了许多参数来强制 JVM 使用所有内核,实际上该进程最初确实使用了所有内核;我可以在任务管理器中看到活动。
有人有什么想法吗?这是一个非常令人困惑的问题,我很感激任何想法。
更新:通过使用任务管理器将 java.exe 进程之一分配给另一个处理器,我能够使其使用另一个处理器。这也适用于命令行上的 java 调用以及使用哪个套接字的参数。
话虽如此,这感觉就像一个黑客。我不明白为什么我必须手动为每个 java 进程分配一个套接字;该工作应该留给操作系统。我仍然不确定问题到底出在哪里,是操作系统还是什么。