问题截图如下

查看系统

root@tsuat:~# uname -a

Linux tsuat 6.8.0-87-generic #88-Ubuntu SMP PREEMPT_DYNAMIC Sat Oct 11 09:28:41 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

Ubuntu 6.8.0-87-generic 内核,
而这正是目前在虚拟化环境(尤其 ESXi、KVM)下最容易触发 RCU 卡死(RCU stall)与软中断死循环 的版本之一。

6.8.0-87 是 Ubuntu 主线内核的 PREEMPT_DYNAMIC 构建版本(动态可抢占)。
这个分支的问题主要在于:

RCU 子系统与 tickless idle 同步错误 —— 在 ESXi 虚拟时钟漂移下,会导致 rcu_preempt 等不到 grace period。

softirq 饥饿问题 —— 网络或磁盘高 I/O 时,软中断线程被锁死。

PREEMPT_DYNAMIC 与虚拟 CPU 频率调整冲突 —— 虚拟 CPU 偶尔“失联”几百 ms,RCU 认为整个 CPU 核“挂了”,直接触发 panic。

这正是你看到的 “4095 GPs behind” 那种情况。
在物理机上也许还能恢复,但在虚拟机里它就是死锁

修复方式

1. 升级内核到稳定版本

安装更稳的内核(换 6.5 或 6.1)

apt update
apt install linux-image-6.5.0-41-generic
update-grub
reboot

或(推荐oem版本)

apt install linux-image-6.1.0-1052-oem
update-grub
reboot

最好先查一下

apt search linux-image

# 或

apt-cache search linux-image-6.5

我这里没有查到上述版本,手动升级的 linux-image-6.17.0-1005-oem

apt update
apt install linux-image-6.17.0-1005-oem
update-grub
reboot

2. 调整 GRUB 启动参数

vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="nohz=off rcu_nocbs=1 intel_idle.max_cstate=1 processor.max_cstate=1 workqueue.unbound=1 workqueue.power_efficient=1"

参数解析

参数 作用 理由
nohz=off 禁用 tickless 全局模式 保证 RCU 调度及时,低核 VM 防止延迟
rcu_nocbs=1 CPU1 不处理 RCU callback 双核 VM,隔离回调 CPU,保证 CPU0 处理关键回调
intel_idle.max_cstate=1 禁用深度 C-state 防止 CPU 进入深睡眠,延迟 quiescent state
processor.max_cstate=1 同上,Intel CPU 同上
workqueue.unbound=1 允许工作队列在任意 CPU 调度 提升调度灵活性,减少 CPU 堵塞
workqueue.power_efficient=1 让工作队列尽量 迁移到空闲 CPU 上,以降低 CPU 能耗。 减少 CPU 高频切换,节能。
作者:admin  创建时间:2025-11-07 10:31
最后编辑:admin  更新时间:2025-11-07 10:45