<br />
<br />
内存暴涨原因
目前我们发现绝大部分虚拟机安装飞牛的用户存在内存不断增长,主要是内存没有被回收,一般来讲内存回收是由系统来管理的,但是由于你在虚拟机中安装的系统,但是在 PVE 或 ESXi 虚拟机环境中,内存管理可能受到宿主机资源调度和内存气球技术(Ballooning)的影响。
一般来讲,系统开机后会占用大部分接近全部的内存,对这些内存做一个细致划分,所以你会在开机一瞬间在虚拟机监控平台就可以看到虚拟机内存直接占满所分配的所有内存,这是一个非常正常事情。

内存超分
比如我宿主机有 8G内存,然后我创建了A B两个虚拟机 A虚拟机分配6G运存,B虚拟机分配2G运存,加上系统(ESXI PVE)保留内存,实际处于一个内存超分的情况,这个时候如果我开启B虚拟机,B虚拟机需要一下占用2G内存,但是主机内存肯定不够,所以根据ESXI调度策略,会将A虚拟机中的空闲内存进行强行回收,这些不活动的内存会以 .vswap 保存在虚拟机的目录中,关机后将被释放。
如果出现内存回收那么你一定会在ESXI监控中看到虚拟机内存实际占用有一个明显的下降

但是由于保存这个文件回收是需要时间,B虚拟机需要快速接近一瞬间得到全部内存,所以这个时候ESXI会把A虚拟机中的内存进行强行占用来防止主机内存溢出造成系统直接崩溃,所以你会发现A虚拟机中的内存在一瞬间出现非常高的占用,但是在进程中你是无法看到的。
但是这个时间一般会在1分钟左右ESXI会把两个虚拟机的内存进行合理的分配,因为B虚拟机刚开机占用的很大一部分内存实际上并不活跃,由于内存的超分最终会被回收闲置内存,所以当B虚拟机内存回收完毕后,A虚拟机强行占用的内存也会被ESXI进行释放,但是问题就出现在这里,可能因为一些因素导致系统内存并没有被回收,所以你会发现好像是在一瞬间内存暴涨但始终没有降低。那么这样接着循环几下这个系统的内存一直没有释放就会直接导致内存溢出然后系统死机崩溃

那么会有人问,如果我再来个C虚拟机 分配2G内存会出现什么样子?
这个时候ESXI由于内存实在比较紧张,无法瞬时间完成回收,所以这个虚拟机在开机的时候大概率会出现一个等待,会有一个显示“正在调度内存<字节数>”在调度过程中,A B虚拟机的内存均会再进行一个大幅度回收以及强行占用。直到C虚拟机完成开机,ESXI监控到一部分不活跃的内存给回收到 .vswap 文件中然后才会将 A B虚拟机强行占用的内存进行释放。
如果你需要了解更详细的内存回收,可以点击这里查看官方技术文档
如何解决?
那么这个问题其实解决起来也非常简单,每个虚拟化平台都会配备一个虚拟机管理工具,比如Vmware Tools 专门用来增强图形化以及内存管理,VMware Tools是可以配合宿主机完成整个过程的内存调度任务,PVE是属于qemu虚拟机,也有自己的管理工具 qemu-guest-agent
如何安装?
ESXI VMware 需要安装开源的Tools,是专门适用于的 Debian 比自带的Tools有更强的兼容性
进入SSH 输入以下命令
sudo apt update
sudo apt install open-vm-tools
PVE输入
sudo apt update
sudo apt install qemu-guest-agent -y
其它说明
- 目前由于飞牛是定制内核,一般来讲ESXI兼容的Linux系统中安装过程会自动将对应的管理工具进行安装。所以不确定这个工具是否会造成系统中其它兼容问题,我会持续观察,如果有任何问题,欢迎在评论区留言
- 出现内存暴涨的主要触发应该是你触发了内存超分,过量分配虚拟机内存。
关于SWAP是否会影响内存溢出?
swap实际上并不会导致内存溢出,根据社区反映,还是有存在关闭swap出现内存溢出的问题,结合各大AI所说,swap影响内存溢出没有实际证明。但是在虚拟机中一般也用不到swap,因为他与VMware的 .vswap 原理是很像 |