vmware虚拟机内存异常占用问题一例

  关键词

  • vmware esxi、hypervisor
  • 虚拟化平台内存模式
  • Guest virtual memory

一、问题现象

业务一台vmware虚拟机出现内存使用率告警,运维人员登录系统检查内存确实高水位状态

检查各进程使用内存不高,合计内存总数与使用率占用情况明显不匹配,不知内存被哪里吃去了?

 
二、问题分析

因为主机是虚拟化主机,联想到宿主机一侧是不是有异常,检查下

登录虚拟化资源池管理机器,找到这个虚机,查看虚机性能发现确实有较大的虚拟增长,对应宿主机也有同样虚拟增长情况。

   经过询问,这台宿主机之前出现过内存不足问题,处于高压状态,有通过内存膨胀机制来回收虚拟机的物理内存页,造成虚机内存的虚拟增长。如果虚机没做迁移、重启之类的操作,那么虚拟增长不会自动释放。

vmware内存回收机制:当宿主机可用内存高于等于6%时,hypervisor仅使用透明页共享回收内存(当没有设置虚拟机内存限制时)。如果虚拟机设定了内存限制,则hypervisor使用ballooning甚至swapping回收内存直到低于限定值。当宿主机可用内存接近4%时,hypervisor使用ballooning回收内存,一般情况下可以及时的回收内存,让可用内存保持在4%以上。

如果ballooning不足以回收内存,宿主机可用内存接近2%时,hypervisor在ballooning回收内存的基础上增加使用swapping(并激活内存压缩)加速内存回收,让可用内存保持在4%以上。罕见的当主机可用内存只有1%时,hypervisor除了继续使用ballooning和swapping回收内存,还禁止所有虚拟机申请更多内存。

公式:ρ=份额/(活动内存+k*空闲内存),ρ就是该虚拟机可获得物理内存比例的分子,分母是所有虚拟的ρ的和。k是惩罚因子,k=1/(1-IMT),IMT为空闲内存税(Idle Memory Tax),默认IMT=75%,即k=4,IMT值可以在ESX(i)的高级设置中修改。显然份额越大,活动内存比例越高则ρ越大,可获得的物理内存越多。hypervisor从ρ最小的虚拟机开始回收内存。

三、处理过程

  对虚机进行重启,或者将虚机迁移到其他宿主机,可解决该问题。


四、知识拓展:VMware虚拟化平台内存管理

1、虚拟化平台三种内存模式

主机物理内存(Host Physical Memory):主机物理内存是ESXi在一个物理主机上检测到的内存值,该值是主机实际物理安装的内存值。例如,一台X86服务器配置16根32GB内存,则该主机的物理内存为512GB
虚拟机物理内存(Guest Physical Memory):登录虚拟机操作系统可以看到分配给虚拟机的内存,例如创建虚拟机的时候分配4GB内存,则操作系统能识别到4GB内存,这就是虚拟机物理内存
虚拟机虚拟内存(Guest Virtual Memory):虚拟机操作系统分配给应用程序的可用内存,这是虚拟机操作系统映射到虚拟机物理内存的虚拟内存地址空间,是虚拟机操作系统提供给他的应用程序使用的内存地址空间,在非虚拟化环境中也是如此

2、内存三种模式的工作方式

下图显示了三层内存的相互映射方式,虚拟机虚拟内存映射到虚拟机物理内存,虚拟机物理内存被虚拟机管理器(hypervisor)映射到ESXi主机物理内存。

   举例说明:如果你有一个虚拟机,在虚拟机里面开启一个微信应用程序,微信如果想要运行就会向虚拟机索要内存,虚拟机会提供内存给微信应用使用,这个时候内存的流向是Guest virtual memory 向 guest physical memory申请内存。此时,虚拟机管理器会收到guest physical memory向Host physical memory申请内存,申请完成后微信应用程序才能正常运行。总结一下就是一个ESXi主机为其上运行的每个虚拟机创建一个虚拟内存地址空间,这些虚拟内存地址空间向下映射到主机内存地址,向上映射到虚拟机作为虚拟机的物理内存。当微信使用完后,虚拟机会将这部分内存标记为“free”,此时其他应用程序可以使用这部分内存,但是虚拟机管理器不会关心这些被标记为“free”的内存,并且认为这些内存一直分配给了虚拟机。也就是说,一旦管理程序将内存分配给一个虚拟机,它没办法分辨分配给虚拟机的内存是被虚拟机操作系统分配给了应用程序还是已经被释放。所以当虚拟机的操作系统释放虚拟机物理内存时,管理程序不能从虚拟机回收主机物理内存。下图表示了这种属性。


