搭国产服务器集群的时候,不少运维都撞上过同一条硬规矩:内存插槽必须成对、全通道均匀插满。少插一组,数据库和虚拟化业务的性能直接掉三成,严重的时候掉一半以上。
![]()
换成英特尔至强服务器,随手插2条、4条内存照样跑,带宽和延迟的衰减几乎感知不到。同样是NUMA非一致内存访问架构,为什么内存使用门槛差这么多?答案藏在芯片底层。
一颗CPU,被拆成了好几块
英特尔传统服务器Xeon走的是一体式大芯片加环形Ring总线的路子。一颗CPU内部,所有计算核心、三级缓存、内存控制器全挂在环形总线上,整颗处理器算作1个NUMA节点。只有双路、四路整机场景才按插槽划分节点,节点总数最多4个,粒度很粗。
内存通道属于CPU的全局资源。只插一半内存,空闲通道也只是小幅缩减总带宽,BIOS自带的内存交错机制会把内存布局自动打散,抹平不均衡带来的影响。本地内存和跨插槽远程内存的延迟差距只有1.2到1.5倍,偶尔跨节点访问,开销很低。
国产服务器CPU是另一套逻辑。受限于国内DUV工艺的缺陷密度扛不住大Die良率,海光、鲲鹏、飞腾普遍采用多芯粒堆叠的Chiplet方案:
- 海光承袭AMD CCD模块化设计,单颗CPU被切分为多个计算芯粒,内部拆出4到8个微型NUMA单元,每个单元独立绑定专属内存通道;
- 鲲鹏、飞腾采用多Die Mesh互联架构,单颗CPU原生划分4组计算区块,各自独占内存通道,天然就是碎片化的NUMA拓扑。
痛点就出在这里。内存没有均匀填满全部通道时,部分NUMA节点没有本地内存可用,CPU核心运算只能跨过片间互联总线,去别的节点调数据。本地内存和跨节点内存的延迟差距直接拉到2倍以上,并发场景下片间总线拥堵,带宽大幅缩水,数据库读写、虚拟机调度、中间件转发都会明显卡顿。
互联总线的代差
NUMA架构的体验上限,由跨节点互联总线决定。英特尔UPI互联总线迭代了十余年,带宽冗余充足、拥塞控制成熟,跨插槽传输延迟低、衰减平缓,环形总线的一致性协议也打磨得完善,少量跨节点访问不会造成系统抖动。
国产片间互联总线(Infinity Fabric、HCCS)起步晚,带宽上限、延迟控制、并发拥堵抗性都存在代差。节点越多,跨节点访问的损耗越会累积;大量零散远程内存读写涌进来,总线极易拥堵,性能损耗被进一步放大。硬件层面没有足够冗余去包容内存排布不均衡带来的额外流量,最稳妥的办法就是让每个微型NUMA节点都有专属本地内存。
软件侧的积累差距同样不容忽视。英特尔持续数十年参与Linux内核开发,针对粗粒度NUMA做了海量调优,后台内存自动均衡、延迟感知线程调度、远程访问预判等机制都很成熟,内存布局不均时系统会悄悄迁移内存、调整线程绑定。
国产服务器CPU商用落地周期较短,内核专属优化覆盖面不足,自带的NUMA自动均衡策略效果有限,盲目开启内存迁移反而容易引发业务抖动,多数场景要靠运维手动绑核、划定内存节点。硬件厂商为了降低运维出错概率、保障交付稳定性,干脆统一定下硬性规范:内存全通道均匀插满。
还有一层生态因素。MySQL、Oracle、虚拟化平台等商用软件长期以英特尔NUMA拓扑为基准完成调优,迁移到国产细碎NUMA环境后,内存排布失衡极易触发性能bug,满配内存成了国产化项目落地的标配方案。
不过英特尔也不是完全不用满配内存。高性能计算、内存数据库、超大并发缓存这类极致带宽场景,英特尔同样推荐满通道插内存,把总带宽拉满,只是半配场景损耗可控,普通业务不必苛求。另外AMD EPYC与海光架构同源,同属细碎NUMA设计,对内存均匀度的要求远高于英特尔,这也是x86小众多核芯片的共性。
国产CPU强制内存插满,本质是Chiplet碎片化架构、片间互联带宽延迟受限、软件生态打磨不足共同作用下的折中最优解。英特尔靠一体式大芯片架构、成熟互联总线和长年累月的系统生态积累,换来了更高的容错空间。现阶段做国产化算力建设,遵循全通道均匀插内存,依旧是保障业务稳定高性能运行的第一准则。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.