现在的服务器物理机一般都是多个cpu,核数也是十几甚至几十核。内存几十gb甚至是上百g,也是由许多条组成的。那么我这里思考一下,这么多的cpu和内存它们之间是怎么互相连接的?同一个cpu核访问不同的内存条延时一样吗?
在《内存随机访问也比顺序慢,带你深入理解内存io过程》中我们了解了内存访问时芯片内部的执行过程,在《实际测试内存在顺序io和随机io时的访问延时差异》中我们又进行了实际的代码测试。不过这两文中我们都把精力聚焦在内存内部机制,而回避了上面的问题,那就是cpu和内存的连接方式,也就是总线架构。
1 回顾cpu与内存的简单连接:fsb时代
我们先来回顾下在历史上cpu、内存数量比较少的年代里的总线方案-fsb。fsb的全称是front side bus,因此也叫前端总线。cpu通过fsb总线连接到北桥芯片,然后再连接到内存。内存控制器是集成在北桥里的,cpu和内存之间的通信全部都要通过这一条fsb总线来进行。
在这个年代里,当时提高计算机系统整体性能的方式就是不断地提高cpu、fsb总线、内存条的数据传输频率。
2 如今多cpu多内存复杂互联:numa时代
当cpu的主频提升到了3ghz每秒以后,硬件制造商们发现单个cpu的已经到了物理极限了。所以就改变了性能改进的方法,改成为向多核、甚至是多cpu的方向来发展。在这种情况下,如果仍然采用fsb总线,会导致所有的cpu和内存通信都经过总线,这样总线就成为了瓶颈,无法充分发挥多核的优势与性能。所以cpu制造商们把内存控制器从北桥搬到了cpu内部,这样cpu便可以直接和自己的内存进行通信了。那么,如果cpu想要访问不和自己直连的内存条怎么办呢?所以就诞生了新的总线类型,它就叫qpi总线。
图2中cpu1如果想要访问内存3的话,就需要经过qps总线才可以。
3 动手查看linux下的numa架构
我们先通过dmidecode命令查看一下内存插槽,单条大小等信息。大家可以试着在linux上执行以下该命令。输出结果很长,大家可以有空仔细研究。我这里不全部介绍,这里只挑选一些和内存相关的:
可以看出,我当前使用的机器上共有16个内存插槽,共插了8条8g的内存。所以总共是64gb。如我们前面所述,在numa架构里,每一个物理cpu都有不同的内存组,通过numactl命令可以查看这个分组情况。
通过上述命令可以看到,每一组cpu核分配了32gb(4条)的内存。 node distance是一个二维矩阵,描述node访问所有内存条的延时情况。 node 0里的cpu访问node 0里的内存相对距离是10,因为这时访问的内存都是和该cpu直连的。而node 0如果想访问node 1节点下的内存的话,就需要走qpi总线了,这时该相对距离就变成了21。
所以、在numa架构下,cpu访问自己同一个node里的内存要比其它内存要快!
4 动手测试numa架构内存延迟差异
numactl命令有--cpubind和--membind的选项,通过它们我们可以指定我们要用的node节点。还沿用《实际测试内存在顺序io和随机io时的访问延时差异》里的测试代码
1、让内存和cpu处于同一个node
下面代码可能需要左右滑动
2、让内存和cpu处于不同node
下面代码可能需要左右滑动
5 结论
通过上面的各个小节我们可以看到,现代的服务器里,cpu和内存条都有多个,它们之前目前主要采用的是复杂的numa架构进行互联,numa把服务器里的cpu和内存分组划分成了不同的node。从上述实验结果来看,拿8m数组,循环步长为64的case来说,同node耗时3.15纳秒,跨node为3.96纳秒。所以属于同一个node里的cpu和内存之间访问速度会比较快。而如果跨node的话,则需要经过qpi总线,总体来说,速度会略慢一些。
华为对外投资案例分析 华为对外投资的公司增加宁波润华全芯微电子
特斯拉车身BCM控制信号解码匹配与CAN报文数据采集及应用分析
一文解读LoRa通信技术
哪些产能会受B2011排针灼热料连接器的影响?
小米CC9 Pro即将发布该机搭载1亿像素五颗摄像头
同一个CPU核访问不同的内存条延时一样吗?
曝高通2亿像素传感器将于明年正式推出
T3S系列mesh自组网电台在无人机的应用
在合适的硬件平台上建立测量系统
高清播放处理器i.MX535
焊锡业精选问题:从事焊锡工作可以做多久?
数码相闪光灯
OpenAI计划建立全球芯片制造网络
目前AI教育市场还未完全成熟 不仅仅是企业之间的问题
如何选购针式打印机正品色带
CEVA推出业界首款针对可授权DSP的优化工具链
5G将大幅提升对MLCC的需求,MLCC市场出现供货吃紧情况
瑞萨电子面向混合动力汽车和纯电动汽车推出xEV逆变器解决方案
实现无缝液晶拼接屏的四个原理
通鼎互联大规模光子集成技术为5G的发展提供了动力