我内容写的比较啰嗦,如果不想看我啰嗦的部分可以直接看红色字体部分和有代码的部分,如果有不对的地方请大家批评指正,感谢~!

一、问题出现

[hcc@master ~]$ sudo -i

ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1760249967

[root@master ~]#

通过 abrt-cli list --since 1760249967 查看具体的错误

这是一个 内核软死锁 (soft lockup) 问题。

原因: NMI watchdog: BUG: soft lockup - CPU#3 stuck for 34s! [vmtoolsd:2730]

时间: 2025年10月12日 14:42:55

涉及进程: vmtoolsd:2730 (VMware Tools 进程)

CPU: 第3号CPU

什么是软死锁?

软死锁是指内核在某个CPU上被占用超过20-30秒,无法调度其他进程运行。

可能的原因

VMware Tools 问题:vmtoolsd 进程可能出现了bug或资源竞争

虚拟机配置问题:CPU资源不足或分配不合理(我的是分配的内存过少)

内核问题:可能与当前内核版本有关(我的是内核太多)

硬件虚拟化问题:VMware虚拟化层的问题(我的vm不支持虚拟化)

执行以下命令,检测

#当前CPU核心 
nproc
#当前内存 
free -h
#当前负载
uptime

 

分析发现:

(1)有8个CPU核心

根据之前的软死锁错误,很可能是在资源不足的宿主机上过度分配

(2)总内存只有3.8GB,可用内存仅剩409MB,系统在内存压力下运行

当内存不足时,系统频繁交换,导致 vmtoolsd 等进程卡住.

(3)load average: 0.26, 0.24, 0.25

负载看起来正常,但这是在内存瓶颈下的假象

系统可能因为内存不足而"假死",无法真正体现高负载

 

二、解决方案:

2.1 修改三个虚拟机的内存和内核

不要担心内核变少会有啥影响,因为你本身内核太多,内存太少这样平均分 配下来,每个内核的运行内存就特少,自然会影响性能。

 

虚拟机资源配置调整
主节点配置调整为16GB内存+4核心CPU
从节点配置调整为8GB内存+2核心CPU
修改前需完全关闭虚拟机电源

 

当我们修改完后可以打开master虚拟机执行以下命令,看当前问题是否被解决,或者说修正到哪一步了,要明白你做的这一步操作都解决了哪些问题。

如果问题解决的正常状态:

# dmesg 应该没有新的软死锁错误
dmesg | grep -i lockup
(没有输出或只有历史记录)

# ABRT 应该没有新问题
abrt-cli list
(没有输出或只有历史问题)

# vmtoolsd 运行正常
systemctl status vmtoolsd
● vmtoolsd.service - VMware Tools daemon
   Loaded: loaded (/usr/lib/systemd/system/vmtoolsd.service; enabled; vendor preset: enabled)
   Active: active (running) since ...

 

我的结果:

 

显而易见:

# vmtoolsd现在运行正常(新的进程ID 792)

systemctl status vmtoolsd

Active: active (running) since Mon 2025-10-13 15:35:48 CST

 

但还存在问题:

ABRT中仍有历史错误记录

需要确认是否还有新的软死锁发生

 

接着进行下一步:

2.2 内核参数优化配置(往下配置三个虚拟机都要做)

创建优化配置脚本: 

cat > /etc/sysctl.d/99-softlockup-fix.conf << 'EOF'
# 解决软死锁核心参数
kernel.watchdog_thresh = 30
kernel.nmi_watchdog = 0
kernel.softlockup_panic = 0
kernel.softlockup_all_cpu_backtrace = 0

# 内存和IO优化
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.swappiness = 10

# 进程调度优化
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
EOF

 

# 立即生效
sysctl -p /etc/sysctl.d/99-softlockup-fix.conf

 

# 2. 验证
cat /proc/sys/kernel/watchdog_thresh

 

2.3 历史错误清理

使用以下命令清理ABRT记录: abrt-cli remove <目录路径>

我用id和 abrt-cli rm all 删不掉

Directory写你自己的。

通过abrt-cli list 确认清理完成

abrt-cli remove <目录路径>


 

2.4 系统健康验证

执行综合检查命令:

echo "=== 系统健康检查 ==="
echo "运行时间: $(uptime)"
echo "内存: $(free -h | grep Mem | awk '{print $3\"/\"$2}')"
echo "CPU: $(nproc) 核心"
echo "看门狗阈值: $(cat /proc/sys/kernel/watchdog_thresh) 秒"
echo "最近错误: $(dmesg | grep -c 'BUG:\|lockup') 个"
echo "ABRT报告: $(abrt-cli list | wc -l) 个"
echo "vmtoolsd状态: $(systemctl is-active vmtoolsd)"

你看到的最近错误: 1 个,这个是正常的

[ 5.532727] NMI watchdog: Shutting down hard lockup detector on all cpus

这是正常的系统启动日志,表示按照我们的配置关闭了NMI watchdog,不是真正的错误!

OK!现在你需要:

节点同步操作

在所有节点应用相同优化配置,记得在root用户下操作。这里就不赘述了。

当你操作完之后

恭喜您成功解决了CPU死锁问题!

 

更多推荐