闲置树莓派3B系统中kworker进程高CPU占用问题求助
解决Raspberry Pi扩展板导致kworker高CPU负载的问题
首先可以确定,你遇到的8-13.5%的kworker负载确实属于不必要的额外开销——毕竟加装扩展板前没有这个问题,而且已经影响到了Kodi的播放体验。结合你用perf排查到的__timer_delay、arch_timer相关函数高占用,大概率和扩展板的RTC模块有关,下面给你一步步的排查和解决方法:
1. 验证RTC驱动是否是罪魁祸首
这是最直接的验证步骤,因为你的perf结果指向了定时器相关的内核路径:
- 先查看系统加载的RTC驱动模块:
通常这类扩展板用的是lsmod | grep rtcrtc_ds1307或者类似的模块,记下模块名称。 - 临时卸载该模块,观察CPU负载变化:
卸载后用sudo rmmod <你的RTC模块名称>top或者htop看kworker的CPU占用,如果明显下降,就坐实了是RTC驱动的问题。
2. 禁用RTC模块的开机加载
如果卸载模块后问题解决,你可以永久禁用该模块:
- 编辑黑名单配置文件:
sudo nano /etc/modprobe.d/blacklist.conf - 在文件末尾添加一行:
blacklist <你的RTC模块名称> - 保存退出后重启系统,确认模块不再加载,负载保持正常。
如果你的扩展板是通过设备树overlay加载RTC的,还需要修改/boot/config.txt,注释掉对应的overlay条目(比如dtoverlay=i2c-rtc,ds1307)。
3. 调整内核定时器参数(辅助优化)
即使解决了RTC的问题,你也可以调整内核定时器的松弛参数,减少不必要的定时器触发:
- 临时设置全局定时器松弛值:
默认值通常是50000纳秒,调大到1毫秒可以降低高频定时器的触发频率,减少kworker的工作压力。echo 1000000 | sudo tee /proc/sys/kernel/timer_slack_ns - 如果临时设置有效,把这个参数永久写入配置:
echo "kernel.timer_slack_ns = 1000000" | sudo tee /etc/sysctl.d/99-timer-slack.conf
4. 排查其他可能的原因(mSATA/电源控制)
虽然RTC嫌疑最大,但也可以排除下扩展板的其他模块:
- 检查mSATA磁盘的IO活动:
如果看到频繁的小IO(比如iostat -x 5%util持续很高但rMB/s/wMB/s很低),可能是磁盘的自动休眠或刷新机制导致kworker活跃,可以尝试禁用磁盘的高级电源管理:sudo hdparm -B 255 /dev/sda - 查看电源控制模块的驱动,用
lsmod找和电源相关的模块,临时卸载试试负载变化(注意不要卸载系统必需的模块)。
5. 升级内核版本
你当前用的是4.9.59-v7+,这个内核版本比较老旧(Stretch的默认内核),可能对新扩展板的支持不完善。可以尝试升级到Stretch可用的最新内核:
sudo apt update && sudo apt upgrade sudo rpi-update
注意:
rpi-update会安装测试版内核,操作前最好备份系统数据,避免意外问题。
内容的提问来源于stack exchange,提问作者Kasper Skytte Andersen
相关产品推荐
相关产品推荐

