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這個變數就是以後我們要一直用到的,釋放函式:dom = virdomainlookupbyid(conn, 7);
virdomainfree(dom);cpu監控程式:
void list_info_domain(virdomainptr domain)解釋一下程式,首先virdomaingetinfo函式,傳入剛才我們得到的domain,另外乙個引數是要返回的virdomaininfo的結構體變數,其中包含了cpu個數,分配的時間,和分配的mem資訊。我們分別取了間隔為2妙的info資訊,使用裡面的info.cputime執行時間,把後一次減去前一次,然後再除以實際的gettimeofday函式得到host的cpu執行時間,得到乙個近似的百分比,反應的是此虛擬機器例項的cpu使用情況在整個host的cpu使用情況中的百分比。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);
}
磁碟監控:
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-02163e23f37dfiltering chains就是你在目錄下看到的許多filters的檔案。譬如有arp, 有dhcp, mac等filtering chains
在程式中使用libvirt
int list_network_domain(virdomainptr domain)這個函式很重要,其中將返回stats指標所指向的內容便是domain中各個網口的資訊。這裡有個問題,就是path的值,他是由domain中網絡卡的名字,不是eth0也不是em0等,而是要通過獲取domain的xml中網絡卡的inte***ce部分中這一部分中的vnet0,同理前面說得disk裡面的「vda」也是從這裡獲取,
所以你需要執行一下這個程式
char *xmldesc;返回的是字串指標指向了xml的內容,記住這個程式執行好需要free指標。xmldesc = virdomaingetxmldesc(dom, 0);
if ((fp = fopen(virdomaingetname(dom), "w")) == null)
fprintf(fp,xmldesc);
fclose(fp);
free(xmldesc);
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 ...