zz OpenStack中虛擬機器的監控

2021-09-08 21:42:31 字數 2962 閱讀 3914

ad:

虛擬化使用kvm,使用libvirt作為c api

基本思想:host負責執行程式,採集資料,額外一台伺服器作為server收集每台host的資料進行分析

程式介紹:

首先我們需要開啟乙個和hypervisor的連線,需要乙個virconnectptr的指標

virconnectopenreadonly(char *) 返回的就是這麼乙個指標。初始化程式例如:

void conn_init(char *ip, virconnectptr *conn) 

}

第二個引數是乙個指向virconnectptr變數的指標,這裡的p指向的是類似「qemu+ssh:的字串,10.0.0.1是你的host ip

關閉連線的函式

void conn_close(virconnectptr *conn)
現在我們有了乙個指向host的hypervisor的連線,我們可以用他來獲得host上跑的虛擬機器的情況

void list_id_domain(virconnectptr conn) 

}

這個函式使用上面得到的conn這個指標,列出host上跑的例項的id號

有了id號我們就可以獲取每個例項的詳細資訊,假設我有乙個id為7的虛擬機器例項:

virdomainptr dom = null;

dom = virdomainlookupbyid(conn, 7);

dom這個變數就是以後我們要一直用到的,釋放函式:

virdomainfree(dom);
cpu監控程式:

void list_info_domain(virdomainptr domain) 

sleep(interval);

virdomaingetinfo(domain, &info);

unsigned long long endcputime = info.cputime;

if (gettimeofday(&endtime, null) == -1)

cputime = (endcputime - startcputime)/1000;

realtime = 1000000 * (endtime.tv_sec - starttime.tv_sec) + (endtime.tv_usec - starttime.tv_usec);

cpuusage = cputime / (double)(realtime);

printf("\t\tstate is %d\n", info.state);

printf("\t\tvcpu is %d\n", info.nrvirtcpu);

printf("\t\tmaxmemory is %ld\n", info.maxmem/1024);

printf("\t\tmemory is %ld\n", info.memory/1024);

printf("\t\tcpuusage is %.2f%\n", cpuusage*100);

}

解釋一下程式,首先virdomaingetinfo函式,傳入剛才我們得到的domain,另外乙個引數是要返回的virdomaininfo的結構體變數,其中包含了cpu個數,分配的時間,和分配的mem資訊。我們分別取了間隔為2妙的info資訊,使用裡面的info.cputime執行時間,把後一次減去前一次,然後再除以實際的gettimeofday函式得到host的cpu執行時間,得到乙個近似的百分比,反應的是此虛擬機器例項的cpu使用情況在整個host的cpu使用情況中的百分比。

磁碟監控:

void list_disk_domain(virdomainptr domain)
磁碟使用情況的方法和cpu類似,這裡用到的是virdomainblockstats(domain, disk, &stats, size)這個函式,disk指向的字串這裡為「vda」,實際使用甚麼你要根據xml裡面的資訊

網路部份這裡我們要用到libvirt中的network filters

openstack例項的libvirt.xml在nova.conf中定義的例項目錄下,裡面有

...

...

filterref中包括了其他的filters,預設在/etc/libvirt/nwfilter目錄下

你也可以使用virsh管理工具檢視具體filter內容

# virsh nwfilter-dumpxml nova-instance-instance-00000007-02163e23f37d

filtering chains

filtering chains就是你在目錄下看到的許多filters的檔案。譬如有arp, 有dhcp, mac等

在程式中使用libvirt

int list_network_domain(virdomainptr domain)
這個函式很重要,其中將返回stats指標所指向的內容便是domain中各個網口的資訊。這裡有個問題,就是path的值,他是由domain中網絡卡的名字,不是eth0也不是em0等,而是要通過獲取domain的xml中網絡卡的inte***ce部分中這一部分中的vnet0,同理前面說得disk裡面的「vda」也是從這裡獲取,

所以你需要執行一下這個程式

char *xmldesc;

xmldesc = virdomaingetxmldesc(dom, 0);

if ((fp = fopen(virdomaingetname(dom), "w")) == null)

fprintf(fp,xmldesc);

fclose(fp);

free(xmldesc);

返回的是字串指標指向了xml的內容,記住這個程式執行好需要free指標。

via livemoon的部落格

專題:openstack簡介與入門指南彙總

openstack compute(nova)功能分析

以公司實際應用講解openstack到底是什麼(入門篇)

KVM巢狀虛擬化 在虛擬機器中建立虛擬機器

一般情況下,我們是無法在kvm虛擬機器裡面再去建立虛擬機器的,因為我們的kvm虛擬機器的cpu預設情況下並不支援虛擬化功能,對於inter的cpu來說,如果要支援虛擬化功能,必須要有乙個叫vmx的特性,以下是乙個物理伺服器的cpu資訊 在cpu特性 flags 中包含了vmx這個特性,說明這台伺服器...

centos7 kvm虛擬機器中開啟虛擬機器

1 檢視當前宿主機系統中是否支援。cat sys module kvm intel parameters nested y 結果為y表示當前的作業系統已經支援了巢狀虛擬化,使用跑虛擬化的程式直接使用就ok了 n 那當然就表示當前作業系統未配置巢狀虛擬化嘍2 如果你的結果為n,看下配置過程吧 vi e...

virtualbox虛擬機器 虛擬機器的網路

今天要測試ip多宿主 ip multihoming 即host和guest的兩個網絡卡分別接,host ping guest的ipv6不通。解決過程如下 命令輸出 ip addr 1 lo mtu 65536 qdisc noqueue state unknown link loopback 00 ...