1、背景
业务在倚天新平台适配后,性能表现不如预期。本文介绍从芯片、OS 内核、网络 IO及软件各层的瓶颈分析和性能调优方法。
2、NUMA 及访存性能优化
优化措施 1:调整关键进程布局,减少跨 Node 访问内存。
倚天 710 芯片内核由两个 DIE 组成,对应两个 NUMA node。为了避免跨 Node 访问内存导致的性能下降,开启了 NUMA(感知到两个 Node),并通过 cgroup 的方式限制进程使用的 CPU 和内存在同一个 Node, 以避免跨 Node 访问内存,如下图:
优化措施 2:开启内核 Duptext 特性,防止代码段(.text)跨 Node 访问。
在进行访存性能分析中我们发现关键进程代码段与进程使用的 CPU 和内存是处于两个不同的 Node,存在代码段跨 Node 访问的问题,导致端到端性能下降。
上图中,运行在 Node1 的进程 process,其代码段在安装部署的流程中已经缓存在 Node0 的 Page Cache 中,而进程实际上绑定在 Node1,因此进程在运行过程中 icache miss 后会到 Node1 的内存中加载代码段数据,极大的降低了运行的效率。
sudo cat /proc/${pid}/numa_maps
通过内核上述可以看到进程使用的内存相关信息,其中 0040000 地址的内存为代码段,N0=xxxxx 表示有 xxxxx 个 Pages 的内存页在 Node0 中(业务进程绑定在 Node1),影响性能。此外,由于内存页在两个 Node 的分配比例不稳定,会导致性能抖动。
有多种方式可以解决此问题,例如在拉起进程之前可以先 drop caches,将进程代码段从 Page cache 中清理出去,然后进程拉起的时候会根据我们的 cgroup 设置将代码段分配在本地内存中。但根据以往的经历,这种方式存在稳定性风险,可能导致系统 hang 住,因此无法落地。 Duptext 特性可以很好的避免出现上述代码段跨 Node 的情况。其原理是根据进程的 CPU/内存亲和设置,将其代码段拷贝到进程的 Local 内存节点,使得进程可以直接访问 Local 内存中的代码段副本。此外,此特性还可以避免进程访问共享库的代码段跨 die 问题。
优化措施 3:开启内核透明大页(包括代码大页)
倚天710 访问远端内存会导致性能下降,需要采取措施进行避免。开启内核透明大页可以有效地降低 TLB miss ,从而提高访存的性能。
3、使能硬件相关特性
使能芯片 SLC stash 特性(类似 Intel DDIO),降低网卡 PCIe 延时,提升网络性能。
业务端到端性能对网络性能非常敏感,网络的耗时在延时中占比较高,因此网络的性能对性能影响很大。通过验证发现使能芯片 SLC cache 有效降低 PCIe 延时,从而降低网络延时。其原理是使能 PCIe 直接写入 L3 cache,使得 CPU 可以在 L3 cache 中命中网卡写入的数据,从而节约 CPU 读写内存的延时。
4、 其他优化措施
优化措施 1:调整 CPU 频率和内存频率
倚天 710 在 128C 配置下 CPU 频率默认为 2.75GHz,内存频率默认为 4400MHz,这主要是为了功耗和稳定性考虑。但经过初步测试和评估,提高 CPU 频率到 3.0GHz 和内存频率 4800MHz 后,极限压力场景下 CPU 和整机功耗均远小于额定功率。
优化措施 2:使用 Bolt 进行编译优化
BOLT 是一个编译器动态反馈优化工具,主要依据生产环境的实际运行数据,反哺指导编译器对程序代码进一步调整编译优化策略,提高分支预测准确率和指令 Cache 命中率,达到深度调优、提升产品应用核心竞争力目的。
5、总结与展望
通过上述的优化措施可以看到,业务性能对计算、访存、网络/IO 等都有很高的要求。倚天作为云原生处理器芯片,具有强悍的计算性能,在通过深入移植适配调优后能够更好的发挥 CPU 的性能,使得业务性能得到大幅的提升。