服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-22 简米科技 4,048 字 10 分钟阅读

服务器虚拟机内存使用情况异常如何排查优化?内存占用过高怎么解决?

导读虚拟机内存使用率异常,先别急着重启,正确的排查路径是:同时检查宿主机和虚拟机两个层面的内存数据,先用free和top定位内存去向,再对照页缓存、进程泄漏、超卖配置三个方向逐层甄别,最后按内核参数、超卖策略、监控扩容的顺序做针对性优化,虚拟机内存使用率高怎么排查,先分清是“虚胖”还是“真高”很多运维同行一看到内存……

虚拟机内存使用率异常,先别急着重启,正确的排查路径是:同时检查宿主机和虚拟机两个层面的内存数据,先用free和top定位内存去向,再对照页缓存、进程泄漏、超卖配置三个方向逐层甄别,最后按内核参数、超卖策略、监控扩容的顺序做针对性优化。

虚拟机内存使用率高怎么排查,先分清是“虚胖”还是“真高”

很多运维同行一看到内存告警就紧张,下意识想重启虚拟机,但多数情况下,内存“看起来高”和“真的不够用”是两回事,排查的第一步,是搞清楚数据是从哪儿读出来的。

从宿主机看内存分配的现状

登录宿主机,执行free -m,重点看两行:Mem和Swap,如果宿主机available数值偏低,说明物理内存本身吃紧,虚拟机们正在抢资源,接着执行virsh list确认当前运行了哪些虚拟机,再用virsh dominfo <虚拟机名>查看配置的Max memory和当前使用的内存,这里有个容易被忽略的细节:宿主机上cat /proc/meminfo里的Committed_AS数值如果远超物理内存,说明超卖比例偏高,一旦业务峰值到来,宿主机可能直接触发OOM Killer。

进虚拟机内部逐项过内存指标

确认宿主机没问题后,登进虚拟机挨个看指标,我习惯按下面的顺序操作:

  • 执行free -m,看total、used、buff/cache和available四列,重点解释一下:used包含buff/cache,而available才是真实可用的内存估算值,如果available还有富余,说明业务没到极限。
  • 执行top,按Shift+M键按内存排序,找出占用最高的几个进程,这里要警惕一种情况:top里看到的进程内存是虚拟内存映射,不是实际驻留物理内存,判断要结合RES列。
  • 执行vmstat 1 5,观察si和so字段,这两个数值如果频繁跳动,说明系统正在疯狂换页,内存确实不够用了。
  • 执行dmesg | grep -i oom,看看有没有进程被系统杀掉,如果出现了Out of memory记录,那是实打实的物理内存耗尽。

怎么判断是缓存占位还是真占满

页缓存(Page Cache)是吞噬内存的大户,Linux内核为了提高文件读写性能,会把读过的磁盘数据留在内存里,这部分内存在free里显示为buff/cache,但它随时可以被内核回收,很多新运维看到used高、free低就以为内存满了,实际上应该看available。available已经考虑了可回收的缓存部分,如果这个数还高,那系统就没毛病。行业共识认为,判断内存是否吃紧,available比free更有参考价值。

内存异常的真实原因,多数出在页缓存和超卖

排查完表象,下一步要回答一个核心问题:内存到底被谁吃了,我积累的经验是,九成以上的异常都能归到下面三类原因。

页缓存与buffer被误读为业务占用

场景很典型:某台Web服务器free -m显示used达到90%以上,但业务响应正常,CPU也不高,执行cat /proc/meminfo,发现Cached字段占了绝大部分,这其实是内核在读文件时留下的缓存,不是业务进程的锅,优化方式很简单,在低峰期执行echo 3 > /proc/sys/vm/drop_caches可以手动清理缓存,但生产环境不建议频繁使用缓存本身是性能加速器,你清掉的不是垃圾,是系统的“肌肉记忆”,更稳妥的做法是调整脏页回写的参数vm.dirty_ratio,让内核更快地把缓存的脏数据写回磁盘。

进程渐进式泄漏,内存被一点点吃掉

比缓存更隐蔽的是内存泄漏,我遇到过一台Java应用服务器,运行两周后内存从40%爬到95%,重启后恢复,过阵子又涨回去,这种渐进式增长,十有八九是代码里有对象只创建不释放,排查方法不复杂,用top按RES排序连续观察几次,如果某个进程的驻留内存只增不减,基本就可以确定泄漏嫌疑,更精细的做法是用pmap -x <进程ID>看进程地址空间的分布,或者用jstat(针对Java进程)查看堆内存使用曲线。业内专家指出,内存泄漏的排查本质上是“排除法”,先把内核缓存排除了,再聚焦到业务进程头上。

超卖配置把宿主机内存拖成短板

虚拟化平台普遍存在内存超卖,原因很简单不是每台虚拟机都同时在峰值,但超卖比例没有行业标准,完全看业务模型,我见过有平台的宿主机内存超卖比例超过1:1.5,平时相安无事,等几台虚拟机同时做批量任务时,宿主机直接卡死,检查方法是看宿主机free的available,如果长期低于10%,基本可以判定超卖过头了。

