You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

闲置树莓派3B系统中kworker进程高CPU占用问题求助

解决Raspberry Pi扩展板导致kworker高CPU负载的问题

首先可以确定,你遇到的8-13.5%的kworker负载确实属于不必要的额外开销——毕竟加装扩展板前没有这个问题,而且已经影响到了Kodi的播放体验。结合你用perf排查到的__timer_delay、arch_timer相关函数高占用,大概率和扩展板的RTC模块有关,下面给你一步步的排查和解决方法:

1. 验证RTC驱动是否是罪魁祸首

这是最直接的验证步骤,因为你的perf结果指向了定时器相关的内核路径:

  • 先查看系统加载的RTC驱动模块:
    lsmod | grep rtc
    
    通常这类扩展板用的是rtc_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的问题,你也可以调整内核定时器的松弛参数,减少不必要的定时器触发:

  • 临时设置全局定时器松弛值:
    echo 1000000 | sudo tee /proc/sys/kernel/timer_slack_ns
    
    默认值通常是50000纳秒,调大到1毫秒可以降低高频定时器的触发频率,减少kworker的工作压力。
  • 如果临时设置有效,把这个参数永久写入配置:
    echo "kernel.timer_slack_ns = 1000000" | sudo tee /etc/sysctl.d/99-timer-slack.conf
    

4. 排查其他可能的原因(mSATA/电源控制)

虽然RTC嫌疑最大,但也可以排除下扩展板的其他模块:

  • 检查mSATA磁盘的IO活动:
    iostat -x 5
    
    如果看到频繁的小IO(比如%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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:54:58