一、什么是numa?
NUMA(Non-Uniform Memory Access),非一致性内存访问,是一种计算机内存的设计方式,这种设计模式将内存分为本地内存和远程内存
由于CPU访问本地内存比访问远程内存的路径短,导致访问本地内存的延迟会小于访问远程内存
通过numactl可以查看numa的节点信息
# numactl -H available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 node 0 size: 130713 MB node 0 free: 9043 MB node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 node 1 size: 131072 MB node 1 free: 17986 MB node distances: node 0 1 0: 10 21 1: 21 10
从上述输出结果我们可以看出,该机器上包含两个 NUMA 节点,每个节点上都包含 32个 CPU 以及 128GB 的内存,最后的节点距离(node distances)告诉我们两个 NUMA 节点访问内存的开销,其中 NUMA 节点 0 和 NUMA 节点 1 互相访问对方内存的延迟是各自节点访问本地内存的 2.1 倍(21 / 10 = 2.1),所以如果 NUMA 节点 0 上的进程如果在节点 1 上分配内存,会增加进程的延迟。
二、常用命令
1、绑定cpu和选择内存分配策略
我们可以通过numactl命令来指定cpu和内存的分配策略
numactl --cpunodebind=0 --membind=0 cmd param 内存分配策略 --localalloc:总是在当前节点上分配内存; --preferred:倾向于在特定节点上分配内存,当指定节点的内存不足时,操作系统会在其他节点上分配; --membind:只能在传入的几个节点上分配内存,当指定节点的内存不足时,内存的分配就会失败; --interleave:内存会在传入的节点上依次分配(Round Robin),当指定节点的内存不足时,操作系统会在其他节点上分配; CPU分配策略 --cpunodebind:将进程绑定到某几个 NUMA 节点上; --physcpubind:将进程绑定到某几个物理 CPU 上;
2、numastat
# numastat -c mysqld Per-node process memory usage (in MBs) PID Node 0 Node 1 Total --------------- ------ ------ ----- 84691 (mysqld_sa 1 1 2 86312 (mysqld) 16504 19543 36047 --------------- ------ ------ ----- Total 16505 19544 36049 # numastat node0 node1 numa_hit 65307931014 44941987932 # 使用本节点内存次数 numa_miss 1129162 35124348722 # 计划使用本节点内存而被调度到其他节点次数 numa_foreign 35124348722 1129162 # 计划使用其他节点内存而使用本地内存次数 interleave_hit 58498 58740 # 交叉分配使用的内存中使用本节点的内存次数 local_node 65306428842 45048694869 # 在本节点运行的程序使用本节点内存次数 other_node 2631334 35017641785 # 在其他节点运行的程序使用本节点内存次数
三、相关内核参数
1、vm.zone_reclaim_mode
调整当一个zone的内存不足时的内存回收策略,
- 0:意味着关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存。
- 1:表示打开zone_reclaim模式,这样内存回收只会发生在本地节点内。
- 2:在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存。
- 4:可以用swap方式回收内存。
2、kernel.numa_balancing
通常,应用程式在其程序的线程访问 NUMA 节点上的内存、且此节点位置与线程排程时的位置相同的时候,性能最佳。自动化 NUMA 平衡会把任务(任务可能是线程或进程)移到与它们需要访问的内存更近的地方,同时也会移动内存应用程序数据,使其更靠近参考这一数据的任务。
- 0:关闭
- 1:开启