高通嵌入式 Linux 开发实战(8): 性能调优:cgroup、CPU 调频、内存回收策略与长时间高负载稳定性优化

发布时间:2026/7/30 4:59:00
高通嵌入式 Linux 开发实战(8): 性能调优:cgroup、CPU 调频、内存回收策略与长时间高负载稳定性优化 系列第 8 篇| 适用平台QRB5165 / Qualcomm IQ-9075 / IQ-9100关键词cgroup v2、schedtune、CPU DVFS、thermal throttling、内存回收、ZRAM、工业长稳测试1. 为什么嵌入式场景需要专门的性能调优在工业机器人、智能相机等 7×24 高负载场景下高通骁龙/IQ 系列嵌入式平台面临的挑战与手机截然不同维度手机场景工业嵌入式场景运行时长间歇使用频繁休眠7×24 不间断无人值守热设计被动散热 降频主动散热但环境温度可能 60°C实时性容忍卡顿机械臂控制要求 5ms 抖动内存压力可杀后台 App所有进程均为关键进程功耗约束省电优先性能优先功耗次之本文以IQ-9100平台为例Kryo 585 八核、16GB LPDDR5、Adreno 660 GPU、Hexagon DSP讲解从 cgroup 资源隔离、CPU 调频策略、内存回收优化到长时间高负载稳定性验证的完整调优链路。2. 系统性能调优总体架构该架构图展示了高通嵌入式 Linux 性能调优的分层视图应用层ROS2 节点、NPU 推理、视觉管线、运动控制框架层cgroup v2 资源隔离、调度策略SCHED_FIFO / SCHED_DEADLINE内核层cpufreq governor、thermal framework、内存回收kswapd / direct reclaim / ZRAM硬件层Kryo CPU 集群、Adreno GPU、Hexagon DSP、LPDDR5 控制器3. cgroup v2 资源隔离3.1 为什么选择 cgroup v2高通 QRB/IQ 系列 BSP 从 kernel 5.10 开始默认启用 cgroup v2 统一层级。相比 v1 的多层级挂载v2 提供单一层级树避免 CPU / memory / io 控制器冲突Pressure Stall InformationPSI精确感知资源瓶颈线程粒度控制threaded子树支持对线程级调度3.2 内核配置确认# 确认 cgroup v2 挂载mount|grepcgroup2# 输出: cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)# 如果 BSP 默认 v1, 启动参数添加:# BOARD_KERNEL_CMDLINE systemd.unified_cgroup_hierarchy13.3 工业场景的 cgroup 分组策略# 创建层级结构mkdir-p/sys/fs/cgroup/realtime# 实时控制进程mkdir-p/sys/fs/cgroup/inference# NPU/GPU 推理进程mkdir-p/sys/fs/cgroup/vision# 相机采集管线mkdir-p/sys/fs/cgroup/system# 系统服务# 启用控制器echocpu memory io/sys/fs/cgroup/cgroup.subtree_control# 实时控制组保证 CPU 带宽echo50000 100000/sys/fs/cgroup/realtime/cpu.max# 50% 带宽保证echomax/sys/fs/cgroup/realtime/cpu.max# 实际不限制上限echo200/sys/fs/cgroup/realtime/cpu.weight# 竞争时优先级最高# 推理组大核绑定echo4-7/sys/fs/cgroup/inference/cpuset.cpus# 绑定到大核echo0/sys/fs/cgroup/inference/cpuset.mems# 视觉管线组echo2-5/sys/fs/cgroup/vision/cpuset.cpusecho4096M/sys/fs/cgroup/vision/memory.max# 内存上限 4GBecho3584M/sys/fs/cgroup/vision/memory.high# 软限制触发回收# 系统服务组限制资源避免抢占echo0-1/sys/fs/cgroup/system/cpuset.cpusecho10/sys/fs/cgroup/system/cpu.weight# 最低优先级echo1024M/sys/fs/cgroup/system/memory.max3.4 PSI 监控脚本#!/bin/bash# monitor_psi.sh - 监控资源压力触发告警THRESHOLD_CPU25# CPU 压力 25% 告警THRESHOLD_MEM10# 内存压力 10% 告警whiletrue;docpu_some$(awk-F/some/{print $2}/sys/fs/cgroup/inference/cpu.pressure|cut-d -f1)mem_some$(awk-F/some/{print $2}/sys/fs/cgroup/inference/memory.pressure|cut-d -f1)if(($(echo $cpu_some$THRESHOLD_CPU|bc-l)));thenlogger-tperf-monitorWARNING: inference group CPU pressure${cpu_some}%fiif(($(echo $mem_some$THRESHOLD_MEM|bc-l)));thenlogger-tperf-monitorWARNING: inference group MEM pressure${mem_some}%fisleep5done4. CPU 调频策略DVFS4.1 高通 Kryo 集群架构IQ-9100 采用 134 三集群架构集群核心频率范围用途建议PrimeCPU71.0–2.84 GHzNPU 推理后处理GoldCPU4–61.0–2.42 GHz视觉管线、ROS 节点SilverCPU0–30.3–1.8 GHz系统服务、日志4.2 Governor 选择# 查看可用 governorcat/sys/devices/system/cpu/cpu4/cpufreq/scaling_available_governors# conservative ondemand userspace powersave performance schedutil# 工业场景推荐schedutil内核调度器感知echoschedutil/sys/devices/system/cpu/cpufreq/policy4/scaling_governor# 设置最低频率兜底避免突发负载响应慢echo1200000/sys/devices/system/cpu/cpufreq/policy4/scaling_min_freq# 对实时控制核心锁频 performanceechoperformance/sys/devices/system/cpu/cpufreq/policy7/scaling_governor4.3 schedutil 调参# 大核集群调参echo500/sys/devices/system/cpu/cpufreq/policy4/schedutil/up_rate_limit_usecho2000/sys/devices/system/cpu/cpufreq/policy4/schedutil/down_rate_limit_usup_rate_limit_us 500500μs 内允许升频快速响应突发负载down_rate_limit_us 20002ms 延迟降频避免频繁切换导致流水线 stall4.4 Thermal 管理与工业散热联动# 查看 thermal zonecat/sys/class/thermal/thermal_zone0/type# cpu-0-0-usrcat/sys/class/thermal/thermal_zone0/temp# 45000 (45°C)# 自定义 thermal 策略提高降频阈值工业场景有强制散热# 修改设备树# thermal_zones {# cpu-thermal {# trips {# cpu_throttle: trip0 {# temperature 95000; /* 从 85°C 提高到 95°C */# hysteresis 5000;# type passive;# };# cpu_emergency: trip1 {# temperature 110000; /* 紧急关机温度 */# type critical;# };# };# };# };5. 内存回收策略优化5.1 嵌入式内存压力分析16GB LPDDR5 看似充裕但工业视觉系统的典型内存分布组件内存占用NPU 模型加载4 个模型3.2 GB相机 ISP 缓冲4K×4 路2.8 GBROS2 话题缓冲1.5 GBGPU 渲染缓冲1.2 GB系统 内核2.0 GB安全余量5.3 GB当多路推理并发时安全余量可能被瞬间吃满触发 direct reclaim 导致延迟尖刺。5.2 ZRAM 配置# 启用 ZRAM 作为压缩交换避免 eMMC/UFS 写入磨损modprobe zramnum_devices1echolz4/sys/block/zram0/comp_algorithm# lz4 压缩速度快echo4G/sys/block/zram0/disksize# 4GB 压缩空间 ≈ 实际 8GBmkswap/dev/zram0swapon-p100/dev/zram0# 调整 swappiness工业场景降低优先保留代码页echo30/proc/sys/vm/swappiness5.3 内存回收调优参数# 提前触发 kswapd避免 direct reclaimecho65536/proc/sys/vm/min_free_kbytes# 64MB 最低空闲echo1000/proc/sys/vm/watermark_boost_factor# 水位线提升系数echo150/proc/sys/vm/watermark_scale_factor# 水位线拉开间距# 降低脏页回写延迟echo500/proc/sys/vm/dirty_expire_centisecs# 5s 过期echo200/proc/sys/vm/dirty_writeback_centisecs# 2s 回写周期echo5/proc/sys/vm/dirty_ratio# 脏页上限 5%echo2/proc/sys/vm/dirty_background_ratio# 后台回写阈值 2%# 紧凑内存碎片减少大页分配失败echo1/proc/sys/vm/compact_memory# 立即整理echo20/proc/sys/vm/extfrag_threshold# 碎片阈值5.4 CMA 预留配置# 设备树中预留连续物理内存给 NPU/ISP DMA# reserved-memory {# npu_mem: npuA0000000 {# compatible shared-dma-pool;# reg 0x0 0xA0000000 0x0 0x20000000; /* 512MB 2.5GB */# no-map;# };# isp_mem: ispC0000000 {# compatible shared-dma-pool;# reg 0x0 0xC0000000 0x0 0x10000000; /* 256MB 3GB */# no-map;# };# };6. CPU 调度与实时性优化6.1 PREEMPT_RT 补丁# 内核配置CONFIG_PREEMPT_RTyCONFIG_HZ_1000yCONFIG_NO_HZ_FULLyCONFIG_RCU_NOCB_CPUy# 启动参数隔离实时核心BOARD_KERNEL_CMDLINEisolcpus6,7 nohz_full6,7 rcu_nocbs6,76.2 实时进程调度配置# 运动控制进程SCHED_FIFO 最高优先级chrt-f99/usr/bin/motion_control# 或使用 SCHED_DEADLINE更精确的带宽保证# 周期 1ms, 运行时间 200μs, 截止时间 800μschrt-d--sched-runtime200000--sched-deadline800000--sched-period10000000\/usr/bin/motion_control# IRQ 亲和性将关键中断绑定到实时核心echo7/proc/irq/$(cat/proc/interrupts|grepcan0|awk{print $1}|tr-d:)/smp_affinity_list7. 长时间高负载稳定性验证7.1 稳定性测试矩阵该架构图展示了长稳测试框架的组成压力注入层CPU stress、内存 mmap flood、IO fio、网络 iperf业务仿真层NPU 持续推理、相机多路采集、ROS 话题高频发布监控采集层thermal、PSI、slab、vmstat、ftrace判定与告警层延迟超标、OOM、thermal throttle、watchdog reset7.2 综合压力测试脚本#!/bin/bash# stress_test_72h.sh - 72 小时综合长稳测试LOG_DIR/data/stress_logs/$(date%Y%m%d_%H%M%S)mkdir-p$LOG_DIRDURATION259200# 72h in seconds# 1. CPU 混合负载大小核分别加压stress-ng--cpu4--cpu-method matrixprod--taskset0-3--timeout${DURATION}sstress-ng--cpu4--cpu-method fft--taskset4-7--timeout${DURATION}s# 2. 内存压力循环分配/释放模拟 NPU 模型切换stress-ng--vm2--vm-bytes 2G --vm-method flip--timeout${DURATION}s# 3. IO 压力模拟日志写入和模型加载fio--nameseqwrite--rwwrite--bs256k--size2G--numjobs2\--directory/data/fio_test--runtime${DURATION}--time_based# 4. 监控采集vmstat5$LOG_DIR/vmstat.logsar-u-r-d5$LOG_DIR/sar.logwhiletrue;docat/sys/class/thermal/thermal_zone*/temp$LOG_DIR/thermal.logcat/proc/pressure/cpu$LOG_DIR/psi_cpu.logcat/proc/pressure/memory$LOG_DIR/psi_mem.logecho---$(date)---$LOG_DIR/thermal.logsleep10done# 5. 看门狗检测进程存活whiletrue;doforprocinmotion_control npu_inference camera_pipeline;doif!pgrep-x$proc/dev/null;thenlogger-tstress-testCRITICAL:$procdied at$(date)echo$procDIED$(date)$LOG_DIR/failures.logfidonesleep2doneechoStress test started. Duration: 72h. Logs:$LOG_DIRwait7.3 关键指标判定标准指标通过标准测量方法控制环路延迟P99 5mscyclictest ftrace推理帧率抖动标准差 2fpsNPU profiler内存泄漏72h 增长 50MBsmaps 周期性采样Thermal throttle次数 10/72hthermal_zone 事件统计OOM kill0 次dmesg 过滤系统重启0 次uptime 校验8. 性能调优工作流程以下 流程图展示了完整的性能调优迭代流程9. 配置固化与生产部署9.1 init.rc 集成# /vendor/etc/init/perf_tuning.rc on boot # cgroup 设置 mkdir /sys/fs/cgroup/realtime 0755 system system mkdir /sys/fs/cgroup/inference 0755 system system write /sys/fs/cgroup/cgroup.subtree_control cpu memory io cpuset write /sys/fs/cgroup/realtime/cpu.weight 200 write /sys/fs/cgroup/inference/cpuset.cpus 4-7 # CPU 调频 write /sys/devices/system/cpu/cpufreq/policy4/scaling_governor schedutil write /sys/devices/system/cpu/cpufreq/policy4/scaling_min_freq 1200000 write /sys/devices/system/cpu/cpufreq/policy7/scaling_governor performance # 内存调优 write /proc/sys/vm/swappiness 30 write /proc/sys/vm/min_free_kbytes 65536 write /proc/sys/vm/watermark_scale_factor 150 write /proc/sys/vm/dirty_ratio 5 write /proc/sys/vm/dirty_background_ratio 2 on property:sys.boot_completed1 # ZRAM 启用 write /sys/block/zram0/comp_algorithm lz4 write /sys/block/zram0/disksize 4294967296 exec -- /system/bin/mkswap /dev/zram0 swapon /dev/zram09.2 sysctl.conf 持久化# /etc/sysctl.d/90-industrial-perf.confvm.swappiness30vm.min_free_kbytes65536vm.watermark_scale_factor150vm.watermark_boost_factor1000vm.dirty_ratio5vm.dirty_background_ratio2vm.dirty_expire_centisecs500vm.dirty_writeback_centisecs200kernel.sched_rt_runtime_us980000kernel.hung_task_timeout_secs12010. 调优效果对比以下是 IQ-9100 平台上某工业视觉项目调优前后的对比数据指标调优前调优后提升NPU 推理延迟 P9928ms18ms↓ 35.7%控制环路 P998.2ms2.1ms↓ 74.4%内存碎片率12.3%3.1%↓ 74.8%72h Thermal throttle47 次3 次↓ 93.6%72h OOM kill2 次0 次100% 消除系统 uptime68h (重启)72h通过11. 常见陷阱与排查11.1 频率锁死问题# 现象CPU 频率始终最低不响应负载# 排查cat/sys/devices/system/cpu/cpu4/cpufreq/scaling_cur_freqcat/sys/class/thermal/thermal_zone*/temp# 根因thermal zone 配置过低持续触发被动降频# 修复提高 trip point 或改善散热11.2 cgroup OOM 误杀# 现象关键进程被 cgroup OOM killer 杀死# 排查dmesg|grep-imemory cgroup out of memorycat/sys/fs/cgroup/inference/memory.events# 修复调整 memory.high 为软限制memory.max 留足余量echomax/sys/fs/cgroup/inference/memory.maxecho8G/sys/fs/cgroup/inference/memory.high11.3 RT 进程饿死其他进程# 现象RT 进程占满 CPU系统服务无响应# 防护限制 RT 带宽echo950000/proc/sys/kernel/sched_rt_runtime_us# RT 进程最多占 95% CPUecho1000000/proc/sys/kernel/sched_rt_period_us12. 总结高通嵌入式 Linux 性能调优是一个系统工程核心思路隔离用 cgroup v2 将实时控制、推理、视觉、系统服务严格隔离保障对关键路径锁频、锁核、SCHED_DEADLINE 带宽保证防御ZRAM 避免 IO 抖动水位线提前回收避免 direct reclaim验证72h 长稳测试覆盖温度、内存、CPU 的极端组合