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

root@dc-skyeye:/usr/bin# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
node 0 size: 131037 MB
node 0 free: 3019 MB
node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
node 1 size: 131071 MB
node 1 free: 9799 MB
node distances:
node 0 1
 0: 10 20
 1: 20 10
1
2
3
4
5
6
7
8
9
10
11
12
  此系统共有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
1
2
  当然,也可以自找没趣

# numactl --cpubind=0 --membind=0,1 java param
1
  对于一口气吃掉内存大半的MongoDB,我的配置是:

# numactl --interleave=all mongod -f /etc/mongod.conf
1
  即分配所有的node供其使用,这也是官方推荐的用法。
  通过numastat命令可以查看numa状态

# numastat
 node0 node1
numa_hit 1775216830 6808979012
numa_miss 4091495 494235148
numa_foreign 494235148 4091495
interleave_hit 52909 53004
local_node 1775205816 6808927908
other_node 4102509 494286252
1
2
3
4
5
6
7
8
  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。

numactl - 用于控制 进程与共享存储的 NUMA 技术机制语法:numactl [--interleave nodes] [--preferred node] [--membind nodes][--cpunodebind nodes] [--physcpubind cpus] [--localalloc] [--] {arguments ...}
numactl --show
numactl --hardware
numactl [--huge] [--offset offset] [--shmmode shmmode] [--length length] [--strict]
[--shmid id] --shm shmkeyfile | --file tmpfsfile
[--touch] [--dump] [--dump-nodes] memory policy主要参数:--interleave=nodes, -i nodes这个选项用于设定内存的交织分配模式。 也就是说系统在为多个节点分配内存空间的时候,将会以轮询分发的方式被分配给这多个节点.如果在当前众多的交织分配内存节点中的目标节点无法正确的分配内存空间的话,内存空间将会由其他的节点来分配。--membind=nodes, -m nodes选项 '--membind' 仅用来从节点中分配内存空间所用。 如果在这些节点中无法分配出所请求的空间大小的话该分配操作将会失败.上述命令中指定需要分配空间的 nodes 的方式可以遵照上述 N,N,N , N-N ,N 这种方式来指定.--cpunodebind=nodes, -N nodes上述命令仅用于施加在运行与 cpu 上的进程。这个命令用于显示 cpu 的个数,cpu 数目信息同样记录在系统中的存放处理器领域信息的 /proc/cpuinfo 文件夹下,或者是按照关联的中央处理器信息 在当前的中央处理器集中所存放.          --localalloc , -l这个命令选项通常是为当前的节点分配内存的--preferred=node该命令由于指定优先分配内存空间的节点,如果无法将空间分配给该节点的话,应该分配给该节点上的空间将会被分发到其他的节点上               该命令选项后面仅接收一个单独的节点标号.  相关的表示方式也可以使用.--show,-s该命令用于显示 NUMA 机制作用在当前运行的那些进程上--hardware , -H该命令用于显示当前系统中有多少个可用的节点.--huge当创建一个基于大内存页面的系统级的共享内存段的时候,使用 --huge 这个选项。--huge 选项仅在 --shmid 或是 --shm 命令的后面使用才有效.
--offset该参数选项用于指定共享内存段中的位移量的偏移。 默认的情况下偏移量是 0 。 有效的偏移量单位是 m (用于表示 MB)g (用于表示 GB) , k (用于表示 KB ), 其他没有指定的被认为是以字节为单位.--strict 这个参数选项 当施加了 NUMA 调度机制的共享内存段区域的页面被施加了另一个机制而导致错误的时候,使用 --strict 选项将会把错误信息显示出来. 默认情况是不使用该选项的。--shmmode shmmode该选项仅在 --shmid 或是 --shm 之前使用才会生效。 当创建一个共享内存段的时候,通过整型数值来指定共享内存的共享的模式类型.--length lengthApply policy to length range in the shared memory segment or make the segment length long Default is to use the remaininglength Required when a shared memory segment is created and specifies the length of the new segment then .Valid units are m ( for MB ) , g( for GB) , k ( for KB) , otherwise it specifies bytes.--shmid id通过ID 号码来创建或使用一个共享内存段。(如果共享内存段已经存在,那么通过 shmid 来指定下面要使用某个 ID 的共享内存段 ;  如果该 ID 对应的共享内存段并不存在的话,那么就创建一个)--shm shmkeyfile通过存放在 shmkeyfile(共享内存-键文件)中的 ID 号码来创建或者是使用一个共享内存段。访问 shmkeyfile 文件的进程是通过 fork(3 arguments) 方法来实现的.--file tmpfsfile将 numa 机制施加于文件上面, 这个文件属于 tmpfs或者是 hugetlbfs 这种特殊的文件系统--touch通过将 numa 机制施加于刚刚页面上来实现内存的早期 numa 化。默认情况下是不使用该选项,如果存在映射或是访问页面的应用的话,将会使用该早期实行 NUMA 机制的这种方法.--dump该选项用于废除将已经 numa 化的特定区域上的 NUMA性质.(--dump ) 选项后,有效指定 node 的书写方式all  用于将所有的节点上的 NUMA 特性移除number  通过指定 node 后接的数值来废除该数字对应的 nodenumber1(number2)  node number1(node number2)上的 NUMA 特性将会被移除number1-number2    node number1 -- node number2 区间上的所有存在的 node 的 NUMA 特性将会被移除!nodes                除了 nodes 所指定的节点以外的所有节点上的 NUMA 特性全都会被移除

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

