需求

通常在云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如cpu的使用率、内存的使用率、磁盘io、网络io等基本信息。可以利用这些信息及时调整云平台环境中出现的一些问题,从而实现保证VM的正常运行。

原理

说到KVM管理工具,首先应该想到的就是libvirt,因为目前对KVM使用最为广泛的管理工具(应用程序接口)就是libvirt。Libvirt本身构建于一种抽象的概念上,它为受支持的虚拟机监控程序实现常用功能提供通用的API。Libvirt提供了操作KVM的原生层接口,可以实现对虚拟机的基本管理操作。Libvirt库用C实现,libvirt.org/go/libvirt就是基于libvirt API的golang语言绑定工具包,通过该包可以实现对VM日常管理和监控数据的获取

virsh命令

//查看帮助
[root@dev14-202 ~]# virsh  --help

//查看某个参数帮助
[root@dev14-202 ~]# virsh  list --help

//查看所有虚拟机
[root@dev14-202 ~]# virsh  list --all
 Id    Name                           State
----------------------------------------------------
 27    shengborun                     running
 28    X-ray0                         running
 -     generic                        shut off
 -     generic-2                      shut off

示例代码

通过libvirt库的go语言版本获取内存&CPU&磁盘信息

package main

import (
	"fmt"

	"libvirt.org/go/libvirt"
)

func main() {
	fmt.Println("main")
	vName := "shengborun"
	conn, err := libvirt.NewConnect("qemu:///system")
	if err != nil {
		fmt.Println("err", err)
		return
	}
	defer conn.Close()

	// 通过虚拟机名称获取其全部状态
	dob, err := conn.LookupDomainByName(vName)
	if err != nil {
		fmt.Println("err", err)
		return
	}
	dobs := make([]*libvirt.Domain, 0)
	dobs = append(dobs, dob)
	dstats, err := conn.GetAllDomainStats(dobs, 0x3FE, libvirt.CONNECT_GET_ALL_DOMAINS_STATS_ACTIVE)
	if err != nil {
		fmt.Println("err", err)
		return
	}
	fmt.Println("dstats", dstats)

	// 获取所有开启的虚拟机
	doms, err := conn.ListAllDomains(libvirt.CONNECT_LIST_DOMAINS_ACTIVE)
	if err != nil {
		fmt.Println("err", err)
	}
	fmt.Printf("%d running domains:\n", len(doms))
	for _, dom := range doms {
		name, err := dom.GetName()
		if err == nil {
			fmt.Printf("  %s\n", name)
		}
		if name != vName {
			continue
		}
		info, err := dom.GetInfo()
		fmt.Println("GetInfo", info, err)

		//内存利用率
		// get tag 4:剩余 & 5:总共
		meminfo, err := dom.MemoryStats(10, 0)
		fmt.Println("MemoryStats", meminfo, err)

		//磁盘利用率-错误值(都是最大值)
		diskinfo, err := dom.GetBlockInfo("hda", 0)
		fmt.Println("DiskStats", diskinfo, err)

		blockinfo, err := dom.BlockStats("hda")
		fmt.Println("BlockStats", blockinfo, err)

		//go版本不支持
		guestinfo, err := dom.GetGuestInfo(libvirt.DOMAIN_GUEST_INFO_DISKS, 0)
		fmt.Println("GetGuestInfo", guestinfo, err)

		//dom.GetCPUStats()

		dom.Free()
	}
}

运行结果

[root@dev14-202 xf]# ./main
main
dstats [{0xc00001a0f0 <nil> 0xc0000180c0 0xc000182000 [{true 1 true 255426290000000 true 0 false false false 0} {true 1 true 254730690000000 true 0 false false false 0} {true 1 true 256252940000000 true 0 false false false 0} {true 1 true 256985880000000 true 0 false false false 0}] [{true vnet1 true 463730831316 true 374389891 true 0 true 0 true 31193204405 true 163230349 true 0 true 0}] [{true hda false 0 true /img/shenborui.img true 5612365 true 153443550208 true 1082302480999 true 4825156 true 198678954496 true 1128580165176 true 2500891 true 2791494625571 false 0 true 103292866048 true 107374182400 true 107390828544}] <nil> <nil> <nil>}]
5 running domains:
  guestfs-n0ahsgobvhzpl0hj
  guestfs-25g102zflirduv76
  X-ray0
  shengborun
GetInfo &{1 8392704 8392704 4 1035293710000000} <nil>
MemoryStats [{6 8392704} {0 1312160} {1 3210408} {2 240301} {3 6159022712} {4 2950908} {5 8175488} {9 1641288341} {7 8442800}] <nil>
DiskStats &{107374182400 107390828544 107390828544} <nil>
BlockStats &{true 153443550208 true 5612365 false 0 true 198678954496 true 4825156 false 0 false 0 false 0 false 0} <nil>
GetGuestInfo <nil> virError(Code=3, Domain=0, Message='Function 'virDomainGetGuestInfo' not available in the libvirt library used during Go build')
  guestfs-kvxmpg5vksa4shu1

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