作者:qccz123456 
来源:CSDN 
原文:Linux工具之numactl

一、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,比如当下流行的内存数据库,在这种情况下就很被动了。 

二、numactl

Linux提供了一个一个手工调优的命令numactl(默认不安装),在Ubuntu上的安装命令如下:

sudo apt install numactl

首先你可以通过它查看系统的numa状态:

numactl --hardware

运行得到如下的结果: 

  1. available: 2 nodes (0-1)

  2. node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23

  3. node 0 size: 131037 MB

  4. node 0 free: 3019 MB

  5. node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31

  6. node 1 size: 131071 MB

  7. node 1 free: 9799 MB

  8. node distances:

  9. node 0 1

  10. 0: 10 20

  11. 1: 20 10

可以看到,此系统共有2个node,各领取16个CPU和128G内存。 

这里假设我要执行一个java param命令,此命令需要120G内存,一个python param命令,需要16G内存。最好的优化方案时python在node0中执行,而java在node1中执行,那命令是:

 
  1. numactl --cpubind=0 --membind=0 python param

  2. 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状态:

numastat

得到的结果如下所示:

  1. node0 node1

  2. numa_hit 1775216830 6808979012

  3. numa_miss 4091495 494235148

  4. numa_foreign 494235148 4091495

  5. interleave_hit 52909 53004

  6. local_node 1775205816 6808927908

  7. other_node 4102509 494286252

other_node过高意味着需要重新规划numa。

三、NUNA与SMP

NUMA(Non-Uniform Memory Access,非一致性内存访问)和SMP(Symmetric Multi-Processor,对称多处理器系统)是两种不同的CPU硬件体系架构。 

SMP的主要特征是共享,所有的CPU共享使用全部资源,例如内存、总线和I/O,多个CPU对称工作,彼此之间没有主次之分,平等地访问共享的资源,这样势必引入资源的竞争问题,从而导致它的扩展内力非常有限。 

NUMA技术将CPU划分成不同的组(Node),每个Node由多个CPU组成,并且有独立的本地内存、I/O等资源。Node之间通过互联模块连接和沟通,因此除了本地内存外,每个CPU仍可以访问远端Node的内存,只不过效率会比访问本地内存差一些,我们用Node之间的距离(Distance,抽象的概念)来定义各个Node之间互访资源的开销。

Node->Socket->Core->Processor

随着多核技术的发展,将多个CPU封装在一起,这个封装被称为插槽Socket;Core是socket上独立的硬件单元;通过intel的超线程HT技术进一步提升CPU的处理能力,OS看到的逻辑上的核数Processor。

socket = node

socket是物理概念,指的是主板上CPU插槽;node是逻辑概念,对应于socket。

core = 物理CPU

core是物理概念,一个独立的硬件执行单元,对应于物理CPU;

thread = 逻辑CPU = Processor

thread是逻辑CPU,也就是Processor。

Reference

http://www.litrin.net/2017/10/31/%E6%B7%B1%E6%8C%96numa/ 
http://www.litrin.net/2017/08/03/numa%E5%AF%B9%E6%80%A7%E8%83%BD%E7%9A%84%E5%BD%B1%E5%93%8D/ 
https://blog.csdn.net/ustc_dylan/article/details/45667227 
http://kodango.com/cpu-topology 
https://blog.csdn.net/envy13/article/details/80241886

关闭NUMA

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