问题截图如下
查看系统
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/LinuxUbuntu 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
reboot2. 调整 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
最后编辑:admin 更新时间:2025-11-07 10:45