22、系统层省电实践:内核优化、驱动优化、调度策略、热管理
各位同学,今天我们来聊聊系统层省电。说白了,就是深入到Linux内核和驱动层面,看看怎么把每一毫安时的电都用在刀刃上。
我刚开始做Android系统优化时,总觉得应用层搞好了就万事大吉。后来发现,真正决定续航底线的,其实是内核和驱动。你想想看,一个糟糕的驱动,能让整机功耗翻倍。一个合理的调度策略,能让手机多撑两小时。
内核优化:从源头省电
内核是操作系统的核心,也是功耗管理的总指挥部。我个人习惯,拿到一个新平台,先看内核的电源管理配置。
关键配置项:
- CPU Idle 状态管理:C0(运行)、C1(暂停)、C2(深度睡眠)。我见过不少项目,C2状态没调好,导致CPU频繁唤醒,功耗直接飙升。
- CPU Freq 调频策略:ondemand、conservative、schedutil。我个人推荐schedutil,它基于调度器负载反馈,响应快且省电。
- Timer 合并:把多个定时器合并成一次唤醒,减少CPU从睡眠中醒来的次数。
核心思路:让CPU尽可能多地待在深度睡眠状态,减少不必要的唤醒。
我曾经在一个项目中,发现手机待机功耗异常高。排查了三天,最后发现是内核的timer tick没配置好,每秒唤醒CPU 1000次。改成动态tick后,待机功耗降了40%。
驱动优化:管好每个外设
驱动是直接跟硬件打交道的。一个写得不讲究的驱动,能让电池哭出声。
驱动省电要点:
- Runtime PM:设备不用时,自动进入低功耗模式。比如触摸屏,5秒没触摸,就该睡了。
- DMA 传输优化:用DMA代替CPU搬运数据,省电又高效。
- 中断合并:把多个小中断合并成一个大中断,减少CPU被频繁打断。
我的经验:写驱动时,一定要考虑“设备空闲时该干什么”。很多驱动工程师只关心功能,不关心功耗。结果就是,设备明明没在用,还在全速跑。
嗯,这里要注意。驱动优化不是一刀切。比如Wi-Fi驱动,如果频繁进入睡眠再唤醒,反而更耗电。需要根据实际场景,找到平衡点。
调度策略:谁该用电,谁该歇着
调度器决定了CPU时间片怎么分。好的调度策略,能让高优先级任务快速完成,然后让CPU赶紧睡觉。
调度器相关:
- CFS(完全公平调度):默认调度器,适合普通场景。
- EAS(能耗感知调度):这是重点。EAS会根据任务的负载和CPU的能耗模型,把任务调度到最省电的CPU核心上。
- CPU 绑核:把后台任务绑到小核上,前台任务用大核。我习惯用cpuset来实现。
避坑指南:我曾经把一个大核绑了太多后台任务,结果大核一直满载,小核闲着。功耗反而更高。绑核要讲究,别瞎绑。
你想想看,一个视频解码任务,如果调度到小核上,解码慢,功耗反而高。调度到大核上,快速解码完,然后CPU睡觉,总功耗更低。这就是EAS的核心理念。
热管理:别让手机发烧
热管理不只是为了手感,更是为了省电。温度高了,漏电流增大,功耗会指数级上升。
热管理策略:
- 温控阈值:设置多级温度阈值,比如45°C降频,50°C限制充电电流,55°C强制关机。
- 动态调频调压(DVFS):温度升高时,主动降低CPU/GPU频率和电压。
- 热节流(Thermal Throttling):当温度超过阈值,直接限制最大频率。
| 温度区间 | 策略 | 效果 |
|---|---|---|
| 35°C - 40°C | 正常调度 | 性能优先 |
| 40°C - 45°C | 轻度降频 | 平衡功耗与性能 |
| 45°C - 50°C | 中度降频 + 限制充电 | 优先降温 |
| 50°C 以上 | 强制降频 + 关机预警 | 保护硬件 |
我在项目中遇到过,手机打游戏发热后,温控策略太激进,直接锁频到最低。结果游戏卡成PPT,用户骂翻天。后来我们改成了渐进式降频,每降一档,观察温度变化,再决定是否继续降。效果好了很多。
系统层省电知识体系
下面这张图,是我梳理的系统层省电核心逻辑。你可以把它当作一个检查清单。
说白了,系统层省电没有银弹。你得从内核、驱动、调度、热管理四个维度,逐个排查,逐个优化。我做了这么多年,最大的体会就是:省电是个系统工程,别指望一个配置就能搞定一切。
我的建议:先从功耗测量开始。没有数据,一切优化都是瞎搞。用Power Monitor或者板级功耗测量工具,先摸清底数,再动手优化。
好了,这一章的内容就到这里。记住,省电不是让手机变慢,而是让手机在合适的时间,用合适的功耗,干合适的事。