【转帖】深挖NUMA

深挖NUMA

http://www.litrin.net/2017/10/31/深挖numa/

首先列出本站之前相关的几篇帖子:

这次,就来深入了解下NUMA。

就如之前说的,在若干年前,对于x86架构的计算机,那时的内存控制器还没有整合进CPU,所有内存的访问都需要通过北桥芯片来完成。此时的内存访问如下图所示,被称为UMA(uniform memory access, 一致性内存访问 )。这样的访问对于软件层面来说非常容易实现:总线模型保证了所有的内存访问是一致的,不必考虑由不同内存地址之前的差异。

之后的x86平台经历了一场从“拼频率”到“拼核心数”的转变,越来越多的核心被尽可能地塞进了同一块芯片上,各个核心对于内存带宽的争抢访问成为了瓶颈;此时软件、OS方面对于SMP多核心CPU的支持也愈发成熟;再加上各种商业上的考量,x86平台也顺水推舟的搞了NUMA(Non-uniform memory access, 非一致性内存访问)。

在这种架构之下,每个Socket都会有一个独立的内存控制器IMC(integrated memory controllers, 集成内存控制器),分属于不同的socket之内的IMC之间通过QPI link通讯。

然后就是进一步的架构演进,由于每个socket上都会有多个core进行内存访问,这就会在每个core的内部出现一个类似最早SMP架构相似的内存访问总线,这个总线被称为IMC bus。

于是,很明显的,在这种架构之下,两个socket各自管理1/2的内存插槽,如果要访问不属于本socket的内存则必须通过QPI link。也就是说内存的访问出现了本地/远程(local/remote)的概念,内存的延时是会有显著的区别的。这也就是之前那篇文章中提到的为什么NUMA的设置能够明显的影响到JVM的性能。

回到当前世面上的CPU,工程上的实现其实更加复杂了。以Xeon 2699 v4系列CPU的标准来看,两个Socket之之间通过各自的一条9.6GT/s的QPI link互访。而每个Socket事实上有2个内存控制器。双通道的缘故,每个控制器又有两个内存通道(channel),每个通道最多支持3根内存条(DIMM)。理论上最大单socket支持76.8GB/s的内存带宽,而两个QPI link,每个QPI link有9.6GT/s的速率(~57.6GB/s)事实上QPI link已经出现瓶颈了。

嗯,事情变得好玩起来了。

核心数还是源源不断的增加,Skylake桌面版本的i7 EE已经有了18个core,下一代的Skylake Xeon妥妥的28个Core。为了塞进更多的core,原本核心之间类似环网的设计变成了复杂的路由。由于这种架构上的变化,导致内存的访问变得更加复杂。两个IMC也有了local/remote的区别,在保证兼容性的前提和性能导向的纠结中,系统允许用户进行更为灵活的内存访问架构划分。于是就有了“NUMA之上的NUMA”这种妖异的设定(SNC)。

回到Linux,内核mm/mmzone.c , include/linux/mmzone.h文件定义了NUMA的数据结构和操作方式。

Linux Kernel中NUMA的调度位于kernel/sched/core.c函数int sysctl_numa_balancing

  1. 在一个启用了NUMA支持的Linux中,Kernel不会将任务内存从一个NUMA node搬迁到另一个NUMA node。
  2. 一个进程一旦被启用,它所在的NUMA node就不会被迁移,为了尽可能的优化性能,在正常的调度之中,CPU的core也会尽可能的使用可以local访问的本地core,在进程的整个生命周期之中,NUMA node保持不变。
  3. 一旦当某个NUMA node的负载超出了另一个node一个阈值(默认25%),则认为需要在此node上减少负载,不同的NUMA结构和不同的负载状况,系统见给予一个延时任务的迁移——类似于漏杯算法。在这种情况下将会产生内存的remote访问。
  4. NUMA node之间有不同的拓扑结构,各个 node 之间的访问会有一个距离(node distances)的概念,如numactl -H命令的结果有这样的描述:
    node distances:
    node 0 1 2 3
     0: 10 11 21 21
     1: 11 10 21 21
     2: 21 21 10 11
     3: 21 21 11 10

