解决ambari部署后出现的内核CPU死锁优化方案详解超简单版
我内容写的比较啰嗦,如果不想看我啰嗦的部分可以直接看红色字体部分和有代码的部分,如果有不对的地方请大家批评指正,感谢~!
一、问题出现
[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死锁问题!
更多推荐


所有评论(0)