第3章 CPU性能调优:频率、调度与中断亲和性
各位好,我是老张。今天咱们聊聊嵌入式POS机里CPU调优的那些事。说实话,很多工程师觉得CPU调优就是改改频率,其实远没那么简单。我这些年踩过的坑,今天一次性讲清楚。
3.1 CPU频率与调度策略
先说说频率。CPU频率说白了就是芯片的"心跳"。频率越高,算得越快,但功耗也越大。POS机这种设备,既要响应快,又不能太费电,所以频率管理很关键。
我个人习惯用 cpufreq 框架来管理频率。Linux内核里提供了好几种调频策略:
| 策略名称 | 特点 | 适用场景 |
|---|---|---|
| performance | 固定最高频率 | 需要极致性能时 |
| powersave | 固定最低频率 | 省电模式 |
| ondemand | 按需调频 | 日常使用 |
| conservative | 缓慢调频 | 对功耗敏感的场景 |
| schedutil | 基于调度器调频 | 最新内核推荐 |
我在项目中遇到过一个问题:POS机在扫码支付时,CPU突然降频,导致扫码识别延迟。后来发现是温度过高触发了降频保护。嗯,这里要注意,频率调优不能只看性能,还得考虑散热。
核心建议:对于POS机这种交互设备,我推荐使用 schedutil 策略。它能根据当前任务负载动态调整频率,响应快又省电。
设置方法很简单:
# 查看当前策略
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 设置为schedutil
echo schedutil > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 如果想永久生效,可以写到/etc/rc.local里
3.2 中断亲和性设置
中断亲和性,说白了就是让哪个CPU核心来处理中断。你想想看,如果所有中断都挤在一个核上,其他核闲着,那多浪费?
我曾经犯过一个错误:把网卡中断和磁盘中断都绑在CPU0上。结果CPU0负载100%,其他核只有20%。POS机在打印小票时,网络响应变得特别慢。后来我把中断分散到不同核上,问题就解决了。
具体做法:
# 查看中断号
cat /proc/interrupts | grep eth0
# 假设网卡中断号是47,把它绑定到CPU1上
echo 2 > /proc/irq/47/smp_affinity
# 注意:这里的值是位掩码
# CPU0 = 1, CPU1 = 2, CPU2 = 4, CPU3 = 8
小技巧:我习惯把高频中断(比如网卡、定时器)分散到不同核上,低频中断(比如按键)可以集中处理。这样能避免某个核被频繁打断。
3.3 多核负载均衡
多核负载均衡,就是让所有CPU核心都忙起来,别有的累死有的闲死。Linux内核有自动负载均衡机制,但有时候它不够聪明。
我记得有一次,POS机在运行支付应用时,CPU0负载80%,CPU1只有10%。应用响应很慢。我查了一下,发现是应用进程被固定在了CPU0上。用 taskset 命令重新分配后,两个核都跑到50%左右,响应速度明显提升。
常用的工具:
top或htop:查看各核负载taskset:绑定进程到指定核cpuset:更精细的CPU分组管理
举个例子:
# 查看进程当前绑定的CPU
taskset -p 1234
# 把进程1234绑定到CPU0和CPU1
taskset -cp 0,1 1234
# 启动时直接绑定
taskset -c 0,1 ./my_app
注意:别把所有进程都绑死。有些系统进程需要灵活调度,绑死了反而影响性能。我一般只绑定关键业务进程。
3.4 动态调频技术
动态调频,就是让CPU根据负载自动调整频率。这玩意儿做好了,能省不少电。POS机一天到晚开着,省电就是省钱。
Linux内核里有个 cpufreq 子系统,配合 schedutil 调度器,效果不错。但要注意,调频是有延迟的。从低频升到高频,需要几十微秒。如果应用对延迟敏感,得提前把频率拉起来。
我做过一个优化:在POS机启动支付应用时,提前把CPU频率调到最高。等支付完成,再降回去。这样既保证了响应速度,又省了电。
# 手动设置频率
echo 1400000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
# 查看可用频率
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
实战经验:动态调频的触发阈值很关键。阈值设得太低,频率频繁跳动,反而增加功耗。我一般设成负载超过60%时升频,低于30%时降频。这个值可以根据实际业务调整。
最后说一句,CPU调优不是一锤子买卖。你得在实际场景中反复测试,找到最适合你POS机的配置。我每次调完参数,都会跑一遍压力测试,看看效果如何。
好了,这一章就聊到这儿。下一章咱们讲内存调优,那也是个容易踩坑的地方。