NUMA

本文深入介绍了NUMA(Non-Uniform Memory Access)架构的基础知识,包括如何通过命令行工具查询CPU与内存之间的映射关系,以及如何利用numactl命令来控制程序运行时的CPU和内存资源绑定,从而实现更高效的性能。

0.NUMA基础

numa会把内存分为n组,每一组和特定的一组cpu有对应关系,即cpu访问与之相应的内存组会更快
所以,最开始,我们需要指代cpu和内存组的对应关系,可以使用一下命令

$ lscpu
(省略)
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19
(省略)
$ dmesg|grep -i numa

[    0.000000] NUMA: Initialized distance table, cnt=2
[    0.000000] mempolicy: Enabling automatic NUMA balancing. Configure with num _balancing= or the kernel.numa_balancing sysctl
[    0.812716] pci_bus 0000:00: on NUMA node 0
[    0.822274] pci_bus 0000:80: on NUMA node 1
$ numactl --hardware

available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14 16 18
node 0 size: 128708 MB
node 0 free: 120496 MB
node 1 cpus: 1 3 5 7 9 11 13 15 17 19
node 1 size: 129010 MB
node 1 free: 117856 MB
node distances:
node   0   1
  0:  10  21
  1:  21  10

1.numastat

$ numastat

                           node0           node1
numa_hit                10199402        11499638
numa_miss                      0               0
numa_foreign                   0               0
interleave_hit             65774           66145
local_node               9775609        11037623
other_node                423793          462015

numa_hit是打算在该节点上分配内存,最后从这个节点分配的次数;

num_miss是打算在该节点分配内存,最后却从其他节点分配的次数;

num_foregin是打算在其他节点分配内存,最后却从这个节点分配的次数;

interleave_hit是采用interleave策略最后从该节点分配的次数;

local_node该节点上的进程在该节点上分配的次数

other_node是其他节点进程在该节点上分配的次数


2.numactl

感觉这个命令,主要是控制程序运行时cpu和内存的使用。
比如,依照上面的数据,我们的程序可以有如下的设置

bind0  = numactl -m 0 --physcpubind=0
bind1  = numactl -m 1 --physcpubind=1
bind2  = numactl -m 0 --physcpubind=2
bind3  = numactl -m 1 --physcpubind=3
bind4  = numactl -m 0 --physcpubind=4
bind5  = numactl -m 1 --physcpubind=5
bind6  = numactl -m 0 --physcpubind=6
bind7  = numactl -m 1 --physcpubind=7
bind8  = numactl -m 0 --physcpubind=8
bind9  = numactl -m 1 --physcpubind=9
bind10  = numactl -m 0 --physcpubind=10
bind11  = numactl -m 1 --physcpubind=11
bind12  = numactl -m 0 --physcpubind=12
bind13  = numactl -m 1 --physcpubind=13
bind14  = numactl -m 0 --physcpubind=14
bind15  = numactl -m 1 --physcpubind=15
bind16  = numactl -m 0 --physcpubind=16
bind17  = numactl -m 1 --physcpubind=17
bind18  = numactl -m 0 --physcpubind=18
bind19  = numactl -m 1 --physcpubind=19

速度测试命令,上面的命令运行更快

numactl --cpubind=0 --membind=0 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024
numactl --cpubind=0 --membind=1 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024

另外就是参数--interleave 是程序的内存在不同numa组中均匀分布

$ numactl --interleave=all mongod


参考:
1.概念和问题
http://cenalulu.github.io/linux/numa/
2.命令使用
https://blog.youkuaiyun.com/jollyjumper/article/details/17168175

在 VMware 环境中,NUMA(Non-Uniform Memory Access)配置是优化虚拟机性能的重要环节,尤其在处理多核 CPU 和大规模内存访问时,合理的 NUMA 配置可以显著降低内存访问延迟,提高系统吞吐量。以下是 VMware NUMA 配置的指南及最佳实践。 ### 三、NUMA 架构基础与虚拟化环境中的影响 NUMA 架构允许每个 CPU 核心拥有本地内存访问路径,从而减少内存访问竞争。在虚拟化环境中,ESXi 主机会将物理 NUMA 节点映射到虚拟 NUMA 节点,供虚拟机使用。若虚拟机的 vCPU 和内存分配跨越多个 NUMA 节点,将导致远程内存访问,增加延迟[^1]。 ### 四、NUMA 配置指南 1. **合理分配 vCPU 与内存** 应确保虚拟机的 vCPU 数量不超过单个物理 NUMA 节点的逻辑 CPU 数量。例如,若一个 NUMA 节点包含 12 个逻辑 CPU,则虚拟机最多配置 12 个 vCPU 以避免跨节点调度。 2. **内存分配应与 NUMA 节点对齐** 虚拟机内存应尽量分配在与其 vCPU 所在 NUMA 节点相同的节点上,以减少远程内存访问带来的性能损耗。VMware vSphere 可通过 `numa.vcpu.maxMemSlots` 等高级参数控制内存分配策略。 3. **启用虚拟 NUMA(vNUMA)支持** 对于大型虚拟机(如 8 个以上 vCPU),启用 vNUMA 可以让客户操作系统感知 NUMA 架构,并进行更优的资源调度。该功能可在虚拟机设置中启用,前提是主机支持硬件辅助虚拟化。 4. **监控 NUMA 亲和性与性能指标** 使用 vSphere Performance Charts 或 esxtop 工具监控 NUMA 亲和性、远程内存访问率(Remote Memory Access %)等指标,确保虚拟机的 NUMA 亲和性未因迁移或资源争用而失效。 ### 五、NUMA 最佳实践 - **避免频繁的虚拟机迁移** 虚拟机迁移可能导致 NUMA 亲和性丢失,影响性能。在 vMotion 操作频繁的环境中,建议启用“保持 NUMA 亲和性”策略。 - **合理配置超线程(Hyper-Threading)** 启用超线程可提升 CPU 利用率,但某些工作负载可能无法从中受益,因此需结合实际性能监控结果进行调整[^2]。 - **定期更新 VMware Tools** VMware Tools 提供了对 NUMA 和 CPU 资源的优化支持,确保其版本最新可提升虚拟机整体性能[^3]。 - **使用 DRS 与 NUMA 感知调度策略** 在集群中启用 NUMA 感知的 DRS(Distributed Resource Scheduler)策略,可帮助虚拟机优先分配在本地 NUMA 节点上。 ### 六、配置示例:通过 vSphere Web Client 设置 vNUMA 1. 编辑虚拟机设置。 2. 在“虚拟硬件”选项卡中,找到“CPU”部分。 3. 勾选“Expose hardware-assisted CPU virtualization to the guest OS”。 4. 在“Options” > “CPUID Mask”中启用 NUMA 感知特性。 5. 保存并重启虚拟机。 ### 七、性能监控命令示例 使用 `esxtop` 查看 NUMA 亲和性信息: ```bash esxtop -b -d 5 -n 2 | grep NUMA ``` 该命令可输出 NUMA 节点的内存访问统计信息,帮助识别远程内存访问比例。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值