一个十年+的PC DIY爱好者看NUMA
1.2 UMA
UMA,Uniform Memory Access,一致性内存访问。通过北桥芯片中的内存控制器访问内存的这种架构就是UMA,总线模型保证了CPU所有的内存访问都是一致的,不用考虑不同内存地址的差异。
但是这种设计也带来了一些问题:
CPU需要先通过主板电路访问北桥芯片中的内存控制器,内存控制器再通过主板电路到多条内存的DIMM接口访问内存,传输链路较长
在多CPU场景下的单一的前端总线设计会造成传输瓶颈
2 Chipset & CPU
从X58开始,CPU和主板的相关设计就产生了较大的变化,其中比较重要的一点就是内存控制器被整合进了CPU内(当然还包括部分PCIe通道),而主板上北桥和南桥芯片的其他一些功能被整合进了芯片组。下面为AMD最新的桌面级X870E主板示意图,可以看到CPU与芯片组的分工:
这样的设计带来了以下一些变化:
减少了CPU核心到内存控制器的距离,减少了延时
每个CPU访问属于自己的部分内存,使得内存扩展变得容易且不易出现瓶颈
多个CPU之间使用Intel UPI(Ultra Path Interconnect)或AMD Infinity Fabric等技术互联进行交互数据
3 NUMA
正是由于设计的变化,尤其是每个CPU访问属于自己部分的内存,对于全局来说不是一致的,需要考虑不同内存地址的差异,NUMA(Non-Uniform Memory Access)也就应运而生。这里也带来了一些新的问题:
内存访问出现了本地和远程的区别,比如两份需要关联使用的数据分别存放CPU1和CPU2对应的内存中,需要关联使用时则需要使用UPI/Infinity Fabric在两个CPU之间交互
即便UPI/Infinity Fabric非常快但是相较于CPU内部数据交互,内存的远程访问延迟明显高于本地访问
多核心CPU中可能存在多个内存控制器,每个内存控制器有若干通道,会出现CPU内部多组NUMA的情况
4 优化
在一些对响应要求比较极端的系统中,会将一些操作制定到固定的NUMA节点中,以避免内存的远程访问,这需要对CPU逻辑核心、物理核心、内存控制器配置以及自身软件设计、负载和操作系统有深入了解。
增加单Socket CPU物理核心数量,优化CPU中内存控制器设计,减少CPU Socket的数量。
从CPU微码层面针对运行软件进行优化,以减少内存远程访问。
开辟独立的内存区域专门用于NUMA交互缓存,需要软件做出相关设计。
…返回搜狐,查看更多