Linux工具之numactl相关推荐

  1. Linux工具快速上手,Linux很实用命令

    Linux工具快速上手 前言 Linux下有很多命令行工具供我们使用,每个工具总是提供了大量参数供我们选择: 实际工作中,我们用到的工具,最常用的总是那么几个参数组合: 为此,我写了这本书相对实用的书 ...

  2. linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...

    Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件,交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况).所以这 ...

  3. 发布《Linux工具快速教程》

    发布<Linux工具快速教程> 阶段性的完成了这本书开源书籍,发布出来给有需要的朋友,同时也欢迎更多的朋友加入进来,完善这本书: 本书Github地址:https://github.com ...

  4. 如何把Linux工具里的“军刀”BusyBox移植到RT-Thread Smart?

    RT-Thread Smart 系列连载 序号 内容 1 <当"树莓派"遇上RT-Thread Smart--应用编程入门> 2 <RT-Thread Smart ...

  5. Kali Linux工具文档翻译计划

    Kali Linux工具文档翻译计划 Kali Tools Translate Volunteers是一个公益项目,简称KTTV,目标是将 http://tools.kali.org/tools-li ...

  6. linux工具之jq

    linux工具之jq 后端开发的工程师经常在linux下开发,当我们拿到一个json格式的数据时,如何有效对这个数据进行分析?我们可以采用python结合json库来分析,但是linux有一个很好用的 ...

  7. kali linux怎样下载全部工具,Kali Linux工具大全

    原标题:Kali Linux工具大全 本系列将以介绍工具的使用方法为主要目标,并不会刻意将每个工具定位到渗透测试标准的哪个具体阶段.具体内容我将根据自己的理解角度和实用经验来进行展开,所以它肯定不会是 ...

  8. linux工具类之硬盘检测

    linux工具类之硬盘检测 软raid mount /dev/md0 /opt                 [root@localhost root]# cp /usr/share/doc/rai ...

  9. linux红帽给文件加密,红帽大神制作 Linux 工具,用于旧款罗技无线键盘加密设置...

    Red Hat 的 Hans de Goede 编写了一个 Linux 实用程序,可为那些老化的罗技键盘配置加密链接状态;同时,也使得之前配置的使用加密链接的罗技键盘可以正确地重新配置. 正如 Han ...

最新文章

  1. 统计学习方法-最大熵模型
  2. nodejs创建rtmp-streamer服务器
  3. RWCString 定义 memeroy leak
  4. java比ios慢_Android为什么比iOS慢
  5. 计算机 教育 研究生分数查询,专业硕士在考试结束之后几周内可以去查分呢现在只能是通过电脑来查分了吗...
  6. Xopsed的编译与安装
  7. C语言图书管理信息系统
  8. Altium Designer PCB设计常用规则
  9. Navicat Premium 12注册码与破解解决方案
  10. 开源项目工时系统_GitHub - fjp203/timemaker: 定额工时管理系统
  11. VPython - example - 模拟斜上抛运动 (X - Y 轴)
  12. Lambda方法引用
  13. [HBase进阶]--rowkey设计要点(官方文档介绍)
  14. Python+Appium+unittest demo
  15. 石墨文档支持的几种markdown格式
  16. 海乐网站查询工具tool.sealee.com上线
  17. 正达信通ZedaIOT物联网平台设备管理功能浅析
  18. 如何添加桌面便签?在桌面上添加便签的方法
  19. 【工业通讯】CAN基础内容详解(二)——物理层
  20. 固定资产设备管理系统(移动+PC)

热门文章

  1. 傅里叶级数与线性代数
  2. Mac 平台相关操作
  3. 常用特征选取算法(转载)
  4. 华为mate40和mate40pro的区别?哪个好?
  5. 【风景园林大模型战车系列】之画五彩斑斓的黑,毛坯变精装,手绘作品秒渲染效果图魔法
  6. 前端面试题总结(2)
  7. 使用Clover引导Windows、Mac及多个Linux系统一起安装
  8. 前端与English
  9. matlab fmincon误差值,Fmincon函数求助,数值回带以后根本不在约束的范围内
  10. 红外非均匀矫正matlab实现,红外图像非均匀矫正——两点矫正