libvirt go使用
需求通常在云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如cpu的使用率、内存的使用率、磁盘io、网络io等基本信息。可以利用这些信息及时调整云平台环境中出现的一些问题,从而实现保证VM的正常运行。原理说到KVM管理工具,首先应该想到的就是libvirt,因为目前对KVM使用最为广泛的管理工具(应用程序接口)就是libvirt。Libvirt本身构
·
需求
通常在云环境中,为了保证云平台中虚拟机的正常运行,基本都需要这样一个功能,就是收集虚拟机的监控数据,比如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
更多推荐
已为社区贡献3条内容
所有评论(0)