分析

linux 机器报了以下 kernel 提示:

  1. [6669164.138262] rcu: INFO: rcu_sched self-detected stall on CPU
  2. [6669164.138262] rcu: 3-...!: (1 GPs behind) idle=41e/1/0x4000000000000002 softirq=227012737/227012738 fqs=0
  3. [6669164.138262] rcu: (t=7030 jiffies g=458660025 q=8)
  4. [6669164.138262] rcu: rcu_sched kthread starved for 7030 jiffies! g458660025 f0x0 RCU_GP_WAIT_FQS(5) ->state=0x0 ->cpu=2
  5. [6669164.138262] rcu: RCU grace-period kthread stack dump:
  6. [6669164.138262] rcu_sched R running task 0 10 2 0x80000000
  7. [6669164.138262] Call Trace:
  8. [6669164.138262] __schedule+0x29f/0x840
  9. [6669164.138262] schedule+0x28/0x80
  10. [6669164.138262] schedule_timeout+0x16b/0x3b0
  11. [6669164.138262] ? __next_timer_interrupt+0xc0/0xc0
  12. [6669164.138262] rcu_gp_kthread+0x40d/0x850
  13. [6669164.138262] ? call_rcu_sched+0x20/0x20
  14. [6669164.138262] kthread+0x112/0x130
  15. ...

通常三种情况会出现 rcu_bh 相关的提示, 分别为:

  1. 1. CPU 循环处理中禁止了中断;
  2. 2. CPU 循环处理中禁止了抢占, 并且启用了 ksoftirqd;
  3. 3. CPU 循环处理中禁止了下半部;

这几个条件都是和中断或内核抢占相关的, 由此看来应用程序不是引起该警告的原因, 更像是系统层面的.
再来看上面的报错:

  1. rcu: INFO: rcu_sched self-detected stall on CPU

可以译为检测到 cpu 上存在 rcu_bh 处理延迟或超时
从上述的简单分析来看, 该消息只是提示信息, 不会是用户空间的程序来引起, 不过也需要多观察该 kernel 提示是否频繁出现. 可以尝试通过升级内核来解决该问题.

解决

加入backports

  1. deb https://mirrors.ustc.edu.cn/debian/ buster-backports main contrib non-free

更新系统

  1. apt update && apt dist-upgrade

安装新版内核,也就是 apt 源官方支持的内核版本,不是编译安装最新版内核,所以我们得先使用 apt search 查看当前支持的最新内核版本

  1. apt search linux-image

接下来执行

  1. apt install -t buster-backports linux-image-$(dpkg --print-architecture) linux-headers-$(dpkg --print-architecture) --install-recommends -y

接下来更新配置并重启

  1. update-grub
  2. reboot

参考