http://www.litrin.net/2014/06/18/linux的numa机制/
NUMA(Non-Uniform Memory Access)字面直译为“非一致性内存访问”,对于linux内核来说最早出现在2.6.7版本上。这种特性对于当下大内存+多cpu为潮流的X86平台来说确实会有不少的性能提升,但相反的,如果配置不当的话,也是一个很大的坑。本文就从头开始说说linux下关于cpu NUMA特性的配置和调优。
最早Intel在Nehalem架构上实现了NUMA,取代了在此之前一直使用的FSB前端总线的架构,用以对抗AMD的HyperTransport技术。一方面这个架构的特点是内存控制器从传统的北桥中移到了cpu中,排除了商业战略方向的考虑之外,这样做的方法同样是为了实现NUMA。
在SMP多cpu架构中,传统上多cpu对于内存的访问是总线方式。是总线就会存在资源争用和一致性问题,而且如果不断的增加cpu数量,总线的争用会愈演愈烈,这就体现在4核cpu的跑分性能达不到2核cpu的2倍,甚至1.5倍!理论上来说这种方式实现12core以上的cpu已经没有太大的意义。
Intel的NUMA解决方案,litrin始终认为它来自本家的安藤。他的模型有点类似于MapReduce。放弃总线的访问方式,将cpu划分到多个Node中,每个node有自己独立的内存空间。各个node之间通过高速互联通讯,通讯通道被成为QuickPath Interconnect即QPI。
这个架构带来的问题也很明显,如果一个进程所需的内存超过了node的边界,那就意味着需要通过QPI获取另一node中的资源,尽管QPI的理论带宽远高于传统的FSB,比如当下流行的内存数据库,在这种情况下就很被动了。
linux提供了一个一个手工调优的命令numactl(默认不安装),首先你可以通过它查看系统的numa状态
[email protected]:/usr/bin# numactl --harDWareavailable: 2 nodes (0-1)node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23node 0 size: 131037 MBnode 0 free: 3019 MBnode 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31node 1 size: 131071 MBnode 1 free: 9799 MBnode distances:node 0 1 0: 10 20 1: 20 10
此系统共有2个node,各领取16个cpu和128G内存。
这里假设我要执行一个java param命令,此命令需要120G内存,一个python param命令,需要16G内存。最好的优化方案时python在node0中执行,而java在node1中执行,那命令是:
#numactl --cpubind=0 --membind=0 python param#numactl --cpubind=1 --membind=1 java param
当然,也可以自找没趣
#numactl --cpubind=0 --membind=0,1 java param
对于一口气吃掉内存大半的MongoDB,我的配置是:
numactl --interleave=all mongod -f /etc/mongod.conf
即分配所有的node供其使用,这也是官方推荐的用法。
通过numastat命令可以查看numa状态
[email protected]:/var/log/mongodb# numastat node0 node1numa_hit 1775216830 6808979012numa_miss 4091495 494235148numa_foreign 494235148 4091495interleave_hit 52909 53004local_node 1775205816 6808927908other_node 4102509 494286252
other_node过高意味着需要重新规划numa.
PS:建议您阅读这篇,获得更多关于NUMA的详细内容!
总结以上是内存溢出为你收集整理的【转帖】Linux的NUMA机制全部内容,希望文章能够帮你解决【转帖】Linux的NUMA机制所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)