3、虚拟机的内存回收

  内存分配容易回收难,因为内存回收的时候,管理程序必须保留足够的物理主机内存来支持虚拟机物理内存分配和虚拟机运行的内存开销。但是在日常工作中我们经常会遇到ESXi主机内存过量分配的情况,ESXi通过使用透明页共享(Transparent Page Sharing)、内存膨(Ballooning)、管理程序内存交换(hypervisor swapping)及内存压缩(memorycompression)等机制保证能使内存过量分配。


4、透明页共享

当ESXi主机运行多个虚拟机时,这些虚拟机可能已加载相同的应用程序或组件,或者包含公用数据。使用透明页共享技术可以消除内存页的冗余副本,只保留一份,其余的内存可以重新分配给其它虚拟机。


5、内存膨胀

如上所述,当虚拟机的客户操作系统释放内存时,ESXi不能简单地回收主机物理内存页,虚拟机操作系统也不知道ESXi主机内存的真实使用率。当ESXi主机内存处于压力状态时,主机可以通过内存膨胀机制来回收虚拟机的物理内存页,触发内存膨胀的驱动程序在安装vmware tools的时候已经安装在操作系统中,驱动程序的名称为vmmemctl。

6、虚拟机操作系统内存膨胀

  当主机的物理内存处于压力状态,主机需要从虚拟机中回收物理内存时,管理程序会给vmmemctl设置一个须达到的目标值,vmmemctl收到目标值后,虚拟机首先将被标记为“free”的内存“填充气球”,如果这些被标记为“free”的内存不能满足的情况下,可能触发内存交换的情况,以达到需要回收目标值。最理想的状态是,在不进行内存交换的情况下就能满足目标值,这样就不会影响虚拟机的性能。为了避免在进行内存交换的时候有可以交换的磁盘可用,所以在虚拟机进行配置时,要有足够的交换空间。当然也可以设置限制可使用内存膨胀回收的内存量,甚至可以禁用内存膨胀,但是一般情况下不建议这样做,因为内存膨胀是在保障虚拟机操作系统性能的情况下做出的选择,要比其他方式温柔的多,所以不建议禁用内存膨胀。


7、内存压缩

内存压缩就是指那些需要交换到磁盘的内存页不进行磁盘交换而是进行压缩,这种时候就是上面内存膨胀需要回收内存时,如果“free”内存不能满足回收的目标值,虚拟机会将不会内存交换到磁盘,在交换到磁盘之前管理程序会判断是进行压缩对虚拟机性能影响小,还是进行交换对虚拟机性能影响小。并不是所有的内存都适合压缩,如果一个内存页压缩比在50%以上,ESXi主机将会压缩这些内存。如果内存页压缩比在50%以下,则会通过管理程序将内存交换到磁盘。


8、管理程序内存交换


当ESXi主机使用透明页共享、内存膨胀、内存压缩等机制都不能回收内存时,才会使用管理程序内存交换。在进行内存交换时,管理程序不会判断虚拟机里面哪些内存适合交换,也就是说它不会判断页面对于虚拟机的重要程度,所以会随机选择内存页面进行交换,这就会对虚拟机造成不可预知的影响,内存交换到磁盘审核,也会严重影响虚拟机的性能。在ESXi5.5以上版本中可以设置SSD缓存交换,以较少对性能的影响。


9、使用什么机制进行回收?

根据ESXi主机实际可用内存量的不同,ESXi有4种内存状态,分别是High、Soft、Hard以及Low,具体定义阀值如下表:、

可以使用esxtop命令查看当前处于哪种状态

怎么知道内存是否存在性能问题?
查看内存的使用情况有很多种,你可以通过vSphere网页客户端进行查看,可以通过使用VMware vRealize Operations Manager,也可以通过esxtop命令进行查看。这里简单介绍下通过esxtop命令进行分析。
SSH登录到ESXi主机,然后输入esxtop命令,输入m进入内存页面,默认5s中更新一次,可以使用s来更改更新间隔(输入s会看到Seconds to delay: 输入你想要的刷新频率,单位为秒,然后回车确认),可以使用f选择要查看的字段,具体详细命令可以参考官方手册,这里只介绍几个比较重要的参数及判断标准。

