RK平台性能测试中的CPU与DDR定频实战
1. 为什么需要CPU与DDR定频在RK平台进行性能测试时CPU和DDR的频率波动会直接影响测试结果的可比性。想象一下你正在测试一个程序的运行时间如果CPU频率忽高忽低每次测试的结果就会有很大差异这样的数据还有什么参考价值定频的核心目的有三个结果可复现确保每次测试都在相同的硬件状态下运行性能评估准确排除频率波动对测试数据的干扰极限压力测试通过固定最高频率测试系统稳定性我遇到过不少开发者抱怨为什么同样的代码昨天跑分1000今天只有800 90%的情况都是因为没做定频系统自动调频导致的差异。2. CPU定频实战操作2.1 指令定频法推荐临时测试这是最快捷的定频方式适合快速验证场景。以RK3399为例它采用big.LITTLE架构包含A72大核和A53小核需要分别设置# 先关闭温控风险提示可能造成过热损坏 echo user_space /sys/class/thermal/thermal_zone0/policy # A53小核设置cpu0-cpu3 echo userspace /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies echo 1416000 /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed # A72大核设置cpu4-cpu5 echo userspace /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor cat /sys/devices/system/cpu/cpu4/cpufreq/scaling_available_frequencies echo 1800000 /sys/devices/system/cpu/cpu4/cpufreq/scaling_setspeed注意事项不同RK芯片支持的频率不同务必先查看scaling_available_frequencies关闭温控后CPU可能过热降频甚至烧毁建议加装散热片重启后设置会失效适合临时测试2.2 代码定频法适合产品固件对于需要长期定频的产品修改DTS是更彻底的方案。以RK3399 Android10为例找到内核源码中的rk3399-opp.dtsi文件修改cluster0_oppA53和cluster1_oppA72节点删除其他频率点只保留目标频率cluster0_opp: opp-table0 { compatible operating-points-v2; opp-shared; opp-1416000000 { opp-hz /bits/ 64 1416000000; opp-microvolt 1125000; }; // 删除其他opp节点 }; cluster1_opp: opp-table1 { compatible operating-points-v2; opp-shared; opp-1800000000 { opp-hz /bits/ 64 1800000000; opp-microvolt 1200000; }; // 删除其他opp节点 };优势定频效果永久生效无需每次手动设置可精确控制电压风险需要重新编译内核电压设置不当可能导致不稳定3. DDR定频实战操作3.1 指令定频法RK平台从kernel 4.4开始使用dmc管理DDR频率# 切换为userspace模式 echo userspace /sys/devices/platform/dmc/devfreq/dmc/governor # 查看可用频率 cat /sys/devices/platform/dmc/devfreq/dmc/available_frequencies # 设置目标频率如800MHz echo 800000000 /sys/devices/platform/dmc/devfreq/dmc/userspace/set_freq # 验证当前频率 cat /sys/devices/platform/dmc/devfreq/dmc/cur_freq3.2 代码定频法同样通过修改DTS实现永久定频找到rk3399-opp.dtsi中的dmc_opp_table节点只保留目标频率点dmc_opp_table: opp-table3 { compatible operating-points-v2; opp-800000000 { opp-hz /bits/ 64 800000000; opp-microvolt 900000; }; // 删除其他opp节点 };特殊场景处理低功耗设备可设置多级频率通过脚本动态切换高温环境建议降低频率保证稳定性4. 性能测试中的注意事项4.1 温度监控必须做即使不关闭温控定频后CPU温度也会明显升高。建议测试时实时监控# 实时查看温度单位毫摄氏度 watch -n 1 cat /sys/class/thermal/thermal_zone*/temp # 查看温度历史曲线需要安装工具 sudo apt install lm-sensors sensors4.2 测试脚本示例一个完整的性能测试应该包含定频设置温度监控压力测试结果记录#!/bin/bash # 1. 定频 echo performance /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo 1800000 /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed # 2. 启动温度监控 temp_log$(mktemp) (while true; do cat /sys/class/thermal/thermal_zone*/temp | paste -sd , $temp_log sleep 1 done) # 3. 运行测试 echo 开始性能测试... stress-ng --cpu 4 --timeout 60s # 4. 清理 kill %1 # 结束温度监控 mv $temp_log ./temperature.csv4.3 常见问题排查Q设置频率后立即恢复默认值A检查温控策略可能是温度保护触发降频QDDR频率设置不生效A确认内核版本≥4.4旧版本可能需要直接操作寄存器Q系统变得不稳定A逐步提高电压每次25mV直到稳定为止5. 不同RK平台的差异5.1 RK3588新增特性作为新一代旗舰芯片RK3588在频率管理上有改进新增cpufreq-cooling温控接口支持更细粒度的DDR频率调节提供专用性能监控寄存器定频示例# 小核集群A55 echo userspace /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo 1800000 /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed # 大核集群A76 echo userspace /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor echo 2400000 /sys/devices/system/cpu/cpu4/cpufreq/scaling_setspeed # DDR定频 echo userspace /sys/class/devfreq/dmc/governor echo 1560000000 /sys/class/devfreq/dmc/userspace/set_freq5.2 低端平台注意事项RK3328/RK3128等低端芯片需要注意DDR频率选项较少不支持独立CPU集群控制电压调节范围小建议测试步骤先用最低频率确保功能正常逐步提高频率观察稳定性记录每个频率下的功耗和温度6. 自动化测试方案对于需要批量测试的场景可以搭建自动化测试框架环境准备import paramiko ssh paramiko.SSHClient() ssh.connect(192.168.1.100, usernameroot, passwordpassword)频率设置函数def set_cpu_freq(ssh, core, freq): stdin, stdout, stderr ssh.exec_command( fecho userspace /sys/devices/system/cpu/cpu{core}/cpufreq/scaling_governor\n fecho {freq} /sys/devices/system/cpu/cpu{core}/cpufreq/scaling_setspeed) if stderr.read(): raise RuntimeError(设置频率失败)结果收集def collect_results(ssh): stdin, stdout, stderr ssh.exec_command( cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq\n cat /sys/class/devfreq/dmc/cur_freq) return stdout.read().decode()测试用例示例test_cases [ {cpu_freq: 1416000, ddr_freq: 800000000}, {cpu_freq: 1800000, ddr_freq: 928000000} ] for case in test_cases: set_cpu_freq(ssh, 0, case[cpu_freq]) set_ddr_freq(ssh, case[ddr_freq]) run_benchmark(ssh) results collect_results(ssh) save_to_database(case, results)7. 性能优化技巧在完成基础定频后还可以通过以下方式提升性能CPU亲和性设置taskset -c 4-7 stress-ng --cpu 4 # 将任务绑定到大核中断负载均衡# 查看中断分布 cat /proc/interrupts | grep eth0 # 将网卡中断分配到特定CPU echo 8 /proc/irq/123/smp_affinity # 0x8表示CPU3内存延迟优化# 禁用透明大页 echo never /sys/kernel/mm/transparent_hugepage/enabled # 调整vm.swappiness echo 10 /proc/sys/vm/swappinessIO调度器选择# 对NVMe SSD使用none调度器 echo none /sys/block/nvme0n1/queue/scheduler # 对eMMC使用deadline echo deadline /sys/block/mmcblk0/queue/scheduler在实际项目中我通常会先用定频确保测试环境一致再结合这些优化手段挖掘硬件潜力。特别是在做AI推理性能优化时DDR定频中断绑定的组合可以提升10%-15%的吞吐量。