在 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

Tags: ,

Categories:

Updated:

Leave a comment