http://blog.csdn.net/jollyjumper/article/details/17168175
起源于在mongo启动脚本中看到numactl --interleave=all mongod ...
。
NUMA,非统一内存访问(Non-uniform Memory Access),介于SMP(对称多处理)和MPP(大规模并行处理)之间,各个节点自有内存(甚至IO子系统),访问其它节点的内存则通过高速网络通道。NUMA信息主要通过BIOS中的ACPI(高级配置和编程接口)进行配置,Linux对NUMA系统的物理内存分布信息从系统firmware的ACPi表中获得,最重要的是SRAT(System Resource Affinity Table)和SLIT(System locality Information Table)表。SRAT表包含CPU信息、内存相关性信息,SLIT表则记录了各个节点之间的距离,在系统中由数组node_distance[]记录。这样系统可以就近分配内存,减少延迟。
Linux中用一个struct pg_data_t表示一个numa节点,Linux内核支持numa调度,并实现CPU的负载均衡。
查看是否支持:
dmesg | grep -i numa
要查看具体的numa信息用numastat
1 2 3 4 5 6 7 8 |
|
numa_hit是打算在该节点上分配内存,最后从这个节点分配的次数;
num_miss是打算在该节点分配内存,最后却从其他节点分配的次数;
num_foregin是打算在其他节点分配内存,最后却从这个节点分配的次数;
interleave_hit是采用interleave策略最后从该节点分配的次数;
local_node该节点上的进程在该节点上分配的次数
other_node是其他节点进程在该节点上分配的次数
lscpu可以看到两个node的cpu归属:
1 2 3 4 |
|
numactl --hardware
命令
会返回不同节点的内存总大小,可用大小,以及node distance等信息。
各个cpu负载情况,使用命令:mpstat -P ALL(需要安装sysstat)
Linux上使用numactl设定进程的numa策略。常见的情况是,数据库daemon进程(mongodb,mysql)可能会吃掉很多内存,而一个numa节点上的内存很有限,内存不够时虚拟内存频繁与硬盘交换数据,导致性能急剧下降(标识是irqbalance进程top中居高不下),这时应该采用interleave的numa策略,允许从其他节点分配内存。
各个内存的访问延迟如何?numactl man中的example提供了参考,我在公司的服务器上测了一下:
写速度:
1 2 3 4 5 6 7 8 9 10 |
|
读速度:
测试从同一个节点读取:
1 2 3 4 5 |
|
花费0.264556884765625秒,速度是3.779905410081901GB/s。
从另一个节点读取:
1 2 3 4 5 |
|
花费0.3308408260345459秒,速度是3.022601569419312GB/s。
加速效果还是很明显的。
参考:
http://www.ibm.com/developerworks/cn/linux/l-numa/
http://www.dedecms.com/knowledge/data-base/nosql/2012/0820/8684.html