服务器专题 | 第19期:先画归属图,再谈配置

服务器 · · 九羲科技

配置单上什么都对,机器跑起来却总差一口气,这种事不少见。一台双路服务器,2 颗 CPU、2 块 GPU、2 张网卡、几块 NVMe,型号全对,价格也谈妥了。上机之后,跨节点通信慢半拍,读盘时延忽高忽低,查来查去,型号没错,错的是归属:哪块设备挂在哪颗 CPU 的根上,哪块盘归哪个 NUMA 节点,跑数据的进程又绑在哪组核上。配置单不写这一层,性能测试单上却处处是它。

这篇只讲透这一处:谈配置之前,先把归属图画出来。

双路归属图:每块设备先归一颗 CPU 管,同节点直连走 PCIe,跨节点要先过 UPI(示意图为程序绘制)

设备先有户口,户口本叫归属图

双路服务器不是一台大机器,是两个 NUMA 节点拼在一起。每颗 CPU 自带内存控制器、本地内存和一组 PCIe 根,插进哪个根的设备,就归哪个节点管。GPU、网卡、NVMe 在物理上先有户口,户口写在哪颗 CPU 名下,数据路径就从哪颗 CPU 出发。插槽换了,户口就换了,配置单上的型号可不会跟着变。

归属图要画的东西不多,但一处不能少:两颗 CPU、每颗 CPU 下面的 PCIe 交换器与直挂设备、两边的本地内存、两颗 CPU 之间的互连。画完之后,每条热路径都能在图上走一遍:GPU 到网卡经过几级交换,NVMe 到内存要不要跨槽,进程的核与它要读的内存是不是在同一节点。图上走不通的路,跑起来也不会自己变通。

现成的工具能把这张图的底稿拉出来。NVIDIA 的 nvidia-smi topo -m 会输出一张 GPU 与网卡的连接矩阵,附带每块 GPU 的 CPU 亲和性与 NUMA 亲和性,图例里把路径分了档:PIX 是经过单个 PCIe 交换器,PXB 是经过多个交换器,PHB 是经过主机桥,NODE 是同一节点内跨主机桥,SYS 是跨 NUMA 节点的互连,也就是 QPI 或 UPI¹。lspci -tv 能看到 PCIe 树的挂法,numactl --hardware 能看到节点与距离。工具给的是底稿,归属图是把底稿画成一张能对着配置单逐项核对的图。

跨过去的代价,先算两笔账

跨槽不是不能走,是要付钱。第一笔是内存账:本节点内存走自家内存控制器,跨节点内存要先过互连,再找对面节点的内存控制器。Intel 官方社区一位技术人员给过一组 Xeon Platinum 8160 的例子,2 条 UPI 互连:本节点读带宽约 112 GB/s,跨节点单向读约 34 GB/s²。这组数是举例机型、单向读条件下的数,不是所有双路机器的通用数,拿它当方向可以,拿它当自家机器的承诺不行。另一组实测口径来自 Intel 内存延迟测试工具 MLC:本地空闲延迟 108.2ns,远端 195.7ns,约 1.8 倍³。和本专栏第 7 期讲的远端延迟税同向:远端访问就是要贵一截,贵多少看机型与负载。

第二笔是 IO 账,常常比内存账更隐蔽。网卡挂在 CPU1 的根上,跑网络收发的进程却绑在 CPU0 的核上,数据要先跨 UPI 再出网,等于每包都多绕一趟。GPU 与网卡不在同一交换域,上一期讲的 GPUDirect 直路也要先跨槽,矩阵里那一行就从 PIX 变成了 SYS。NVMe 同理:盘挂在对面节点,读盘先跨槽进内存,再交到应用手里,盘本身再快,路径上的这一趟也省不掉。型号全对、路径错了,账还是错的。

热路径同节点走法跨节点走法代价落在哪
GPU 到网卡同一交换域,PIX 或 PHB跨槽互连,矩阵里标 SYS每包多一趟互连,直路收益被吃掉一部分
进程到内存核与内存同节点核在对面节点延迟上浮、带宽打折,举例机型单向读约剩三成
进程到 NVMe盘与进程同节点盘在对面节点读盘先跨槽再进内存,时延多一段

