跳转到内容

Proxmox 宿主内存:Windows 虚拟机到底吃多少

核验于 2 分钟阅读

31.2GB 宿主跑两台 Windows 11 虚拟机的实测内存占用、为什么远大于来宾分配值,以及怎么规划余量。

测试环境Pro (26H2) / LTSC 2024 · 版本号 26300.9457 / 26100.1742 · x64
E2
版本号
26300.9457 / 26100.1742
版本
Pro (26H2) / LTSC 2024
架构
x64
支持
E2 实验观察
证据
E2实验室复现, 直通虚拟机实测
核验日期
2026-10-29
页面类型
方法

来宾内存不等于宿主内存。“32GB 宿主”跑两台 8GB Windows 虚拟机,不会剩 16GB。

本站实验室:Proxmox VE 9.2.2、16 核、31.2GB 内存、两台各 8GB 的 Windows 11 虚拟机,宿主报告约为:

指标 观测值
已用 约 24GB
可用 约 6.7GB
Swap 已用 约 4.7GB

这才是规划时该用的数字:16GB 的来宾分配,占了约 24GB 宿主内存。

消耗方 原因
来宾工作集 Windows 会用满给它的量;8GB 来宾常驻 6–7GB
QEMU/KVM 开销 每个虚拟机进程、设备模型、OVMF、vTPM
ZFS ARC 文件系统缓存会占用很大一块,除非限制
宿主服务 PVE 守护进程、容器、监控
Swap 告诉你宿主已经超配的安全阀

ZFS ARC 最容易被忘。ZFS 根上 ARC 默认会吃满内存;它是缓存,有压力会收缩——但也意味着“空闲”数字有误导性,swap 会在你没预料到的时候被用上。

在 PVE 宿主上:

终端窗口
free -h
cat /proc/spl/kstat/zfs/arcstats | head
qm list
qm config 361 | grep -E 'memory|balloon|cores'

再从来宾内部:

终端窗口
Get-CimInstance Win32_OperatingSystem |
Select-Object @{n='TotalGB';e={[math]::Round($_.TotalVisibleMemorySize/1MB,1)}},
@{n='FreeGB';e={[math]::Round($_.FreePhysicalMemory/1MB,1)}}
Get-Counter '\Memory\Available MBytes' -MaxSamples 3

如果来宾报告大量空闲内存,而宿主已经在用 swap,那是宿主超配了,不是来宾的问题。

一条经得起现实的规则:

  • 给宿主留 2–4GB(PVE + ZFS ARC 下限 + 监控);
  • 按 来宾内存 × 1.2 估算真实成本(开销 + 工作集漂移);
  • 留 10–15% 不用;
  • 永远不要按最后一个 GB 规划。

32GB 宿主:32 − 3 = 29GB 可用,所以两台 8GB 加一台 8GB 已经在边缘,第三台 Windows 虚拟机必须先释放内存——这正是本站实验室记录里的结论。

改动 效果
限制 ZFS ARC(zfs_arc_max) 可预测地释放内存;缓存略少
给来宾设 balloon 宿主可在压力下回收;来宾可能变慢
来宾降到 6GB 轻负载可以,Windows Update + 浏览器就不够
关来宾内存压缩 不释放有用内存,通常更糟
加第二台宿主 到极限后唯一真正的解法

这次观察证明了什么、没证明什么

Section titled “这次观察证明了什么、没证明什么”
  • 证明:在这台宿主、这些来宾下,两台 8GB Windows 虚拟机吃掉约 24GB 宿主内存,并让宿主进入 swap。
  • 没证明:所有 32GB 宿主都这样——ZFS 设置、来宾负载、PVE 版本都会改变数字。

在自己的宿主上重测;上面的方法才是重点。

E2(M-V):宿主数字来自实验室记录中这套双虚拟机配置。本文没有同时在来宾侧采样计数器,因此只把宿主观测作为实测数据引用。

来源