编者按:飞腾作为国内 CPU 设计的领先企业,其 CPU 在各行各业已经获得的广泛应用。为了广大客户更好的使用 CPU、更好的提升性能,本文将详细介绍飞腾服务器 CPU 的性能调优原理以及相应调优方法。整理自龙蜥大讲堂,文末附获取 PPT 方式,欢迎查看!
一、软件调优的方式
• 算法优化
算法优化是指对算法的有关性能进行优化,比如时间复杂度等。为了提升算法的处理问题的能力,通常需要对算法进行合理优化。
• 指令集优化
1)针对程序关键代码段嵌入汇编指令进行优化
2)NEON 是一种 SIMD 指令,可以运用在信号处理,向量运算等场合
• 针对体系结构的性能优化
根据体系结构的特点,针对系统和应用程序进行合理配置和部署调优。本文主要介绍该调优方法。
二、CPU 内部体系结构
2.1 FT-2000+/64 内部体系结构
• 64 个 CPU 核,8 个 NUMA
• 每 NUMA 含 8 个核,一个 DDR4 控制器
• 每 4 个核共享 2 MB L2 cache
• 两个 PEU 单元、PEU0 连接在 NUMA0、PEU1 连接在 NUMA6
(图1/ FT-2000+/64 内部体系结构图)
2.2 S2500 内部体系结构
(图2/S2500内部体系结构图)
• 64 个 CPU 核、8 个 NUMA
• 每 NUMA 含 8 个核,一个 DDR4 控制器
• 每 4 个核共享 2 MB L2 cache
• 一个 PEU 单元连接在 NUMA0
• 多路互联 DLU 连接在 NUMA6
三、CPU 体系结构影响程序性能的因素
3.1 CPU 访存的性能
每个 NUMA 的 CPU 访问本 NUMA DDR 控制器的内存性能最佳,访问其他 NUMA 性能有一些差异。
3.2 外设访存的性能
PEU0 上的外设访问 NUMA0 内存性能最佳,PEU1 访问 NUMA6 内存性能最佳。
3.3 跨路访存的性能
CPU 和外设访问其它 socket 的内存比访问本路内存性能更低。
四、CPU 体系结构相关性能的调优方法
NUMA(Non Uniform Memory Access),即非一致内存访问,是针对 UMA(Uniform Memory Access)提出的。NUMA 架构下,多 CPU 对主存的访问并非对等的,每个 CPU 都有自己的主存, CPU 与自己的主存物理上距离更近,访问速度更快,而访问远端存储器的速度相对要慢。
Linux 内核支持这种特性,配置 numa 支持对驱动和应用程序来说确实会有不少的性能提升。
4.1 CPU 访存类型优化方法(一)
CPU 访存的性能
实例:多进程的音视频处理服务器,每个进程含 6 个线程,各进程相互独立。运行8个服务进程,程序延时抖动很大,性能波动。
优化原理:每个进程绑定到一个 NUMA 的 8 个 CPU,每个进程从本地 NUMA 分配内存,避免跨 NUMA 分配内存带来的访存带宽变低和延迟的影响。
操作步骤:
使用 numcactl 绑定服务器进程,并指定内存分配策略.-C 指定 cpu 号,-l 指定当前的节点分配内存的:
numactl -C $cpus -l 音视频服务器。
(图3/进程调优部署结构图)
4.2 CPU 访存类型优化方法(二)
实例:飞腾数学处理库,使用多线程进行矩阵运算,使用 NUMA API 分配内存提升性能。
优化原理:根据每个线程运行的 CPU 所处的 numa 分配矩阵运算所需要的内存,这样运算的线程访存速率最快,同时配合使用 NEON 指令集对程序进行优化。
4.3 IO 访存类型(内核网卡驱动)(一)
实例:25G 网卡 iperf3 测试性能调优。
优化原理:网卡队列中断亲和性均衡设置到对应PEU所在的核,提升网卡DMA访存的性能。
操作步骤:
1)关闭 irqbalance。
systemctl stop irqbalance.service
2)查询网卡中断号。
cat /proc/interrupts | grep $eth | awk -F ':' '{print $1}'
3)根据具体 CPU 的体系结构,使用 lspci -tv 确定网卡所属的 PEU。
4)将每个中断分别绑定在网卡所属 NUMA 对应的一个核上,并且均匀分配。cpu指定 CPU 编号,irq 指定中断编号。
echo $cpu> /proc/irq/$irq/smp_affinity_list
(图4/ iperf3测试)
4.4 IO 访存类型(DPDK)(二)
实例:20G 网卡 dpdk 测试性能调优
优化原理:每个 pci 设备在 pci devie 目录下有一个 numa_node 的属性,记录设备所在的 numa_node 信息,dpdk 内存管理根据该信息从对应 numa 内存区域分配接收缓冲区。确保系统中 numa_node 信息分配正确,提升 IO 传输的性能。
操作步骤:
1)根据具体 CPU 的体系结构,使用 lspci -tv 确定网卡所属的 PEU。
2)查看网卡的 numa_node 是否正确配置,其中pci_addr表示设备pci地址
cat /sys/bus/pci/devices/pci_addr/numa_node
3)根据网卡所连接的 PEU,配置网卡的 numa_node,其中 numaNode 表示 numa 编号,pci_addr 表示设备 pci 地址。
echo $numaNode > /sys/bus/pci/devices/pci_addr/numa_node
(图5/dpdk testpmd 测试数据)
关于技术课件获取方式:
【PPT课件获取】:关注微信公众号(OpenAnolis),回复“龙蜥课件” 即可获取。有任何疑问请随时咨询龙蜥助手—小龙(微信:openanolis_assis)。
—— 完 ——
加入龙蜥社群
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!
关于龙蜥社区
龙蜥社区(OpenAnolis)由企事业单位、高等院校、科研单位、非营利性组织、个人等在自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、开放的Linux 上游发行版社区及创新平台。
龙蜥社区成立的短期目标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应对方案,构建一个兼容国际 Linux 主流厂商的社区发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。
目前,Anolis OS 8.6 已发布,更多龙蜥自研特性,支持 X86_64 、RISC-V、Arm64、LoongArch 架构,完善适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。
欢迎下载:
https://openanolis.cn/download
加入我们,一起打造面向未来的开源操作系统!
https://openanolis.cn