1.需求/问题描述
发现云平台查看内存占用与实际内存占用不一致。
2.分析过程
在系统中获取虚拟机内存使用率目前主要有两种方式,一种是通过virsh dommemstat获取,另外一种是通过qga接口获取。由于之前修复界面虚拟机cpu使用率时为qga接口获取,因此主要从qga接口介入查询。
在qga接口中预留了查询vcpu使用率,内存使用率(used/total),网卡等信息查询。
通过上述代码定义,可以使用
virsh qemu-agent-command vm
'{"execute":"guest-band-info","arguments":{"order":"None"}}' --pretty查询到虚拟机vcpu、内存、网卡等相关信息。
在上述返回结果中,可以看到其中包括内存各项信息,有返回内存usage使用率信息,通过对比虚拟机内查询到的内存信息,如下所示
在对比qga返回结果与虚拟机内的内存信息后,qga返回used与系统内used不一致,该处used=系统内used+buff/cache 之和,计算内存使用率均正常。从此时可以判断出qemu源码中计算内存使用率正确。
3.分析结果
根据内存使用率计算方式,以下图为例,根据qga中提供的使用率计算
MemUsage=(used+buff/cache)/total
即:(5482+55706)/63939=0.9569,换算百分比为95.69%,与界面显示内存使用率一致,证明qga获取的内存使用率无误,qemu侧无需修改。
附:内存使用率
如上图,linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或服务。对于上述的情况,正确的解释是:linux的内存管理机制与windows的有所不同。linux的内存管理机制的思想主要是内存利用率最大化。内核会把剩余的内存申请为cached,而cached不属于free范畴。当系统运行时间较久,会发现cached很大,对于有频繁文件读写操作的系统,这种现象会更加明显。此时free的内存会非常小,但并不代表可用的内存小,当一个程序需要申请较大的内存时,如果free的内存不够,内核会把部分cached的内存回收,回收的内存再分配给应用程序。所以对于linux系统,可用于分配的内存不只是free的内存,还包括cached的内存(其实还包括buffers)。
各字段含义:
total:系统中总的物理内存量。
used:已被使用的内存量,这包括用于系统进程、应用程序和文件系统缓存的内存。
free:未被使用的内存量,这是未被分配给任何进程的空闲内存。
shared:被共享的内存量,这是多个进程共享的内存,如共享库或共享内存段。
buff/cache:用于缓存的内存量,这包括用于文件系统缓存(buffers)和磁盘缓存(cache)的内存。
available:可用内存量,这部分内存可以被应用程序申请使用
free或者top等查询内存信息均来自/proc/meminfo中的数据结构信息
其中MemAvailble:代表当前可用内存,MemFree只是尚未分配的内存,并不是所有可用的内存。有些已经分配掉的内存是可以回收再分配的。比如cache/buffer、slab都有一部分是可以回收的,这部分可回收的内存加上MemFree才是系统可用的内存,即MemAvailable。同时要注意,MemAvailable是内核使用特定的算法估算出来的,并不精确。