PMEM/MB 显示服务器的计算机内存统计信息
VMKMEM/MB 显示ESXi VMkernel的计算内存统计信息。这里面要重点注意主机的内存状态。当状态为Soft的时候说明要关注内存情况,说明主机已经存在内存压力。
PSHARE/MB 显示ESXi页共享信息
SWAP/MB 显示ESXi交换使用量统计信息
r/s 由ESXi系统从磁盘换入内存的速率,如果该值大于0,主机物理内存量过量,主机尝试回收内存,并且仅仅通过内存膨胀这一机制无法满足
w/s 由ESXi系统将内存交换到磁盘的速率,如果该值大于0,可能主机物理内存已严重不足
ZIP/MB显示ESXi内存压缩统计信息
curr,使用vmmemctl模块回收的物理内存总量
target,ESXi主机尝试使用vmmemctl模块回收的物理内存总量
max,ESXi主机可以使用vmmemctl模块回收的最大物理内存量
如果该值比0大,或者主机内存过量,或者虚拟机已设置了一个比当前配置内存小的内存限制时,主机开始从虚拟机回收内存。
SWCUR 该资源或虚拟机当前使用的交换量
SWTGT ESXi主机预期资源池或虚拟机交换使用量的目标
SWR/s 同SWAP/MB里面的r/s
SWW/s 同SWAP/MB里面的w/s
SWCUR 表示当前使用内存交换交换到磁盘的内存量,如果该值大于0,主机物理内存吃紧,主机尝试回收内存并且仅仅通过内存膨胀一无法满足
CACHEUSD 当前内存压缩所使用的压缩高速缓存量,该值大于0表示主机正在进行内存压缩,主机内存不足
ZIP/s 主机内存压缩率,如果该值大于0,说明主机正在进行内存压缩
UNZIP/s 如果该值大于0,那么被压缩的内存正在被主机或者虚拟机访问,此时虚拟机性能将收到影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/306739.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将dumpbin从Visual Studio中抠出来,并使用dumpbin查看exe和dll库的依赖关系

目录 1、初步说明 2、在开发的机器上使用dumpbin工具查看dll库的依赖关系 3、将dumpbin.exe从Visual Studio中抠出来 3.1、找到dumpbin.exe文件及其依赖的dll文件 3.2、在cmd中运行dumpbin,提示找不到link.exe文件 3.3、再次运行dumpbin.exe提示找不到mspdb10…

UV胶水能够粘接聚苯乙烯PS吗?需要注意哪些事项?又有哪些优势呢?

