PVE 垃圾回收 (GC) 进程 CPU 占用过高问题解决教程
PVE 垃圾回收 (GC) 进程 CPU 占用过高问题解决教程
📋 问题现象
- PVE 宿主机 CPU 长期居高不下(60%+)
top 命令看到 .pve-gc 进程占用 190%-210% CPU
- 进程被杀死后会自动重启,PID 不断变化
🔍 第一步:确认问题
top -b -n 1 | head -20
🛑 第二步:立即临时处理
kill -9 $(pgrep -f "\.pve-gc") 2>/dev/null
⏰ 第三步:禁用自动触发定时器
systemctl stop pve-daily-update.timer
systemctl disable pve-daily-update.timer
systemctl status pve-daily-update.timer
📁 第四步:找到 GC 可执行文件
find / -name "*pve-gc*" 2>/dev/null
🔒 第五步:彻底锁死 GC 文件
# 5.1 杀死当前GC进程
kill -9 $(pgrep -f "\.pve-gc") 2>/dev/null
# 5.2 覆盖文件内容为空脚本
echo '#!/bin/bash' > /var/lib/pve/.cache/.pve-gc
echo 'exit 0' >> /var/lib/pve/.cache/.pve-gc
# 5.3 移除执行权限
chmod 000 /var/lib/pve/.cache/.pve-gc
# 5.4 加锁防止被修改
chattr +i /var/lib/pve/.cache/.pve-gc
# 5.5 验证
ls -la /var/lib/pve/.cache/.pve-gc
lsattr /var/lib/pve/.cache/.pve-gc
🛡️ 第六步:创建 CPU 限制脚本(可选)
cat > /usr/local/bin/limit-gc.sh << 'EOF'
#!/bin/bash
mkdir -p /sys/fs/cgroup/cpu/gc-limiter 2>/dev/null
echo 10000 > /sys/fs/cgroup/cpu/gc-limiter/cpu.cfs_quota_us 2>/dev/null
echo 100000 > /sys/fs/cgroup/cpu/gc-limiter/cpu.cfs_period_us 2>/dev/null
while true; do
ps aux | grep "\.pve-gc" | grep -v grep | awk '{print $2}' | while read pid; do
if [ ! -z "$pid" ]; then
echo $pid > /sys/fs/cgroup/cpu/gc-limiter/cgroup.procs 2>/dev/null
echo "$(date): 已限制GC进程 PID=$pid" >> /var/log/gc-limited.log
fi
done
sleep 2
done
EOF
chmod +x /usr/local/bin/limit-gc.sh
🔄 第七步:设置开机自启(可选)
echo '/usr/local/bin/limit-gc.sh &' >> /etc/rc.local
chmod +x /etc/rc.local
tail -n 5 /etc/rc.local
🚀 第八步:立即启动限制脚本(可选)
nohup /usr/local/bin/limit-gc.sh >/dev/null 2>&1 &
ps aux | grep limit-gc.sh
✅ 第九步:最终验证
top -b -n 1 | head -10
ps aux | grep "\.pve-gc" | grep -v grep
📊 常用验证命令汇总
# 查看CPU
top -b -n 1 | head -10
# 查看GC进程
ps aux | grep "\.pve-gc" | grep -v grep
# 查看GC文件状态
ls -la /var/lib/pve/.cache/.pve-gc
lsattr /var/lib/pve/.cache/.pve-gc
# 查看定时器状态
systemctl status pve-daily-update.timer
# 查看限制脚本日志
tail -f /var/log/gc-limited.log
✅ 完成标准
- [ ] CPU 利用率 < 10%
- [ ] 没有
.pve-gc 进程
- [ ] GC 文件权限为
000,属性为 +i
- [ ] 系统负载平稳
⚠️ 注意事项
- 第五步是核心:锁死 GC 文件后它就永远无法执行
- 重启后依然有效:文件锁和权限永久保留
- 定时器禁用:防止每天自动触发
- 双重保险:文件锁死 + 限制脚本(可选)