关于linux:NUMA架构下的内存延迟区别测试

75次阅读

共计 2748 个字符,预计需要花费 7 分钟才能阅读完成。

当初的服务器物理机 CPU 个别都是多个 CPU,核数也是十几甚至几十核。内存几十 GB 甚至是上百 G,也是由许多的内存条组成的。那么我这里思考一下,这么多的 CPU 和内存它们之间是怎么相互连贯的?同一个 CPU 核拜访不同的内存条延时一样吗?
在《内存随机拜访也比程序慢,带你深刻了解内存 IO 过程》中咱们理解了内存拜访时芯片外部的执行过程,在《理论测试内存在程序 IO 和随机 IO 时的拜访延时差别》中咱们又进行了理论的代码测试。不过这两文中咱们都把精力聚焦在内存外部机制,而回避了下面的问题,那就是 CPU 和内存的连贯形式,也就是总线架构。

回顾 CPU 与内存的简略连贯:FSB 时代

咱们先来回顾下在历史上 CPU、内存数量比拟少的年代里的总线计划 -FSB。FSB 的全称是 Front Side Bus,因而也叫前端总线。CPU 通过 FSB 总线连贯到北桥芯片,而后再连贯到内存。内存控制器是集成在北桥里的,Cpu 和内存之间的通信全副都要通过这一条 FSB 总线来进行。

在这个年代里,过后进步计算机系统整体性能的形式就是一直地进步 CPU、FSB 总线、内存条的数据传输频率。

现在多 CPU 多内存条简单互联:NUMA 时代

当 CPU 的主频晋升到了 3GHz 每秒当前,硬件制造商们发现单个 CPU 的曾经到了物理极限了。所以就扭转了性能改良的办法,改成为向多核、甚至是多 CPU 的方向来倒退。在这种状况下,如果依然采纳 FSB 总线,会导致所有的 CPU 和内存通信都通过总线,这样总线就成为了瓶颈,无奈充分发挥多核的劣势与性能。所以 CPU 制造商们把内存控制器从北桥搬到了 CPU 外部,这样 CPU 便能够间接和本人的内存进行通信了。那么,如果 CPU 想要拜访不和本人直连的内存条怎么办呢?所以就诞生了新的总线类型,它就叫 QPI 总线。

图中 CPU1 如果想要拜访内存 3 的话,就须要通过 QPS 总线才能够。

入手查看 Linux 下 NUMA 架构

咱们先通过 dmidecode 命令查看一下内存插槽,单条大小等信息。大家能够试着在 linux 上执行以下该命令。输入后果很长,大家能够有空认真钻研。我这里不全副介绍,这里只筛选一些和内存相干的:

# dmidecode|grep -P -A5 "Memory\s+Device"|grep Size  
        Size: 8192 MB  
        Size: 8192 MB  
        Size: No Module Installed  
        Size: 8192 MB  
        Size: No Module Installed  
        Size: 8192 MB  
        Size: 8192 MB  
        Size: 8192 MB  
        Size: No Module Installed  
        Size: 8192 MB  
        Size: No Module Installed  
        Size: 8192 MB  

能够看出,我以后应用的机器上共有 16 个内存插槽,共插了 8 条 8G 的内存。所以总共是 64GB。如咱们后面所述,在 NUMA 架构里,每一个物理 CPU 都有不同的内存组,通过 numactl 命令能够查看这个分组状况。

# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
node 0 size: 32756 MB
node 0 free: 19642 MB
node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23
node 1 size: 32768 MB
node 1 free: 18652 MB
node distances:
node   0   1
  0:  10  21
  1:  21  10

通过上述命令能够看到,每一组 CPU 核调配了 32GB(4 条)的内存。node distance是一个二维矩阵,形容 node 拜访所有内存条的延时状况。node 0里的 CPU 拜访 node 0 里的内存绝对间隔是 10, 因为这时拜访的内存都是和该 CPU 直连的。而node 0 如果想拜访 node 1 节点下的内存的话,就须要走 QPI 总线了,这时该绝对间隔就变成了21

所以、在 NUMA 架构下,CPU 拜访本人同一个 node 里的内存要比其它内存要快!

入手测试 NUMA 架构内存提早差别

numactl命令有 --cpubind--membind的选项,通过它们咱们能够指定咱们要用的 node 节点。还沿用《用代码让你来理论感触内存的在不同状况下的拜访延时差别》里的测试代码

1、让内存和 CPU 处于同一个 node

# numactl --cpubind=0 --membind=0 ./main
Delay  (ns)
        2k      8k      32k     128k    512k    2m      8m      32m     128m
s1      1.28    1.28    1.26    1.25    1.26    1.26    1.28    1.43    1.43
s32     1.27    1.26    1.32    1.78    2.67    2.73    3.27    9.95    10.37
s64     1.28    1.26    1.26    1.82    2.43    2.48    3.15    8.82    8.92
andom   2.40    2.40    2.40    2.40    4.80    4.80    19.20   28.80   52.80

2、让内存和 CPU 处于不同 node

# numactl --cpubind=0 --membind=1 ./main
Delay  (ns)
        2k      8k      32k     128k    512k    2m      8m      32m     128m
s1      1.29    1.28    1.26    1.26    1.26    1.26    1.31    1.62    1.63
s32     1.29    1.26    1.33    1.77    2.80    2.92    3.95    13.69   13.77
s64     1.30    1.27    1.26    1.82    2.47    2.48    3.96    12.93   12.90
andom   2.40    2.40    2.40    2.40    4.80    4.80    19.20   31.20   52.80

论断

通过下面的各个大节咱们能够看到,古代的服务器里,CPU 和内存条都有多个,它们之前目前次要采纳的是简单的 NUMA 架构进行互联,NUMA 把服务器里的 CPU 和内存分组划分成了不同的 node。从上述试验后果来看,拿 8M 数组,循环步长为 64 的 case 来说,同 node 耗时 3.15 纳秒,跨 node 为 3.96 纳秒。所以属于同一个 node 里的 CPU 和内存之间访问速度会比拟快。而如果跨 node 的话,则须要通过 QPI 总线,总体来说,速度会略慢一些。



开发内功修炼之内存篇专辑:

  • 1. 带你深刻了解内存对齐最底层原理
  • 2. 内存随机也比程序拜访慢,带你深刻了解内存 IO 过程
  • 3. 从 DDR 到 DDR4,内存外围频率其实基本上就没太大的提高
  • 4. 理论测试内存在程序 IO 和随机 IO 时的拜访延时差别
  • 5. 揭穿内存厂家“谎话”,实测内存带宽实在体现
  • 6.NUMA 架构下的内存拜访提早区别!
  • 7.PHP7 内存性能优化的思维精华
  • 8. 一次内存性能晋升的我的项目实际
  • 9. 挑战 Redis 单实例内存最大极限,“遭逢”NUMA 陷阱!

我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术实践,也不只介绍实践经验。而是把实践与实际联合起来,用实际加深对实践的了解、用实践进步你的技术实际能力。欢送你来关注我的公众号,也请分享给你的好友~~~

正文完
 0