虚拟内存情况dommemstat分析

2021-01-26 17:33:50 浏览数 (1)

有同事问dommemstat详细含义,读了下代码,记录如下

最难懂的是如下这几个字段: unused available usable

通读libvirt代码会发现,是调用的qemu的guest-stat方法

代码语言:javascript复制
if (!(cmd = qemuMonitorJSONMakeCommand("qom-get",
                                       "s:path", balloonpath,
                                       "s:property", "guest-stats",
                                       NULL)))

然后获取到值后封装返回

代码语言:javascript复制
GET_BALLOON_STATS(statsdata, "stat-swap-in",
                  VIR_DOMAIN_MEMORY_STAT_SWAP_IN, 1024);
GET_BALLOON_STATS(statsdata, "stat-swap-out",
                  VIR_DOMAIN_MEMORY_STAT_SWAP_OUT, 1024);
GET_BALLOON_STATS(statsdata, "stat-major-faults",
                  VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT, 1);
GET_BALLOON_STATS(statsdata, "stat-minor-faults",
                  VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT, 1);
GET_BALLOON_STATS(statsdata, "stat-free-memory",
                  VIR_DOMAIN_MEMORY_STAT_UNUSED, 1024);
GET_BALLOON_STATS(statsdata, "stat-total-memory",
                  VIR_DOMAIN_MEMORY_STAT_AVAILABLE, 1024);
GET_BALLOON_STATS(statsdata, "stat-available-memory",
                  VIR_DOMAIN_MEMORY_STAT_USABLE, 1024);
GET_BALLOON_STATS(data, "last-update",
                  VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE, 1);

其中libvirt中各个字段含义如下:

代码语言:javascript复制
/*
 * The amount of memory left completely unused by the system.  Memory that
 * is available but used for reclaimable caches should NOT be reported as
 * free.  This value is expressed in kB.
 */
VIR_DOMAIN_MEMORY_STAT_UNUSED          = 4,

/*
 * The total amount of usable memory as seen by the domain.  This value
 * may be less than the amount of memory assigned to the domain if a
 * balloon driver is in use or if the guest OS does not initialize all
 * assigned pages.  This value is expressed in kB.
 */
VIR_DOMAIN_MEMORY_STAT_AVAILABLE       = 5,
/*
 * How much the balloon can be inflated without pushing the guest system
 * to swap, corresponds to 'Available' in /proc/meminfo
 */
VIR_DOMAIN_MEMORY_STAT_USABLE          = 8,

qemu中hmp接口获取信息情况如下:


数据是从virtio-balloon的前端获取的,guest的kernel中

代码语言:javascript复制
unsigned long events[NR_VM_EVENT_ITEMS];
struct sysinfo i;
int idx = 0;
long available;

all_vm_events(events);
si_meminfo(&i);

available = si_mem_available();

update_stat(vb, idx  , VIRTIO_BALLOON_S_SWAP_IN,
			pages_to_bytes(events[PSWPIN]));
update_stat(vb, idx  , VIRTIO_BALLOON_S_SWAP_OUT,
			pages_to_bytes(events[PSWPOUT]));
update_stat(vb, idx  , VIRTIO_BALLOON_S_MAJFLT, events[PGMAJFAULT]);
update_stat(vb, idx  , VIRTIO_BALLOON_S_MINFLT, events[PGFAULT]);
update_stat(vb, idx  , VIRTIO_BALLOON_S_MEMFREE,
			pages_to_bytes(i.freeram));
update_stat(vb, idx  , VIRTIO_BALLOON_S_MEMTOT,
			pages_to_bytes(i.totalram));
update_stat(vb, idx  , VIRTIO_BALLOON_S_AVAIL,
			pages_to_bytes(available));

各个字段含义如下(注意qemu2.3中没有VIRTIO_BALLOON_S_AVAIL):

代码语言:javascript复制
#define VIRTIO_BALLOON_S_SWAP_IN  0   /* Amount of memory swapped in */
#define VIRTIO_BALLOON_S_SWAP_OUT 1   /* Amount of memory swapped out */
#define VIRTIO_BALLOON_S_MAJFLT   2   /* Number of major faults */
#define VIRTIO_BALLOON_S_MINFLT   3   /* Number of minor faults */
#define VIRTIO_BALLOON_S_MEMFREE  4   /* Total amount of free memory */
#define VIRTIO_BALLOON_S_MEMTOT   5   /* Total amount of memory */
#define VIRTIO_BALLOON_S_AVAIL    6   /* Available memory as in /proc */
#define VIRTIO_BALLOON_S_NR       7

总结(virsh命令中三个字段对应guestos的/proc/meminfo字段):

unused——>Memfree available->MemTotal usable->MemAvailable

其中内核中各字段含义如下:

MemTotal

系统从加电开始到引导完成,firmware/BIOS要保留一些内存,kernel本身要占用一些内存,最后剩下可供kernel支配的内存就是MemTotal。 这个值在系统运行期间一般是固定不变的。 可参阅解读DMESG中的内存初始化信息。

MemFree

表示系统尚未使用的内存。 [MemTotal-MemFree]就是已被用掉的内存。

MemAvailable

有些应用程序会根据系统的可用内存大小自动调整内存申请的多少,所以需要一个记录当前可用内存数量的统计值。 MemFree并不适用,因为MemFree不能代表全部可用的内存,系统中有些内存虽然已被使用但是可以回收的。 比如cache/buffer、slab都有一部分可以回收,所以这部分可回收的内存加上MemFree才是系统可用的内存,即MemAvailable。 /proc/meminfo中的MemAvailable是内核使用特定的算法估算出来的,要注意这是一个估计值,并不精确。


1.背景

基于虚拟机的气球设备(virio-balloon)采集Memory.usage指标 前提条件,需要guestOS中安装virio_balloon驱动。 (详细参考分析看这里)

采集周期通过nova中的CONF.libivrt.mem_stats_period_seconds设置,默认是10s

2.Linux

从源码看,该驱动在kernel 2.6.37以后已经正式进入内核主干版本 理论上内核大于上述版本都可以采集此指标

目前只验证了ubuntu14,centos7

注:cirros镜像由于其特殊性,无法采集到指标

3.Windows

在安装了virtio-balloon的基础上,需要开启blnsvr服务,这个服务由virtio_balloon提供。

开启方式如下: 进入到virio-balloon驱动目录下,也就是BLNSVR.EXE所在目录下 执行BLNSVR  -I

参考文献:

http://linuxperf.com/?p=142

0 人点赞