NUMA 策略命中/未命中统计信息

/sys/devices/system/node/node*/numastat

所有单位均为页。大页(Hugepages)有单独的计数器。

numa_hit、numa_miss 和 numa_foreign 计数器反映了进程从其首选节点分配内存的能力。如果成功,首选节点上的 numa_hit 会增加;否则,首选节点上的 numa_foreign 会增加,且分配成功所在节点的 numa_miss 会增加。

通常首选节点是进程执行所在的 CPU 本地节点,但诸如内存策略(mempolicies)之类的限制可能会改变这一点,因此还有两个基于 CPU 本地节点的计数器。local_node 类似于 numa_hit,在 CPU 从同一节点分配内存时增加。other_node 类似于 numa_miss,在 CPU 从不同节点分配内存且分配成功时,在(被分配的)节点上增加。注意,没有类似于 numa_foreign 的计数器。

详细说明

numa_hit

进程想要从该节点分配内存,并已成功。

numa_miss

进程想要从另一个节点分配内存,但最终从该节点获得了内存。

numa_foreign

进程想要在此节点上分配内存,但最终从另一个节点获得了内存。

local_node

进程在此节点的 CPU 上运行,并从此节点获得了内存。

other_node

进程在不同节点的 CPU 上运行,并从此节点获得了内存。

interleave_hit

交错(Interleaving)分配想要从该节点分配内存并已成功。

为了便于阅读,您可以使用 numactl 软件包中的 numastat 工具 (http://oss.sgi.com/projects/libnuma/)。请注意,目前它仅在 CPU 数量较少的机器上运行良好。

请注意,在具有无内存节点(即节点有 CPU 但没有内存)的系统上,numa_hit、numa_miss 和 numa_foreign 统计信息可能会出现严重偏差。在当前的内核实现中,如果进程首选无内存节点(例如因为它在其中的一个本地 CPU 上运行),内核实际上会将距离最近的具有内存的节点之一视为首选节点。因此,此类分配不会增加无内存节点上的 numa_foreign 计数器,并且会使最近节点的 numa_hit、numa_miss 和 numa_foreign 统计信息产生偏差。