在虚拟化中使用NUMA
x86系统中所有内存都可以通过CPU同等访问,被称为"统一内存访问"(UMA)。而近期的x86处理器已改为采用NUMA(Non-Uniform Memory Access),系统内存被划分到NUMA节点(node),并与socket对应,或者与特定某一组与本地系统内存子集具有相同访问延迟到CPU相对应。
NUMA内存分配策略
strict
目标节点中不能分配内存时,分配将被默认操作转进至其他节点。严格的策略意味着,当目标节点中不能分配内存时,分配将会失效。
interleave
内存页面将被分配至一项节点掩码指定的节点,但将以轮循机制的方式分布。
preferred
内存将从单一最优内存节点分配。如果内存并不充足,内存可以从其他节点分配。
XML 配置启用所需策略:
<numatune>
<memory mode='preferred' nodeset='0'>
</numatune>自动化 NUMA 平衡
自动化 NUMA 平衡改进了 NUMA 硬件系统中运行应用的性能。它在 Red Hat Enterprise Linux 7 系统中被默认启用。
自动化 NUMA 平衡会把任务(任务可能是线程或进程)移到与它们需要访问的内存更近的地方,同时也会移动内存应用程序数据,使其更靠近参考这一数据的任务。以上均在自动化 NUMA 平衡启用时由内核自动完成。
自动化 NUMA 平衡启用时需满足以下两个条件:
numactl --hardware显示多个节点cat /sys/kernel/debug/sched_features在标识中显示NUMA
实战
BIOS和OS中激活NUMA
检查硬件
显示输出
首先需要在BIOS开启或关闭NUMA
操作系统内核需要开启NUMA
注意,Linux系统内核启动参数有可能关闭了NUMA,所以首先需要检查一下
如果输出信息类似如下则表明OS层没有启用NUMA
编辑 /boot/grub2/grub.cfg 删除掉配置项numa=off,然后重启操作系统,再次检查:
检查NUMA状态
输出
检查
检查每个节点可用内存
参考
Last updated
Was this helpful?