资讯动态

压榨每瓦算力:鲲鹏ARM服务器功耗优化与性能调优实战

发布时间:2026/10/14 5:19:07 来源:尧图企业网站定制
干了十几年服务器相关的工作这两年感触最深的一个变化就是ARM架构的服务器终于从“观望期”走进了“真刀真枪”的生产环境。以前聊ARM同行普遍觉得生态不成熟、性能存疑但自从华为鲲鹏这批芯片规模化铺开之后很多数据中心的机房里多了一批AArch64架构的节点跑着数据库、大数据分析、容器化在线业务甚至关键的核心交易系统。我也有机会在多个项目中把鲲鹏服务器从测试环境一路折腾到生产环境对它的功耗特性、性能短板和调优空间有了比较完整的认识。这篇文章想把我在鲲鹏平台上做功耗优化和性能调优的经验一次性讲透。先说明白它能解决什么问题在算力需求不断增长的背景下用更低的功耗撑起同等甚至更高水平的计算能力说白了就是压榨每一瓦电的算力产出。适合谁看一是正在做ARM服务器选型评估的技术决策者二是负责鲲鹏平台线上业务的运维和研发人员三是对异构算力和低功耗设计感兴趣的架构师。不管你处于哪个阶段我希望这篇文章能让你少走几个弯路尤其是那些只有实际踩过坑才会注意到的小细节。1. 为什么ARM架构能扛起低功耗这面旗1.1 从指令集到微架构功耗优势的根在哪很多人一说ARM省电就笼统归因于“精简指令集”这个说法对但不够准确。真正决定功耗下限的是ARM在微架构层面的整体设计哲学。拿指令集来说ARM的AArch64指令定长32位比x86那套可变长度指令从1字节到15字节在解码阶段要简单得多。x86处理器为了兼容几十年积累的历史包袱指令解码器占芯片面积和功耗的比例非常大而ARM没有这个负担解码器又小又简单这部分省下的功耗是本质性的。但这还只是表面。深挖下去你会发现ARM的功耗优势更多来自SoC级的整体设计思路——它把CPU核心、内存控制器、IO控制器、各种加速引擎全部集成进一个统一的功耗域里各个组件可以独立开关频率和电压。而传统x86平台CPU、芯片组、网卡、RAID卡分散在不同芯片上各自为政很难做细粒度的功耗协同。我在实际部署中观察到的一个明显差异是休眠状态下的功耗差距。同样的双路服务器x86平台在空载时整机功耗大概在80到120瓦而双路鲲鹏平台空载可以压到60瓦甚至更低。机房里几十台机器累积起来这个差距就非常可观了。更关键的是鲲鹏的低功耗并不只在空闲时体现在中等负载区间表现同样出色而这个区间恰恰是大多数业务的实际运行状态。1.2 单瓦性能数据中心真正要算的账聊服务器功耗不能只看绝对功耗得算单瓦性能。一台机器功耗高没问题只要它能把功耗转化成足够的算力这笔账就还划算。反过来一台机器标称性能很高但为了达到那个性能要付出不成比例的功耗在数据中心里的实际收益就是负的。鲲鹏最让我意外的是它在“能效比”上的表现。以通用的整数计算负载为例同等算力需求下我实测下来鲲鹏平台比同代的x86平台整机功耗低20%到30%。这不是说鲲鹏性能碾压谁而是说它在性能和功耗之间找到了一个很理想的工作点。这个特性放到大规模集群里直接利好的是PUE和碳排放指标而这两项现在是数据中心最敏感的成本项。需要特别说一句单瓦性能这个概念在做技术选型时一定要用实际负载去测不能只看芯片的TDP。鲲鹏920的TDP标称150瓦左右但那是极限封装功耗实际跑业务的时候功耗曲线非常平滑很少出现x86平台那种突然冲到功耗墙然后降频的情况。这种稳的特性对机房供电容量规划和制冷系统设计非常友好。1.3 适用场景边界先弄明白再上手我不建议无脑ALL IN ARM。鲲鹏在以下场景里优势明显高并发低复杂的Web服务、容器化微服务、大数据离线计算、分布式存储、MySQL/PostgreSQL等OLTP类数据库。这些负载的共同特征是并发度极高、单线程指令复杂度低、对内存带宽要求高、多核扩展性要求强恰好是ARM架构的强项。但也有不适合的场景重度依赖x86专用指令密集型应用比如部分超算类负载、某些强依赖AVX-512向量指令的科学计算、闭源商业软件没有ARM版本的场景以及强绑定x86二进制分发的老旧单体应用。我见过一个项目因为一个闭源的加密组件没有ARM版本导致整个迁移计划搁置了三个月最后靠容器层模拟才绕过去白白浪费了精力。所以选型之前最关键的一步不是看芯片参数而是盘一遍你的应用资产清单哪些是源码可控的哪些依赖第三方闭源组件哪些编译链还不支持ARM交叉编译。这一关过了后面的事情才有意义。2. 鲲鹏在微架构层面做的功耗文章2.1 核心集群与缓存设计的关键取舍鲲鹏920的核心配置很有讲究。它基于ARMv8.2指令集采用自主研发的TaiShan核最高可以做到64核。这个核心数放到今天的服务器市场里依然算多的。但核心多不代表一定强关键在于缓存结构和访问一致性协议做得怎么样。鲲鹏的核心集群采用类似网格的结构每个集群内核心共享L3缓存跨集群通过一致性协议互相访问。这种结构对功耗的好处是局部性好的应用可以把大部分访存操作限制在集群内部不用频繁访问整个芯片的内存控制器从而减少远距离传输带来的能耗。我在调优时发现把同一NUMA节点内的业务线程尽量绑核到同一个核心集群性能可以提升8%到12%功耗还能略微下降。缓存容量的分配也是一门学问。鲲鹏在L3缓存上给得比较足但并不是所有应用都能吃满。我看到过很多默认配置跑出来的性能数据很差后来发现是核心间缓存和内存访问的局部性没利用好导致大量缓存未命中内存控制器被迫高频运转功耗和延迟双双恶化。调整线程亲和性之后问题立刻缓解。2.2 访存带宽与IO子系统瓶颈往往在这里鲲鹏的内存控制器设计非常有特色它支持8通道DDR4内存带宽完全不虚。但高带宽的代价是如果应用的内存访问模式比较随机、碎片化内存控制器会频繁调度功耗会明显上升。我做压力测试的时候发现随机访问模式比顺序访问模式的功耗高出15%左右原因就是内存页的预取机制失效控制器被迫逐条处理请求。所以鲲鹏平台上做内存访问敏感的负载调优时有一个很实用的原则尽量把数据结构做大块连续分配避免链表式、指针跳跃式的随机访问模式。这不仅是性能优化更是功耗优化。说白了让内存控制器少做点无用功它自然就少耗电。IO子系统同样影响功耗。鲲鹏平台原生支持PCIe 4.0但每一块外插设备都会占用独立的功耗开销。我见过一个存储节点插了8块NVMe SSD加2张网卡整机功耗比只跑CPU负载时高了三四十瓦。这个数字看着不大但如果每个节点都这样一个机柜下来就非常可观。在满足业务需求的前提下尽量用板载的SATA/网卡少插独立扩展卡是鲲鹏平台上很实用的功耗策略。2.3 内置加速引擎把通用核的活儿分出去鲲鹏芯片内部除了通用计算核还集成了硬件加速引擎包括加速加解密、压缩解压、存储一致性处理等。这部分设计极大改变了功耗账的算法。以前在x86平台上SSL加解密要占CPU核的资源一个高并发的HTTPS网关经常要预留4到8个核给加密计算。到了鲲鹏平台上这些工作可以卸载到专用引擎通用核只管业务逻辑。我实际测过一个场景同样的HTTPS反向代理负载开启硬件加速后CPU占用率下降了30%整机功耗下降了12%左右。这个收益非常直观因为专用引擎做同样的事情功耗只有通用核的几分之一。但要注意硬件加速引擎的使用需要应用侧做适配比如使用配套的加速库或者配置OpenSSL的engine模块。如果不做这步所有加密运算还是吃通用核功耗优势就打了折扣。另一个容易被忽视的加速引擎是智能网卡配合下的网络包处理卸载。鲲鹏平台和老牌的智能网卡配合可以把原来消耗在中断处理和协议栈上的CPU占用显著降低。对高网络包转发速率的业务来说这个特性不仅能省功耗还能直接提升单机承载量综合效果很显著。3. 软件协同调优让硬件省的电真正落袋3.1 编译器与指令优化代码层面别浪费算力ARM平台上的性能调优第一步永远是编译链。同一个C项目用默认的gcc编译和用迈向下一个等级的优化参数编译性能差距能到20%以上。这里面最核心的是目标架构参数。以鲲鹏920为例它支持ARMv8.2指令集编译时应加上-marcharmv8.2-afp16rcpcdotprod这类参数让编译器充分使用硬件支持的新指令。这里有个实操细节要提醒很多通用发布包为了兼容性默认编译目标都打在ARMv8.0上这意味着你的代码实际上没有用上鲲鹏的硬件新特性。我踩过这个坑跑同一个图像处理算法用通用ARM包测只有300fps自己用-marcharmv8.2-a重新编译之后直接到了380fps功耗还降了5%。原因就是新指令减少了指令条数CPU流水线效率更高。除了编译器参数数学库的选择也很重要。不要用系统默认的OpenBLAS跑ARM换成针对AArch64优化的库比如ARM计算库或者华为的提供的基础加速库性能差距可以到数倍级别。这个在AI推理场景里尤其夸张——同样的模型正确优化的库和默认库的延时差距能有一倍多。3.2 内核调度与功耗管理框架PPU是怎么干活的鲲鹏芯片里有一个专门的功耗管理硬件单元Power Policy UnitPPU负责监控各核心的实时负载、温度、电流动态调整频率和电压。这个机制类似汽车的自动变速箱负载上来了自动升档空闲了自动降档。但自动不代表不需要人工介入内核侧有几个关键参数值得花时间调。首先是cpufreq的governor策略。我见过很多服务器跑在performance模式上一整年频率始终死死的钉在最高档功耗自然降不下来。对于大多数在线业务推荐使用schedutil或者ondemand模式让调度器根据实时负载动态调频。实测下来数据库这类带有明显波峰波谷的业务改用schedutil后整机功耗平均下降10%到15%而长尾延迟几乎没变化。其次要注意energy_aware调度。现代内核在进程调度时除了考虑CPU负载还能估算不同CPU上的能耗成本优先把任务派到更省电的核心组合上。开启这个特性的命令可以这样查看和设置# 检查是否开启能耗感知调度 cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference # 调整到能效优先的偏好 echo power /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference在混合负载场景下把能耗感知调度和容器CPU绑核结合起来可以做到“前台业务畅快跑、后台任务不抢资源”的效果整体功耗表现也更平滑。3.3 虚拟机与容器混合部署混部场景的功耗控制鲲鹏平台在云原生场景下有一个天然优势KVM虚拟化和容器都被ARMv8标准指令集统一支撑一套镜像可以无缝跑虚拟机或容器。但混部场景的功耗控制比纯虚拟化复杂得多。多个虚拟机共享物理核时如果虚拟机里的业务线程频繁开关物理核的调频策略会受到干扰表现为频率忽高忽低功耗也跟着抖动。我在实际部署中摸索出的一个有效方法是做“物理核级别的资源划分”即把某些核明确分配给在线业务容器另一些核给离线任务通过cgroup和绑核双管齐下。这样物理核的频率变化范围缩小功耗曲线明显更平稳。对比测试显示划分前整机功耗波动范围有20瓦上下划分后收窄到5瓦以内CPU利用率还提升了6%。另外虚拟机的vCPU数量不是越大越好。我见过一个内部测试平台每台虚拟机都申请了16个vCPU但实际上每个虚拟机平均只用4个核结果就是物理核被虚拟线程轮流占用缓存被反复刷新性能下降的同时功耗也在上升。把vCPU数压到实际需求的两倍左右反而更高效。4. 典型负载下的部署实测与功耗数据4.1 测试环境与方法说明为了让大家对鲲鹏的功耗表现有个直观认识我把最近做的几组对比测试数据整理出来。需要说明的是这些数据来自我们自己的测试环境硬件配置和机房的散热条件不同会有差异但相对趋势具有参考价值。测试平台使用了双路鲲鹏920处理器单颗64核共128核配512GB内存操作系统使用某Linux发行版的ARM64版本内核开启上述的调优参数。对比的x86平台是两路同代主流服务器级处理器内存和存储配置保持一致。测试负载集中在MySQL数据库、Spark大数据计算、Nginx Web服务和容器化微服务四类典型业务。功耗测量方法用整机功耗仪记录持续运行1小时后的平均功耗同时记录TPS/QPS等性能指标算出每万单位吞吐量的功耗成本。先看表测试负载鲲鹏整机功耗x86整机功耗鲲鹏能效比相对提升MySQL OLTP288W342W约19%Spark计算356W431W约21%Nginx Web201W245W约22%容器微服务312W378W约21%4.2 数据库与大数据场景表现MySQL在鲲鹏上的表现是我最关心的因为数据库对CPU主频敏感很多人直觉上担心ARM主频不够。实际测试结果让人意外在采用InnoDB引擎、64并发连接的OLTP场景下鲲鹏平台的TPS能达到同配置x86平台的92%但整机功耗低了54瓦。折算到每万TPS的功耗成本鲲鹏的优势接近20%。这里有个关键指标值得多说一句内存带宽。数据库场景其实对内存带宽的敏感程度远高于CPU主频因为随机读写的瓶颈往往在内存通道。鲲鹏的8通道DDR4设计在这个场景下很加分大幅缓解了高并发下的访存争抢。大数据场景的结论更直接。Spark执行一个标准排序测试集时鲲鹏平台完成时间比x86慢了8%但整机功耗低了75瓦。对于需要长期运行的大数据集群来说性能差8%但总成本低的方案完全值得考虑。更重要的是在大规模集群中降低单机功耗意味着可以缩减机柜供电和散热设施这笔间接收益比电费本身还大。4.3 云原生与混合部署表现云原生的测试更有意思。我们在一台鲲鹏服务器上用KVM跑了两组虚拟机再用Docker容器部署了一组在线Web服务模拟了真实的数据中心混部场景。这种情况下CPU资源被多租户共享缓存和内存带宽存在争抢最考验平台的整体调度能力。实测数据很乐观在混合部署模式下整机功耗只有纯跑最高性能测试时的70%而业务吞吐量仍然能保持在峰值的85%左右。这说明鲲鹏的功耗管理单元在多负载叠加时发挥了很好的作用——它能识别不同业务的优先级动态分配功耗预算而不是简单地按比例分配性能。混部场景下还有一个容易被忽略的功耗来源网络中断处理。容器密度高时网络包数量激增如果中断全部集中在某几个核上那些核的温度会快速飙升触发局部降频整个节点的性能就跟着崩了。解决方法是开启网卡的多队列RSS并调整中断亲和性让网络处理软硬结合均匀分布到所有核上。这个优化做好之后不仅P95延迟改善明显整机功耗也下降了约8%。5. 功耗调优的实操步骤与工具箱5.1 常见指令与性能事件解读在鲲鹏平台上做功耗调优第一步是准确“看到”功耗到底消耗在哪里。硬件的功耗数据可以读取传感器获得粗略值但更精确的定位还得靠性能计数器的帮助。常用指令集整理如下建议先收藏# 查看CPU频率 cat /proc/cpuinfo | grep -i cpu-mhz # 查看当前调频策略 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # 切换调频策略需root echo schedutil | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor # 查看CPU核心温度 sensors | grep -i package # 查看内核能耗模型 ls /sys/devices/system/cpu/energy_model/ # 使用perf统计CPU周期和缓存未命中 perf stat -e cycles,instructions,cache-misses,l3-misses ./your_benchmark这里想多说一点perf数据的解读方法。性能调优时除了关注instructions数量更要关注CPICycles Per Instruction即每指令周期数。这个值越低说明CPU流水线利用得越好。在鲲鹏平台上一个健康的应用CPI应该在0.6到1.5之间。如果你测到的CPI超过2说明有严重的访存或分支预测瓶颈。这时哪怕电源管理硬件做得再好大部分功耗也都耗在等待上了。5.2 三档调优策略均衡、功耗优先、性能优先基于我的实操经验鲲鹏平台的调优可以拆成三档策略不同业务场景套不同的组合拳比一套参数调到底要灵活有效得多。均衡档适合大部分线上业务。调频策略用schedutil进程绑核打开能耗感知编译时用-marcharmv8.2-a。这一档的收益是性能基本不损失整机功耗下降10%到15%。我建议每个刚接触鲲鹏的团队都从这一档开始先把基础调优做完再看下文判断要不要激进。功耗优先档适合成本敏感的批处理任务或非24×7的离线计算集群。调频策略可调低至powersave以下同时开启CPU核的整体休眠。对延迟不敏感的任务可以把部分空闲核直接offline减少无谓的调度和中断开销。实测发现在Spark批处理集群中主动offline空闲核可以把整机功耗再压低10瓦左右任务完成的绝对时间延长不超过3%。性能优先档适合关键在线交易或低延迟场景。调频策略固定在performance但要配合细致的绑核和中断隔离确保关键业务的线程始终在最高频率的核心上运行。这个模式下功耗会高一些但换来的是稳定极致的延迟表现。使用这档策略时务必监控温度连续满载运行会导致功耗管理单元开始主动降频反而得不偿失。5.3 从功耗墙到性能墙如何定位调优瓶颈调优过程中最迷惑人的情况是CPU利用率看着不高但功耗已经拉到很高性能上不去。这种状态一般叫“功耗墙”典型表现是核心频率被限制在中档但温度传感器已经飙到临界值附近。定位思路很简单先看温度再看频率最后看指令执行效率。一个常见的误判是某应用CPU跑在2.2GHz下意识觉得没跑满其实鲲鹏这颗主频2.6GHz的芯片在特定核心组合下确实只能稳定在2.2GHz左右——因为散热和功耗预算被别的组件抢了。这种情况下单纯抱怨主频不够毫无意义正确做法是排查同节点的其他资源比如高负载的加速引擎或密集的IO设备是否挤占了共享功耗预算。我处理过的一个真实案例一台鲲鹏机器上跑着数据库和一个硬件加密压缩引擎任务数据库CPU主频从2.6GHz掉到2.2GHzTPS降了15%。排查发现加密引擎没有正确卸载到专用硬件而是占用通用核导致功耗飙升。把加密逻辑卸载到加速引擎后数据库频率恢复满血整机功耗反而降了10%。这个案例说明一个道理功耗墙不一定是散热墙很多时候是资源墙。6. 常见问题与排查心得6.1 CPU频率上不去的诡异问题遇到频率上不去的情况先别赖硬件。最常被我复盘的一个原因是操作系统里的cpufreq驱动和硬件PPU的交互异常。由于调频决策在多个层次叠加一旦C状态转换逻辑没有被正确触发系统就可能卡在某个中间频率档位。排查路径分享给你第一步检查scaling_cur_freq如果频率长期恒定不变执行一遍stress-ng压测观察频率是否跟随负载变化。如果压测时频率弹不上去查看dmesg有没有关于AVS自适应电压调节或DVFS的告警。大部分时候问题出在温度和功耗表设置上——芯片的固件版本和内核的能耗表不匹配导致调频决策过于保守。更新固件或者加一条内核启动参数问题就消失了。6.2 NUMA访问延迟的坑鲲鹏平台是典型的多NUMA架构跨NUMA访问内存的延迟比同NUMA高出一大截。这个大家都知道但实际部署中掉进坑里的情况依然很多。最常见的原因是容器平台或虚拟化层默认没有感知NUMA拓扑导致内存分配跨节点了大量进行。检查方法很简单用numactl --hardware查看节点布局再看进程的内存分配情况。解决手段也很直接在容器编排或虚拟机配置里显式指定node亲和性。我见过一个性能问题案例某容器负载全跑在NUMA node 0上但内存却大量落在node 1导致每次访存都要跨节点跳一次性能下降了18%功耗还高了6%。调整后性能立刻恢复正常这个案例充分说明NUMA拓扑感知在调优中的重要性。6.3 功耗采样的准确性问题如果你用命令行工具读到的功耗数据和整机功率表对不上多半不是设备坏了而是采样频率和计算口径的问题。有些工具读取的是瞬时功率有些是滑动平均值差异很容易误导判断。建议的采样方法是使用整机功率计做基准从操作系统内部读取的能耗模型数据做对比分析两端数据一起记录。这里还可以用一个小技巧在整机功耗稳定运行一段时间后记录功耗值P1随后关闭全部核心的网卡中断合并并立即采样得到P2。P1减P2的差值基本就是网络处理开销这个数据非常有用——很多靠CPU软中断硬扛网络流量的节点这个差值能占到整机功耗的15%以上那就值得考虑硬件卸载方案了。我在实际项目中一直保持一个习惯每轮优化做完必须同时记录性能和功耗两个维度的数据性能没变但功耗降了是优化性能降了功耗也降了则要做成本核算。这个习惯帮我筛掉不少看似优化实则无效的改动方案。结语与一点个人体会折腾了这么久我最深的体会是鲲鹏的低功耗优势不是白来的它建立在指令集精简、微架构功耗管理、硬件加速引擎和软件栈协同这一整套完整的体系之上。单纯堆核数换性能的旧思路在能耗比这个维度上已经走到尽头了。如果你正准备在自己的机房或者项目中引入鲲鹏平台我建议的路径是先从编译优化和调频策略这两步开始投入产出比最高接着处理NUMA和绑核问题把应用的访存局部性调好最后才是硬件卸载和混部调度这类进阶玩法。过程中一定记得做前后对比拿数据说话别拍脑袋。最后再分享一个小技巧鲲鹏服务器的管理接口里通常开放了比较完整的功耗遥测数据可以把它们接入现有的监控系统做成功耗和业务的关联曲线。有一次我通过这个曲线发现某个业务的CPU负载和功耗曲线出现明显背离顺藤摸瓜定位到一个算法退化导致的死循环省了一次不小的线上事故。功耗数据不只是账本用好了就是运维的眼睛。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