可以看出:0 node 到0 node之间距离为10,这肯定的最近的距离,不提。0-1之间的距离远小于2或3的距离。这种距离方便系统在较复杂的情况下选择最合适的NUMA设定。

上图记录了某个Benchmark工具,在开启/关闭NUMA功能时QPI带宽消耗的情况。很明显的是,在开启了NUMA支持以后,QPI的带宽消耗有了两个数量级以上的下降,性能也有了显著的提升!

通常情况下,用户可以通过numactl来进行NUMA访问策略的手工配置,cgroup中cpuset.mems也可以达到指定NUMA node的作用。以numactl命令为例,它有如下策略:

  • –interleave=nodes //允许进程在多个node之间交替访问
  • –membind=nodes //将内存固定在某个node上,CPU则选择对应的core。
  • –cpunodebind=nodes //与membind相反,将CPU固定在某(几)个core上,内存则限制在对应的NUMA node之上。
  • –physcpubind=cpus //与cpunodebind类似,不同的是物理core。
  • –localalloc //本地配置
  • –preferred=node //按照推荐配置

对于某些大内存访问的应用,比如Mongodb,将NUMA的访问策略制定为interleave=all则意味着整个进程的内存是均匀分布在所有的node之上,进程可以以最快的方式访问本地内存。

讲到这里似乎已经差不多了,但事实上还没完。如果你一直按照这个“北桥去哪儿了?”的思路理下来的话,就有了另一个问题,那就是之前的北桥还有一个功能就是PCI/PCIe控制器,当然原来的南桥,现在的PCH一样也整合了PCIe控制器。事实上,在PCIe channel上也是有NUMA亲和性的。

比如:查看网卡enp0s20f0u5的NUMA,用到了netdev:<设备名称>这种方式。

[[email protected] ~]# numactl --prefer netdev:enp0s20f0u5 --show
policy: preferred
preferred node: 0
physcpubind: 0
cpubind: 0
nodebind: 0
membind: 0 1 2 3

或者一个PCI address 为00:17的SATA控制器,用到了pci:<PCI address>

[[email protected]~]# numactl --prefer pci:00:17 --show
policy: preferred
preferred node: 0
physcpubind: 0
cpubind: 0
nodebind: 0
membind: 0 1 2 3

还有block/ip/file的方式查看NUMA affinity,这里也就不再累述了。

综上,感觉上现在的服务器,特别是多socket的服务器架构更像是通过NUMA共享了内存;进而通过共享内存从而共享外设的多台主机。

最后一句:那种一个业务就能跑满整台server的时代是再也回不来了!

原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/11421524.html

时间: 2024-10-17 14:55:57

【转帖】深挖NUMA的相关文章

深挖NUMA

首先列出本站之前相关的几篇帖子: Linux的NUMA机制 NUMA对性能的影响 cgroup的cpuset问题 这次,就来深入了解下NUMA. 就如之前说的,在若干年前,对于x86架构的计算机,那时的内存控制器还没有整合进CPU,所有内存的访问都需要通过北桥芯片来完成.此时的内存访问如下图所示,被称为UMA(uniform memory access, 一致性内存访问 ).这样的访问对于软件层面来说非常容易实现:总线模型保证了所有的内存访问是一致的,不必考虑由不同内存地址之前的差异. 之后的x

京东深挖物流,引领双十一理性消费

电商圈关于双十一的筹备工作已悉数完成,阿里与京东两大巨头的"猫狗大战"如期上演.近日关于两巨头双十一宣传海报相继问世,不再是来言去语式争风吃醋,而是各自风格迥异,黑白分明.而正是这种全然不同,吸引了笔者的注意:冲动消费已成过去,完善服务倡导理性回归. 消费结构趋向价值引导 随着社会消费结构的升级以及线上线下电商的相互融合,以价格战为主导的双十一已不再适合当下的消费需求.我国居民可支配收入的增加,中产阶级群体以超过一亿之多,加之长达八年双十一的消费洗礼,现在的消费不在看中价格,而偏向价值

