软锁告警表明cpu核心在内核态被长期独占,非瞬时抖动:需先用dmesg确认告警频次与固定cpu编号;再据宿主机或虚拟机环境分别检查bios c-state或vcpu绑定;继而提取call trace定位根因(如multi_cpu_stop或clear_page);最后通过启动参数调整、内核特性禁用或docker资源限制实现临时规避与持久修复。

银河麒麟V10开机过程中出现“CPU stalled for N seconds”或内核日志反复报“watchdog: BUG: soft lockup - CPU#X stuck for 22s!”,说明某个CPU核心在内核态被长时间独占,看门狗线程未能按时更新心跳,系统已触发软锁告警——这不是偶然卡顿,而是任务在中断上下文、自旋锁区域或驱动初始化中陷入死循环或无限等待。
第一步:确认是否真为软锁而非瞬时抖动
开机后若能进入系统,立刻打开终端执行:
sudo dmesg -T | grep -i "soft\|watchdog" | tail -20
重点观察时间戳是否密集连续(如1分钟内出现5次以上)、是否固定在某一个CPU编号(如CPU#3)、以及卡住的进程名是否稳定(如nginx、migration/X、runc:[2:INIT])。若仅出现1~2次且间隔超5分钟,可能是偶发调度延迟,暂不需深度干预。
第二步:区分宿主机与虚拟机环境
方法一:物理机环境(含国产化整机)
检查BIOS/UEFI中是否启用C-states(尤其是C6/C7深度睡眠状态),部分飞腾FT-2000+/鲲鹏920平台在C-state退出异常时会导致watchdog失准。进入BIOS → Advanced → CPU Configuration → C-State Control → 设为Disabled。
【关键前提】此操作需重启生效,且关闭后整机功耗会上升约8%~12%,仅用于排查阶段。
方法二:VMware虚拟机环境
执行virsh list --all确认当前运行的虚拟机;对疑似问题VM执行virsh vcpuinfo
第三步:定位卡死进程与调用栈
① 若系统尚可响应(未完全冻结),立即执行:
sudo cat /proc/sys/kernel/softlockup_panic
返回0表示仅告警不宕机,返回1则已配置为panic,此时必须优先查coredump或vmcore。
② 进入TTY终端(Ctrl+Alt+F2),执行:
sudo dmesg -T | awk '/soft lockup/,+5' | grep -E "(Comm:|pc :|lr :|Call trace:)"
这一行命令精准提取软锁发生时的进程名、程序计数器地址和调用链,避免被海量日志淹没。
③ 对比两次软锁的Call trace是否一致:
若每次都是multi_cpu_stop+0xe0/0x170 → cpu_stopper_thread,则大概率是内核热插拔CPU逻辑缺陷,需升级至ky10-sp3-202609补丁包;
若总是clear_page+0x10/0x24 → __cpu_clear_user_page,则指向内存清零函数在ARM64平台遭遇TLB失效死循环,应禁用内核参数page_alloc.shuffle。
第四步:临时规避与持久修复
方法1:启动参数级临时缓解
开机进GRUB菜单 → 按e编辑 → 在linux行末尾添加:
softlockup_panic=0 watchdog_thresh=30 nohz_full=0
其中softlockup_panic=0防止自动重启,watchdog_thresh=30放宽阈值避免误报,nohz_full=0禁用无节拍模式(该模式在多vCPU虚拟机中极易引发软锁)。
方法2:永久禁用高风险内核特性
编辑/etc/default/grub,找到GRUB_CMDLINE_LINUX行,在引号内追加:
intel_idle.max_cstate=1 rcu_nocbs=0-63
前者强制Intel平台只使用C1浅层睡眠,后者关闭RCU回调卸载到指定CPU(适用于64核鲲鹏机器),保存后执行sudo grub2-mkconfig -o /boot/grub2/grub.cfg并重启。
方法3:针对Docker/runc场景专项处理
若软锁总伴随runc:[2:INIT]或containerd-shim,执行:
echo 'kernel.softlockup_panic = 0' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
同时在/etc/docker/daemon.json中添加:
{"default-ulimits": {"cpu": {"Name": "cpu", "Hard": 100000, "Soft": 100000}}}
限制单容器CPU配额,避免其长期霸占某核心。











