云计算国产化之路 vnc登录 文件系统直通(virtio-9p) 扩展qemu接口 gpg WARNING 珍藏博客 虚拟内存情况dommemstat分析 免密码自动登录脚本 Linux网桥 测试网段IP占用情况 Linux 进程状态 systemc强制依赖 调试openstack ut uefi p2v 重做ubuntu内核 virsh创建虚拟机简介 virtio IO路径 虚拟化层升级后磁盘无法卸载卷 vmtouch使用 Taint flags 主机和虚拟机文件共享处理的几种方法 kvm分析工具 kvm中对磁盘的io cache 虚拟化不同导致的guestos中软件安装差异(未解决) 设备直通(PCI Assignment)到底是咋整的 virtio到底是咋整的 内核启动参数 虚拟化实时性提升(零)之配置步骤 中断虚拟化(pic)到底是咋整的 中断虚拟化(apic)到底是咋整的 Raid卡配置丢失导致服务器无法启动 tainted kernels cpu stuck for 23s问题分析 虚拟化实时性提升(一)之hostOS切换为强实时系统 内存虚拟化到底是咋整的 qemu-kvm中vcpu虚拟化到底是咋整的 风河虚拟化技术点分析 使用qga的好处 qemu迁移代码分析 虚拟机串口配置及其导出到主机pts和console.log System-based I/O vs. Raw I/O 虚拟机使用Hugepage(大页) 硬件辅助分页(hardware assisted paging) 修改centos7默认启动项目 virtio的工作流程——kernel中virtio-pci初始化(2) virtio的工作流程——qemu中virtio-backend初始化(1) qmp ceilometer取不到memory.usage指标 Virtio-Balloon超详细分析 slabtop输出 虚拟机磁盘cache导致的host os kernel崩溃 虚拟机cpu和memory性能优化测评 PCI配置空间(PCI Configuration Space) centos下网卡设备直通(VT-dpci passthrough)遇到的问题及其解决思路 libguestfs详解 yum卸载软件包及其依赖 通过原始Centos ISO来定制自己的ISO centos下网卡设备直通(VT-d,pci passthrough) (占位符)window虚拟机中拔盘如何通知到libvirt和qemu后端的 cirrus漏洞分析CVE-2017-2615 XSA-208 qcow2随笔 控制寄存器概览 ceilometer对接postgresql 解压initrd和vmlinuz qemu guest agent验证 QEMU升级指南(待续) ubuntu中kdump的配置 qemu(2.3)接口梳理 热迁移导致的FC存储场景下的multipath卷残留问题分析 virsh命令(4)secret,snapshot,pool,volume部分 virsh命令(3)之interface,filter,network virsh命令(2)monitor,host,nodedev部分 virsh命令(1)之domain部分 QEMU内存管理之FlatView模型(QEMU2.0.0) ovirt基于sanock的高可用(主机粒度HA) Sanlock防脑裂场景功能测试用例 gnocchi配置及与ceilometer对接指南 make patch for libvirt in centos centos使用sanlock指导 高可用nfs资料 ubuntu14中使用sanlock指导 LVM操作指南 sanlock相关功能验证流程汇总 make patch for libvirt in ubuntu libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7' not found gdb debug libvirt 基于ubuntu社区源码包编译libvirt compile libvirt(centos) No PCI buses available nfs lead to Linux halt nfs install and config anti-virus for cloud platform nova fetch image from glance(something about _base) token auth process ovs入门指南 virt software anti-virus something about ceilometer disk sample context interview questions openstack vm injection openstack Restful and RPC murano 概览 创建虚拟机流程(compute节点)之网络创建 创建虚拟机流程之compute_api之虚拟机实例填充之配额检测 创建虚拟机流程之compute_api之基本参数生成 创建虚拟机流程之compute_api 创建虚拟机流程(主) 创建虚拟机之image 创建虚拟机流程之准备网桥 创建虚拟机流程之virt 创建虚拟机流程之compute节点 CI/CD研发流程之工程创建 CI/CD研发流程之代码合入 CI/CD研发流程之UT(单元测试) 向openstack社区合入代码记 openstack/ceilometer/gnocchi杂谈 影子页表原理 mem_add(exec.c) qemu编译安装调试 openstack/ceilometer/gnocchi之Grafana简介 openstack wiki etcd openstack计量ceilometer openstack计费cloudKitty enventlet backdoor USB 安装VMWARE ESX pycharm设置指南 无法执行modprobe -a kvm-intel解决办法 QEMU配置项 网络不通小记 libvirt之XML(虚拟机定义文件) openstack-horizon 证书认证 ceilometer与ceph对接 openstack定时任务剖析(TODO) 服务器重启后mongodb进程无法启动 ubuntu14下新增openstack服务到service的导引 ERROR 1045(28000)-数据库连不上 Python两个内置函数—locals和globals unknown exit, hardware reason 31