服务器虚拟机配置多少内存合适

这个问题没有统一答案,但要给出实用的参考线。虚拟机内存配置经验值(表):

业务类型 配置参考 关键指标
小型网站/web前端 4GB-8GB available 常驻不低于 20%
数据库(MySQL/PostgreSQL) 物理机内存的1/4到1/2 命中率、慢查询
Java应用中间件 堆内存留30%给系统 Heap使用率不超过80%
缓存服务(Redis) 与数据集大小匹配 maxmemory设置低于物理内存

配置的核心原则是:给操作系统留出至少20%的余地,别把最后一滴水都分配给业务。

云服务器内存不足如何解决,三层优化手段按序做

确认了根因,接下来进入优化执行阶段,我习惯按“从软到硬”的顺序操作,先把系统层调好,再动配置,最后考虑扩容。

第一层:内核参数微调,压榨系统潜力

针对页缓存和换页行为,有两个参数值得优先调整:

  • vm.swappiness:默认是60,表示swap使用的积极程度,对于内存充裕的服务器,可以调低到10或者0,让系统优先使用物理内存,减少不必要的换页。
  • vm.dirty_ratio:控制脏页占内存的百分比,调低这个值(比如从20降到10),可以让内核更勤快地把脏数据写回磁盘,减少内存积压。

修改以上参数直接执行sysctl -w即可,重启后失效,需要写进/etc/sysctl.conf持久化。

第二层:控制超卖粒度和虚拟机内存配置

如果宿主机内存真的吃紧,动态调整虚拟机内存是成本最低的方案:

  • 对KVM虚拟机,可以用静态内存热插拔virsh setmem配合balloon驱动,实现在线调整内存大小,但前提是虚拟机内部安装了virtio-balloon驱动,Windows和主流Linux发行版都自带。
  • 给虚拟机设置cgroup内存上限,防止单台虚拟机无限制地蚕食宿主机资源,这在多租户环境下尤其重要,避免“一人中毒,全员陪跑”。
  • 锁定超卖比例的硬性红线:宿主机Committed_AS除以物理内存的值(即overcommit比率)控制在1.2以下,超出这个范围就要考虑减配或迁移虚拟机。

第三层:监控、告警和应急扩容

优化不是一锤子买卖,需要长期的数据观察,推荐用以下指标建立监控面板:

  • 宿主机available内存的绝对值
  • 每台虚拟机的memory usage趋势(观察是否有持续爬坡)
  • steal time(CPU偷取时间,如果这个指标高说明宿主机资源竞争严重)
  • OOM Killer触发次数

告警阈值可以参考:available内存小于物理内存的15%,或者虚拟机内swap持续使用超过1GB,就触发预警,如果业务增长趋势明显,该扩容还是得扩容云服务器加内存通常只需要几分钟,别让业务高峰期在内存告警中度过。

排查优化的真实场景对比

为了帮你快速定位问题,我把常见的几种异常场景整理成了表格,按照症状对照处理方案:

症状表现 核心原因 最快解决路径
虚拟机内used高但available正常 页缓存占位 忽略,或调vm.dirty_ratio
宿主机available持续走低 超卖比例过高 迁移虚拟机,降低超卖
某进程内存只涨不落 应用内存泄漏 灰度重启,提单给开发修复
swap频繁读写,机器卡顿 物理内存耗尽 优先扩容,其次查内存泄漏
虚拟机无限使用宿主机内存 缺少cgroup限制 补配cgroup上限

这个表格是我在多次处理线上问题后总结的“傻瓜式对照表”,新手照着排查可以少走弯路,以我服务过的客户为例,很多业务都遇到过“内存配置越大越觉得不够用”的循环这通常是监控指标选错了,纠正available这个观测维度后,问题立刻清晰很多。

虚拟机内存排查常见问题

问:free命令显示内存还剩很多,但虚拟机运行特别卡顿,是什么原因?

这种情况优先排查CPU和磁盘I/O,虚拟机的磁盘如果是共享存储,宿主机上其他虚拟机的I/O风暴会拖慢你的磁盘读写,表现为内存充足但响应极慢,同时检查宿主机的CPU核数是否超分,steal time升高意味着CPU资源被抢占。

问:内存告警之后直接重启虚拟机,能彻底解决问题吗?

重启只是暂时释放了内存,如果根因是应用泄漏或超卖配置失衡,重启后问题会准时复发,正确做法是,在重启前先抓取一次内存快照(/proc/meminfo+ps aux记录),留作根因分析依据,同时调整宿主机的超卖策略,才是长期解法。

问:虚拟机内存持续走高,但短期无法申请扩容,有什么临时手段?

启用swap是最后的缓冲手段,能撑一阵子,给虚拟机添加swap文件(fallocate -l 2G /swapfile,再mkswap和swapon),但要注意这项操作会显著降低性能,只适合应急,如果业务涉及大量读写,swap会让性能断崖式下跌,这种情况没有捷径,尽快扩容才是唯一出路。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