在 Proxmox VE (PVE) 中,主机 OOM Killer 可能杀死 QEMU 进程(虚拟机),保护方法包括 hookscript 设置 oom_score_adj、禁用内存气球和优化主机内存。 reddit
方法1:Hookscript(推荐)
创建保护脚本 /var/lib/vz/snippets/oom_protect.sh:
#!/bin/sh
vmid=$1
phase=$2
vmpid=$(cat /run/qemu-server/$vmid.pid 2>/dev/null)
if [ "$phase" = "post-start" ]; then
echo "保护 VM $vmid (PID $vmpid) 免于 OOM"
echo -1000 > /proc/$vmpid/oom_score_adj
fi
chmod +x /var/lib/vz/snippets/oom_protect.sh
qm set <VMID> --hookscript local:snippets/oom_protect.sh
启动 VM 后自动设置 -1000(永不杀)。 gist.github
方法2:Systemd 路径单元(全局保护)
为特定 VM(如 104)创建:
cat > /etc/systemd/system/104-oom.path <<EOF
[Path]
PathModified=/run/qemu-server/104.pid
[Install]
WantedBy=multi-user.target
EOF
cat > /etc/systemd/system/104-oom.service <<EOF
[Unit]
Description=Protect VM 104 from OOM
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo -1000 >/proc/$(cat /run/qemu-server/104.pid)/oom_score_adj'
EOF
systemctl daemon-reload
systemctl enable 104-oom.path
替换 104 为你的 VMID。 gist.github
其他优化
内存气球:
- VM 选项 > 硬件 > 内存 > 取消勾选“气球”(Ballooning),避免主机抢占 VM 内存。 reddit
主机调优:
- ZFS 用户:
echo 8589934592 > /sys/module/zfs/parameters/zfs_arc_max(限 ARC 8GB) - Swap:启用主机 swap 分担压力
- 避免超配:总 VM RAM < 主机 RAM 80%
监控:watch -n1 'cat /proc/*/oom_score_adj | grep qemu' 检查分数。 reddit
Leave a comment