美国联邦调查局FBI继续深挖大北农窃种行动的“内奸”

2013年12月12日,大北农"窃种行动"案件的经办人,Klinefeldt检察官在新闻发布会上表示,FBI要继续深挖那些暗藏在美国公司内部与中国大北农"窃种行动"同谋的"内奸"("insider"),正是这些"内奸"向大北农偷窃种子的执行者提供转基因玉米测试场地的具体所在位置以及相应的转基因玉米的基础遗传基因序列. 转基因玉米的基础遗传基因序列是绝对的商业秘密,涉及到国家的根本利益.在美国,转基因玉米的4

写作社群圈子牛人:矩阵不如深挖

不知大家对"矩阵"一词是否了解,它常用在数学中,是一个按照呈方形陈列排列的复数或实数集合.我发现不少人在发布文章的时候都会采用矩阵的方法,就是将一篇文章发10个,20个,甚至更多的平台,不管平台大小,只要是平台都会发到. 我的做法正好相反,不会将文章随便发到一个平台上.我的文章绝大部分都发布在阿里和慧聪网,其中又以阿里为重点,而且我不会将文章随意发到阿里的任何一个论坛.我的方向性很强,只发在一个论坛上,这一习惯已经保持了好几年.选择矩阵式的发布文章的人一直都很忙碌,他们到一个平台发完文

批量发货阻塞启示:深挖系统薄弱点

背景 最近发生了一起"批量发货阻塞"的线上问题,值得深思和记录. 批量发货的流程是:商家上传一个里面可能含有一万多的订单号及物流发货信息的发货文件,然后PHP后台接收和解析文件,提取出待发货的信息,每5000个订单号发货信息打包成一个消息后批量推送到NSQ消息队列中.后台PHP脚本从NSQ消息队列中取出打包的发货消息,打散成单个的发货消息,然后循环调用Java发货服务化接口完成批量发货. 这里采用5000个订单号发货信息打包一个消息批量推送,是考虑到前端超时限制,采用其他数量总有偶发的

深挖“窄带高清”的实现原理

过去几年,又拍云一直在点播.直播等视频应用方面潜心钻研,取得了不俗的成果.我们结合点播.直播.短视频等业务中的用户场景,推出了"省带宽.压成本"系列文章,从编码技术.网络架构等角度出发,结合又拍云的产品成果,向大家介绍节省流量,降低带宽成本的妙招. <降低30%视频码率,深挖"窄带高清"的实现原理>是"省带宽.压成本"系列文章的第3篇.本文将深挖又拍云最新技术窄带高清,讲解窄带高清是怎样在不改变视频主观质量的情况下,通过改变码率来降低

深挖JDK动态代理(二):JDK动态生成后的字节码分析

接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transClass() throws IOException { URL resource = rpcMain.class.getClass().getResource("/"); byte[] bts = ProxyGenerator.generateProxyClass("$Proxy0

深挖Openstack Nova - Scheduler调度策略

深挖Openstack Nova - Scheduler调度策略 一.  Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(Fliter)和计算权值(Weight) 1. 过滤: 过滤掉不符合我们的要求,或镜像要求(比如物理节点不支持64bit,物理节点不支持Vmware EXi等)的主机,留下符合过滤算法的主机集合. 2. 计算权值 通过指定的权值计算算法,计算在某物理节点上申请这个虚机所必须的消耗cost.物理节点越不适合

任务7,深挖K近邻

任务7 深挖K近邻 一, 缺失值的处理 处理缺失值的方法:需要理解数据,察觉到哪些数据是必要的哪些不必要 1, 删除法: (1)     删整个列 (2)     删整行(丢弃此记录) 2, 填补法 (1)     用平均值来填补缺失值 (2)     均值,中位数填补 二,特征编码 ——机器学习的核心是建模,基础是数据,且输入一定是数值类型的,因此要把字符串转为字符类型,向量或矩阵类型 ——这个转换的过程叫类别特征 ——最常用的编码技术叫 独热编码 对于标签编码,用0,1,2表示特征的取值,但