跨槽的两笔账:空闲延迟约 1.8 倍,单向读带宽只剩约三成(举例机型,非通用数;延迟口径为 MLC 实测,带宽口径为 Intel 社区例子)

画图三步,验收四问

画图可以按三步走。第一步,用 lspci、nvidia-smi topo -m、numactl --hardware 把物理树与节点距离拉出来,这是底稿。第二步,把 GPU、网卡、NVMe、内存、进程核组标到两个节点上,每块设备只归一个节点,不许脚踩两只船。第三步,对每条热路径标出经过的边:是 PIX、PHB,还是 SYS。标完之后,配置单上的每一项都能在图上找到位置,找不到位置的项,就是还没谈清楚的项。

验收时问四个问题就够了。GPU 与它的网卡,是 PIX 或 PHB,还是 SYS。跑数据的进程核与它要读的内存,是不是同节点。读盘最勤的进程与 NVMe,是不是同节点。换了插槽、换了卡之后,归属图重画了没有。四个问题里只要有一个答不上来,性能测试的结果就先打个问号:测出来的数,可能测的是路径,不是设备。

以小见大的一层判断:配置单写的是型号清单,归属图写的是数据要走的路。型号决定一台机器的上限,路径决定能不能走到上限。上一期讲 GPUDirect,是把路修直;这一期讲归属图,是修路之前先看路牌。路牌没看清,直路也可能从隔壁节点绕过去。

没完全想通、留下一个问题:双路的归属图只有两个节点,画起来还算清楚;到了四路、八路,或者单颗 CPU 内再分子 NUMA 域的机器,节点一多,跨域的层级与代价刻度怎么标,现有工具的矩阵还够不够用,还缺一套对着实测标刻度的方法。没有这套刻度,多路机器的归属图只能画出方向,画不出边界。

觉 然 小 注

型号是写给人看的,归属是写给数据走的。图画对了,机器才知道路怎么走。

· · ·

九羲科技|服务器 · 私有 AI · 存力方案

系列目录
第1期 | 73% 的整机钱,都给了 GPU 板组
第2期 | 4500 颗芯片撑起 95% 的机架价值
第3期 | 拆一台 2U 双路:通用服务器的钱花在哪
第4期 | 大铁盒子,值钱的不是铁
第5期 | 冻结点:L5 之后结构不许再改
第6期 | 能点亮不等于能交付:十二层验什么
第7期 | 内存离 CPU 有多远:NUMA 的延迟税
第8期 | 带宽不是买速度,是买并行度
第9期 | 一颗坏芯片,怎样不拖垮整机
第10期 | 数据上台三步,每步都在花时间
第11期 | CXL 内存慢一档,为什么还值得买
第12期 | 存力只在关键路径上才算数
第13期 | 链路是谈出来的:开机几秒谈什么
第14期 | 四电平挤带宽:SerDes在替谁赎买
第15期 | 端口数好看,带宽要看上行
第16期 | 把故障关进一个端口
第17期 | 设备能缓存主机内存,变了什么
第18期 | 数据直进 GPU,省掉了什么

引用与出处
[1] NVIDIA. nvidia-smi(1) — Topology. ManKier. <a href="https://www.mankier.com/1/nvidia-smi">https://www.mankier.com/1/nvidia-smi</a>
[2] Intel 官方社区技术人员回复. Much lower memory bandwidth with NUMA disabled. Intel Community. <a href="https://community.intel.com/t5/Processors/Much-lower-memory-bandwidth-with-NUMA-disabled/m-p/1223417/highlight/true?profile.language=fr">https://community.intel.com/t5/Processors/Much-lower-memory-bandwidth-with-NUMA-disabled/m-p/1223417/highlight/true?profile.language=fr</a>
[3] Steve Scargall. Linux NUMA Distances Explained. stevescargall.com. <a href="https://stevescargall.com/blog/2022/11/linux-numa-distances-explained/">https://stevescargall.com/blog/2022/11/linux-numa-distances-explained/</a>

下一篇|第20期:内存按通道对称插满 —— Rank 与降频这笔账,在报价单上看不见。

← 返回资讯中心