ceilometer取不到memory.usage指标

2017年03月27日

背景知识

自研的DRS(均衡负载)服务基于虚拟机内存使用情况做均衡。
有同事说ceilometer的memory.usage取不到

历经重重否定,发现是个大乌龙,记之以自省。

ceilometer调用关系

memory.usage在ceilometer中是通过如下插件获取的:

memory.usage = ceilometer.compute.pollsters.memory:MemoryUsagePollster

根据ceilometer机制得知,相关指标的获取是调用get_samples方法

我们这里使用的是libvirt找到对应的实现driver
是调用memoryStats获取到返回值,根据available-unused得到的

根据libvirt.py中对应virsh命令可知,其实就是类似于virh的dommemstat

由于环境受限,只好本地virsh启动虚拟机验证,如下图可见没有对应的available

找个之前版本的环境验证,是有对应字段的

qemu版本过低?

由于之前版本是好的,其hostOS是Ubuntu14,对应的qemu是2.2
现在版本的hostOS是centos7,对应的qemu版本是1.5.3
首先怀疑qemu版本过低导致?

从libvirt代码分析起,直接调用到了虚拟化层对应的driver

我们这里虚拟化层是qemu,找到qemu_driver.c
对应方法转换为qemuDomainMemoryStats

在qemuDomainMemoryStats中看到获取想要信息的前提条件是virtio_balloon

先不管继续跟进qemuMonitorGetMemoryStats
最终跟到如下部分,向qemu发送guest-stats获取到的值

然后找到qemu代码,继续分析
virtio_balloon设备初始化的时候设置了guest-stats方法由balloon_stats_get_all方法承载

分析balloon_stats_get_all方法,如下,可见从对应数据结构中取出数据

答案是virtion_ballon的统计特性写入的,具体分析看本人这篇博文

分析到这里,我们拿qemu2.2和qemu1.5.3针对这块特性进行分析
一分析,还真不一样。
中间看见代码有重构反合等等

好,下面在qemu2.2的版本上virsh启动虚拟机验证
马蛋,还是不行,取不到所需的数据。

和镜像相关么?

分别取guestOS为centos和ubuntu测试,都获取不到所需数据

回归代码?

再次细读virtio_ballon的代码
通过如下方法设置一个周期

qemu-monitor-command 3 --pretty '{ "execute": "qom-set","arguments": { "path": "balloon0","property": "guest-stats-polling-interval", "value": 2 } }'

qemu-monitor-command 3 --pretty '{"execute":"qom-get","arguments":{"path":"balloon0","property": "guest-stats"}}'  

问题来了

这个guest-stats-polling-interval哪里设置的?
逆向从qemu带libvirt到nova(就不一一贴代码了)
可见,在nova的中_get_guest_config方法中补充了一个字段balloon.period

balloon.period的来源是CONF.libvirt.mem_stats_period_seconds

问题小结

为什么本地virsh启动的没有呢?
原因是virsh create的虚拟机没有填写ballon相关内容
libvirt给补了一个balloon设备,但是没有开始统计特性

也就是没有如下内容

问题溯源

为什么一开始,同事在正常nova创建的虚拟机,没有办法取到memory.usage呢?
经过确认其虚拟机是cirros镜像

windows呢?

windows装了balloon的驱动,上面讲的统计特性也开启了,依然采集不到相关信息

经过分析balloon驱动,发现windows下也是实现了的
但是为什么取不到呢?
经过分析发现除了上面步骤,需要在winodows的guest中启动blnsvr服务
这个服务由virtio_balloon提供