市中心的道格·布朗☞ 为什么我的 CPU 使用率总是 100%?(升级我的 Chumby 8 内核第 9 部分)

作者记录了将旧的基于 PXA166 的 Chumby 8 的 2.6.28 Linux 内核升级到现代 6.x 版本的过程,在升级过程中发现 top 显示 CPU 使用率总是 100%,经过一系列排查和研究,最终找到问题根源并解决。

  • 问题发现:升级内核后 top 显示 CPU 使用率异常,100% usr 或 50% usr/50% sys 等,2.6.28 内核无此问题,怀疑是驱动或 CPU 空闲支持等问题。
  • 排查过程

    • 尝试启动旧的 3.13 内核,发现有相同问题,排除近期内核更新导致的问题。
    • 启用 CONFIG_PROFILING 对现代内核进行 profiling,发现 default_idle_call 占用大部分时间,怀疑不是随机外围驱动的问题。
    • 追踪 default_idle_call 函数,发现新内核与 2.6.28 内核在等待中断处理上有差异,修改现代内核的函数但未解决问题。
    • 研究 top 的工作原理,发现其信息来自 procfs,重点研究 /proc/stat 文件,通过实验验证 top 计算 CPU 负载的方式。
    • 在现代 Chumby 内核中进行实验,发现 idle 计数增加异常,与 2.6.28 内核对比,确定新内核未正确增加 idle 计数。
    • 发现 OLPC 内核的相关提交,了解到 CONFIG_NO_HZ 相关问题,通过设置 CONFIG_HZ_PERIODIC=y 或 nohz=off 临时解决问题。
    • 追踪 /proc/stat 的代码,找到获取 idle 时间的函数,最终定位到硬件定时器相关代码,发现内核读取定时器值时存在时序问题。
    • 对比 Chumby 的 2.6.28 内核和其他 Marvell 供应商内核的 timer_read 函数,确定问题所在,并提交修复补丁,最终被合并到 Linux 6.2 及后续版本。
  • 总结:通过对 BusyBox、/proc 和多层内核代码的研究,找到读取 PXA168 定时器计数寄存器代码中的小问题并修复,解决了 CPU 使用率总是显示 100%的问题,也让作者对 Linux 内核内部有了更深入的了解。下一篇将介绍如何让实时时钟工作。
阅读 133
0 条评论