虚拟机物理内存不足时,优先给物理机加内存条或调大虚拟机内存配额,同时启用内存气球、压缩回收和应用层限流,才能彻底缓解宿主机内存压力。
先分清:是虚拟机内存不足还是物理机内存不足?
很多人看到虚拟机里报“内存不足”,第一反应就是给物理机加内存条,这个方向没错,但如果不先判断宿主机的真实内存占用,可能加了内存还是卡,用下面的命令看一眼:
- Windows宿主机:打开任务管理器,切到“性能”标签,看“可用内存”是否长期低于总内存的10%左右。
- Linux宿主机:执行
free -h,重点看available列。available已经接近几十MB级别,物理内存确实见底了。 - VMware ESXi主机:在vSphere Client主机摘要页查看“内存”状态,或SSH执行
esxcli hardware memory get查看物理内存总容量和可用量。
如果宿主机还有大量空闲内存,但虚拟机内部报不足,问题通常出在虚拟机内存配额太低,或者客户机内部某个进程吃光了分配内存,这时候不用加物理内存,调大虚拟机内存配置就行,行业共识认为,宿主机长期依赖交换分区运行虚拟机,性能损耗会被放大到无法接受的程度。
虚拟机内存不足怎么扩容?先判断物理内存是否真的耗尽
物理内存耗尽有一个很明显的信号:宿主机开始频繁读写交换分区/页面文件,磁盘IO无故升高,虚拟机响应速度断崖式下降,假设你在一台16GB内存的Windows笔记本上跑VMware Workstation,开了3台虚拟机,每台分配4GB,宿主机自己只剩不到2GB可用,这时候同时启动第三台虚拟机就会报内存不足。
判断物理内存耗尽的三个表现
- 宿主机可用内存长期低于总内存的5%到10%,且持续数小时。
- 磁盘队列长度升高,但虚拟机内部并没有大量读写操作。
- 虚拟机内部的“已提交内存”远高于“物理内存”,同时宿主机的交换使用量不断增长。
虚拟机物理内存扩容的3条路径
直接给物理机加内存条
这是最彻底的方案,操作路径如下:
- 关机并断开电源,记录当前内存条型号、频率、插槽位置。
-
查看主板说明书或官网参数,确认最大支持内存容量和插槽数量。
- 尽量购买与现有内存同品牌同频率同容量的条子,避免兼容性问题。
- 对于服务器,优先选择ECC内存,并成对安装以启用双通道或四通道。
成本方面,家用DDR4/DDR5内存条价格从百元级到千元级不等,服务器ECC内存通常更贵,北京机房里的生产服务器如果出现内存不足,优先考虑在线迁移,而不是半夜停机加内存条,否则业务中断成本远高于内存条本身。
调整虚拟机内存配额
如果你用的是VMware Workstation、VirtualBox或Hyper-V,宿主机本身还有空闲内存,直接调大虚拟机内存是最快的。
VMware虚拟机内存扩容步骤:关闭虚拟机,右键选择“设置”,找到“内存”选项,把滑块向右拉高,保存后开机,进入虚拟机确认系统识别到新内存,Windows虚拟机需要检查“系统属性”里的已安装内存,Linux虚拟机用 free -h 验证。
Hyper-V动态内存:在虚拟机设置里启用“动态内存”,设置“启动RAM”和“最大RAM”,例如启动RAM给4GB,最大RAM给16GB,宿主机按需分配,适合测试环境,但数据库、域控制器这类负载不建议用动态内存,内存回收会造成性能抖动。
横向迁移虚拟机到其他主机
如果物理机的内存插槽已经插满,而且调配额也没余量,迁移虚拟机是更现实的方案,VMware环境使用vMotion在线迁移,前提是有vCenter和共享存储,对于单机用户,可以导出OVF模板,再导入到另一台内存更大的机器,迁移过程中注意网络传输和磁盘格式转换。
虚拟机内存优化设置:不花钱也能缓解内存压力
不是所有内存不足都要花钱,很多时候虚拟机占用的内存里有相当一部分是可以回收的,下面这些优化手段不需要加硬件。
启用内存气球与内存压缩
VMware Tools内置的内存气球驱动,会在宿主机内存紧张时向客户机内核施加压力,让客户机主动释放空闲内存页,ESXi主机的内存压缩默认开启,当物理内存吃紧时,压缩页优先于交换到磁盘,减少磁盘IO。
KVM/QEMU用户可以在虚拟机XML配置中加入virtio-balloon设备:
<memballoon model='virtio'> <stats period='10'/> </memballoon>
降低虚拟机内应用的内存占用
- Windows虚拟机:关闭SysMain服务(旧称Superfetch),减少预读内存占用;调整页面文件大小为固定值,避免频繁伸缩。
- Linux虚拟机:用
systemd-analyze blame查看启动耗时服务,停掉无关服务;Java应用通过-Xmx参数限制堆内存上限,避免抢占全部可用内存。 - 数据库虚拟机:MySQL的
innodb_buffer_pool_size设置过大反而会和操作系统争抢内存,多数情况下建议不超过物理内存的50%到70%。
使用内存预留和NUMA绑定
对于关键业务虚拟机,可以在vSphere中设置内存预留,保证它不会被宿主机交换出去,操作路径:编辑虚拟机设置 -> 内存 -> 勾选“预留所有客户机内存”,但预留过高会导致其他虚拟机无法启动,要留足余量,NUMA绑定可以减少跨节点内存访问,在CPU和内存都较大的宿主机上效果明显。
ESXi虚拟机内存不足的场景化处理
ESXi环境的内存管理比桌面虚拟化复杂一些,如果ESXi主机内存不足,先SSH登录主机,执行:
esxcli hardware memory get esxcli vm process list
第一条命令看物理内存总量和可用内存,第二条列出每个虚拟机的内存使用量和配置值,如果某个虚拟机的“Memory Used”远超“Memory Configured”,说明它内部有严重的内存泄漏,需要重启该虚拟机并排查应用。
在vSphere Client中,可以为特定虚拟机设置内存限制和预留,路径:虚拟机 -> 编辑设置 -> 内存,填写“限制”字段可以防止单个虚拟机吃满主机内存,但设太低会导致虚拟机内部频繁触发OOM。
虚拟机内存扩容价格对比:加内存条还是升配置?
| 方案 | 一次性成本 | 性能影响 | 适用场景 |
|---|---|---|---|
| 加物理内存条 | 中等到较高 | 直接提升宿主机承载能力 | 内存插槽有空余,预算允许 |
| 调大虚拟机内存配额 | 免费 | 可能争抢宿主内存 | 宿主机有空闲内存 |
|
迁移虚拟机 | 需要第二台主机 | 分散负载 | 单机内存已到上限 |
| 启用气球驱动和压缩 | 免费 | 减少浪费,略有CPU开销 | 所有场景建议开启 |
加内存条和升配置之间没有绝对优劣,如果你的宿主机是老平台,内存插槽少,换整机可能比单买大容量内存更划算,反过来,如果只是内存不够,其他硬件还够用,加内存条是成本最低的选择,家用场景下,多数虚拟机玩家遇到的都是宿主机内存小于32GB的情况,这时候先调配额和启用优化,往往能再撑半年以上。
实操检查清单
把下面这些命令和路径记下来,排查和扩容时直接用:
- 查看Linux宿主机内存:
free -h、cat /proc/meminfo - 查看Windows宿主机内存:
systeminfo | findstr /C:"Total Physical Memory"、Get-Counter 'MemoryAvailable MBytes' - 查看VMware虚拟机内存:
esxcli vm process list - 查看KVM虚拟机内存:
virsh dommemstat 虚拟机名 - VMware Workstation调内存:设置 -> 内存 -> 调整大小
- VirtualBox调内存:设置 -> 系统 -> 内存大小
- Hyper-V动态内存:设置 -> 内存 -> 启用动态内存
先加物理内存,再做配额调整和内存回收优化,双管齐下才能让虚拟机内存不足的问题真正解决。
Q&A:虚拟机内存不足怎么扩容与优化?
Q1:虚拟机内存不足怎么扩容最省钱?
最佳顺序是先调大虚拟机内存配额并启用气球驱动,如果宿主机本身还有内存空闲,这一分钱不用花,只有物理内存确实见底时,再加内存条。
Q2:VMware虚拟机内存扩容后还是卡,是什么原因?
多数情况下不是内存容量不够,而是虚拟机内部有内存泄漏,或者宿主机的内存气球回收过于频繁,可以先检查客户机内部进程,再看vSphere里的内存预留和限制设置。
Q3:虚拟机物理内存扩容后需要重装系统吗?
不需要,加物理内存条对宿主机系统和虚拟机都透明,开机后系统会自动识别新内存,虚拟机内部也无需重装,最多需要在虚拟机设置里重新调整配额。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/660069.html