聚苯乙烯(Polystyrene,简称PS)是一种常见的合成聚合物,属于热塑性塑料。它是由苯乙烯单体聚合而成的,具有轻质、透明或半透明、电绝缘性好等特点。常见: 包装材料白色泡沫塑料(EPS,用于包装、保…

排序链表[中等]

一、题目 给你链表的头结点head,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3&…

Python多线程同步

同步条件(Event) 在Python中,多线程同步可以通过threading模块中的Event对象来实现。Event对象允许一个或多个线程等待某个事件的发生,当事件发生时,等待的线程将被唤醒。 event.isSet():返回event的状态值 event.wait()&#x…

项目-新闻头条-数据管理平台-ajax综合案例

愿许秋风知我意&#xff0c;解我心中意难平。 项目介绍 项目准备 推荐使用&#xff0c; 每个程序员都有自己的管理方式。 验证码登录 HTML结构&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><met…

线性回归(Linear Regression)

什么是机器学习 线性回归是一种用于建立变量之间线性关系的统计模型。在简单线性回归中&#xff0c;我们考虑一个自变量和一个因变量的关系&#xff0c;而在多元线性回归中&#xff0c;我们考虑多个自变量和一个因变量之间的关系。 简单线性回归 简单线性回归模型可以表示为…

vue购物车案例、v-model进阶、与后端交互

一 购物车案例 - 结算 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>购物车结算</title><script src"https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></scr…

Real Fire Smoke

资产使用高分辨率的动画Spritesheet,并结合了Shuriken粒子系统。具有3种风格的火焰和爆炸。 效果分为7类。 主要特点: - 3种火 - 预制板共计80块 - 5种爆炸声 - 3个循环的火灾声音 - 7张火焰和烟雾的精灵图 - 8x8 帧的 spritesheet,分辨率在 2048 到 8192 像素之间 效果类别…

Spring cloud聚合父工程project

文章目录 本次微服务版本一. 新建父工程project1.1设置字符集utf-81.2注解生效激活1.3. Java8编译版本 二. 父工程 pom.xml 本次微服务版本 一. 新建父工程project 1.1设置字符集utf-8 1.2注解生效激活 1.3. Java8编译版本 二. 父工程 pom.xml <?xml version"1.0&quo…

【深度学习每日小知识】Logistic Loss 逻辑回归:损失和正则化

逻辑回归的损失函数 线性回归的损失函数是平方损失。逻辑回归的损失函数是对数损失&#xff0c;定义如下&#xff1a; L o g L o s s ∑ ( x , y ) ∈ D − y log ⁡ ( y ′ ) − ( 1 − y ) log ⁡ ( 1 − y ′ ) LogLoss\sum_{(x,y)\in D}-y\log(y)-(1-y)\log(1-y) LogLoss…

漫谈与人类智能相关数学知识的不足之处

客观地说&#xff0c;没有数学就没有当前的大语言模型、多模态大模型&#xff0c;甚至压根就没有人工智能。对人工智能而言&#xff0c;数学就是“天”&#xff01;但是&#xff0c;对于人类智能而言&#xff0c;数学虽然起到了很重要的作用&#xff0c;同样也起到了阻碍作用&a…

Application为啥不能作为Dialog的context?

大家好&#xff0c;相信大家在使用Dialog时&#xff0c;都有一个非常基本的认知&#xff1a;就是Dialog的context只能是Activity&#xff0c;而不能是Application&#xff0c;不然会导致弹窗崩溃&#xff1a; 这个Exception几乎属于是每个Android开发初学者都会碰到的&#xff…

FFmpeg获取音视频流信息

文章目录 前言一、需求二、源码三、运行结果 前言 本文记录用 FFmpeg 获取视频流音频流的信息&#xff08;编码格式、分辨率、帧率、播放时长…&#xff09;&#xff0c;所用的工程基于上个博客编译成功的工程&#xff1a;使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c 一、需求…

扩展边界opencv

扩展图像的边缘&#xff08;如上边增加50像素&#xff09;通常是通过添加额外的像素行来实现的 使用cv2.copyMakeBorder函数 valueborder_color指定了边框的颜色 import cv2 import numpy as np# 读取图像 image cv2.imread(th.jpg)# 设置边框宽度 top_border_width 50 # …

序列模型(4)—— Scaling Laws

本文介绍 LLM 训练过程中重要的 Scaling Laws&#xff0c;这是一个经验规律&#xff0c;指出了固定训练成本&#xff08;总计算量FLOPs&#xff09; C C C 时&#xff0c;如何调配模型规模&#xff08;参数量&#xff09; N N N 和训练 Token 数据量 D D D&#xff0c;才能实现…

【Emgu.CV教程】4.3、无缝融合应用之SeamlessClone()

SeamlessClone()函数才是真正的无缝克隆&#xff0c;它可以将一张小一点的图片&#xff0c;复制到另一张大一点的图片中&#xff0c;并且复制的位置可以用户自己定义&#xff0c;先看一下它的函数介绍&#xff1a; public static void SeamlessClone(IInputArray src, // 输入…

【STM32】| 01——常用外设 | USART

系列文章目录 【STM32】| 01——常用外设 | USART 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. 基础理论1.1 并行通信和串行通信1.2 同步通信和异步通信1.3 单工/半双工/全双工1.4 电平信号(RS232/TTL)和差分信号(RS485)1.5 端口(COM) 2. 串口理论2.1 串口物理…

Android - CrashHandler 全局异常捕获器

官网介绍如下&#xff1a;Thread.UncaughtExceptionHandler (Java Platform SE 8 ) 用于线程因未捕获异常而突然终止时调用的处理程序接口。当线程由于未捕获异常而即将终止时&#xff0c;Java虚拟机将使用thread . getuncaughtexceptionhandler()查询该线程的UncaughtExceptio…

cisp难不难?cisp如何备考通过率高?

*CISP 全称为Certified Information Security Professional&#xff0c;是国际上广受欢迎的信息安全专业认证之一。 对于许多信息安全领域的从业者来说&#xff0c;CISP认证是他们职业生涯中的重要一步。那么&#xff0c;CISP难不难呢?如何备考通过率更高呢?接下来&#xf…

electron自定义窗口和右键菜单样式

前言 electron默认沿用系统UI&#xff0c;并没有提供很多接口供使用者定制样式&#xff0c;如果想要完全自定义的样式&#xff0c;目前我能想到的方案只能是通过前端自定义样式&#xff0c;然后通过进程通信来实现系统基础功能&#xff1a;最大/小化、关闭、拖动窗口等。 效果…
最新文章