前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >虚拟内存情况dommemstat分析

虚拟内存情况dommemstat分析

原创
作者头像
用户1935614
发布2021-01-26 17:33:50
1.5K0
发布2021-01-26 17:33:50
举报
文章被收录于专栏:计算相关内容

有同事问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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.背景
  • 2.Linux
  • 3.Windows
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档