999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Collectd對KVM虛擬機內存監控的測試與優化

2016-05-31 17:50:43崔廣章杜程劉睿
物聯網技術 2016年5期

崔廣章 杜程 劉睿

摘 要:研究旨在通過修改Collectd源碼來驗證其現有的內存監控項目數據的準確性,完善內存相關監控項。文章首先將Collectd進行部署,觀察其對KVM虛擬機內存監控的效果,然后通過對KVM虛擬機內存監控的源碼分析,驗證監控圖上展示的相關內存監控項目的數據準確性,并根據其結果決定修改源碼來完善相關內存監控項的可行性。通過文中的分析得出結論:只有在Libvirt對KVM虛擬機內存監控相關功能進行API優化之后,Collectd對KVM虛擬機的內存監控才能夠得到完善。從而為不用在KVM虛擬機里安裝任何東西的情況下實現對其內存的監控找到了一種切實可行的方法。

關鍵詞:Collectd;KVM;內存監控;準確性

中圖分類號:TP319 文獻標識碼:A 文章編號:2095-1302(2016)05-00-05

0 引 言

隨著互聯網技術的快速發展,各種云計算平臺也應運而生。國外有AbiCloud、Hadoop(Apache基金會)、Eucalyptus 項目(加利福尼亞大學)、MongoDB(10gen)、Enomalism彈性計算平臺等,國內有阿里巴巴的阿里云、中國移動的BigCloude-大云平臺、盛大云等。虛擬化是云計算平臺的基礎,虛擬機的穩定性直接影響到云計算平臺的性能,這就迫切需要一套能夠對虛擬機進行實時監控的系統。但是,目前還沒有一套針對該問題成熟的監控系統方案,本文用Collectd對KVM(Kernel-based Virtual Machine,KVM)虛擬機進行監控。

1 Collectd對KVM虛擬機監控的測試

1.1 關于Collectd

Collectd是一個守護(daemon)進程,通過調用Libvirt-API來周期性地收集系統的各項數據,然后以一定的格式(比如以RRD形式)將數據進行存儲,這些數據可以用來找到當前系統性能的瓶頸。

Libvirt是一套免費、開源的支持Linux主流虛擬化工具的C函數庫,其旨在為包括Xen在內的各種虛擬化工具提供一套方便、可靠的編程接口,支持與C、C++、Ruby、Python等多種主流開發語言的綁定。當前主流Linux平臺上默認的虛擬化管理工具virt-manager(圖形化)、virt-install(命令行模式)等均基于Libvirt開發而成。Libvirt庫是一種實現Linux虛擬化功能的Linux? API,它支持各種虛擬機監控程序,包括Xen和KVM以及QEMU和用于其他操作系統的一些虛擬產品。Collectd通過Libvirt監控虛擬機的原理圖如圖1所示。

圖1 Collectd通過Libvirt監控虛擬機原理圖

通過Collectd對KVM虛擬機進行監控的優勢是:首先,Collectd只需要安裝在宿主機(Host)的底層,不必在虛擬機內部安裝代理(Agent),這樣就避免了監控程序對虛擬機的污染,使監測到的虛擬機的各項數據更加精確;其次,由于監控程序是安裝在宿主機的底層,用戶(虛擬機的使用者)沒有權限來關閉該監控程序,這樣就避免了用戶將監控程序關閉而造成的監控系統監控不到虛擬機問題的發生。

1.2 測試環境

本文通過兩臺DELL服務器部署Collectd進行測試,一臺服務器上部署Collectd計算節點,另一臺服務器部署Collectd控制節點。部署計算節點的服務器同時安裝KVM,并通過KVM在該服務器上創建10臺虛擬機。測試環境的詳細說明如表1所列。

控制節點與計算節點配置文件如表2所列。

表2 配置文件詳解

IP 節點類型 關鍵配置項

10.10.10.20 計算節點 Hostname "compute1"

FQDNLookup true

Interval 10

Timeout 2

ReadThreads 5

LoadPlugin logfile

LoadPlugin syslog

LogLevel info

LoadPlugin cpu

LoadPlugin disk

LoadPlugin libvirt

LoadPlugin load

LoadPlugin memory

LoadPlugin network

LoadPlugin ping

LoadPlugin swap

PrintSeverity false

value_t values[1]; //創建只有一個元素的value_t結構體數組

value_list_t vl = VALUE_LIST_INIT; //創建并初始化一個value_list_t鏈表

init_value_list (&vl, dom); 用虛擬機dom給鏈表vl賦值

values[0].gauge = memory; //用內存memory給結構體數組values的0號元素的gauge賦值

vl.values = values; //用結構體數組給鏈表vl的values賦值

vl.values_len = 1; //給鏈表vl的values_len賦值為1

sstrncpy (vl.type, “memory”, sizeof (vl.type)); //表明監控指標類型為內存

//表明監控指標為tags指明的監控項

sstrncpy (vl.type_instance, tags[tag_index], sizeof (vl.type_instance));

plugin_dispatch_values (&vl); //將vl的數據傳給系統

}

場景函數詳解如下:

for (i = 0; i < nr_domains; ++i) {

virDomainInfo info;//定義一個虛擬機信息結構體

virVcpuInfoPtr vinfo = NULL;

virDomainMemoryStatPtr minfo = NULL;//定義一個虛擬機內存結構體指針

int status;

int j;

//調用virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)給info賦值

status = virDomainGetInfo (domains[i], &info);

……

cpu_submit (info.cpuTime, domains[i], “virt_cpu_total”);

//將虛擬機地址以及虛擬機的總內存信息傳給memory_submit (gauge_t memory(內存值), virDomainPtr dom(虛擬機地址))

memory_submit ((gauge_t) info.memory * 1024, domains[i]);

vinfo = malloc (info.nrVirtCpu * sizeof (vinfo[0]));

……

//給虛擬機內存狀態結構體指針minfo分配內存

minfo = malloc (VIR_DOMAIN_MEMORY_STAT_NR * sizeof (virDomainMemoryStatStruct));

if (minfo == NULL) {

ERROR (“virt plugin: malloc failed.”);

continue;

}

//調用函數virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats,

unsigned int nr_stats, unsigned int flags)來給虛擬機內存狀態指針minfo賦值并返回對應的內存狀態個數

status =virDomainMemoryStats (domains[i], minfo, VIR_DOMAIN_MEMORY_STAT_NR, 0);for (j = 0; j < status; j++) {

//將從函數virDomainMemoryStats(…)得到的狀態標簽及對應的內存值傳給函數memory_stats_submit(…)

memory_stats_submit ((gauge_t) minfo[j].val * 1024, domains[i], minfo[j].tag);

}

sfree (minfo);

}

虛擬機信息結構體詳解如下所示:

struct virDomainInfo {

unsigned charstate;//虛擬機的運行狀態

unsigned longmaxMem;//虛擬機的最大內存

unsigned longmemory;//虛擬機的已用內存

unsigned shortnrVirtCpu;//虛擬機的虛擬CPU個數

unsigned long longcpuTime;//虛擬機的納秒級時間片

}

虛擬機內存狀態結構體及結構體指針詳解如下:

typedef virDomainMemoryStatStruct * virDomainMemoryStatPtr

struct virDomainMemoryStatStruct {

int tag;//內存項標簽

unsigned long long val;//對應tag的內存值

}

虛擬機內存狀態函數詳解如下:

int virDomainMemoryStats (virDomainPtr dom(虛擬機指針),

virDomainMemoryStatPtr stats(虛擬機內存狀態指針),

unsigned int nr_stats(虛擬機狀態數),

unsigned int flags(官方推薦填0))

nr_stats個虛擬機內存狀態會被對應的虛擬機賦值,但該函數只返回目前Libvirt版本支持的數據。

2.2 內存監控源碼優化

由對源碼的分析可知,在collectd/src/virt.c的源碼中,對內存(總內存除外)進行監控的關鍵函數見表3所列。

表3 內存監控關鍵函數詳解

函數原形 函數作用

Int virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) 用指定的虛擬機給虛擬機信息結構體指針賦值,從而得到虛擬機的總內存

Static void memory_submit (gauge_t memory(內存值), virDomainPtr dom(虛擬機地址)) 將由函數Int virDomainGetInfo(…)得到的虛擬機總內存及對應虛擬機傳遞給系統(Collectd)

Int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats,

unsigned int nr_stats, unsigned int flags) 用虛擬機指針對應的虛擬機給虛擬機內存狀態結構體指針對應的結構體賦值,并返回對應虛擬機的內存狀態個數

static void memory_stats_submit (gauge_t memory, virDomainPtr dom, int tag_index)

將調用函數Int virDomainMemoryStats(…)得到的函數虛擬機內存項目標簽及對應的內存值傳遞給系統(Collectd)

基于相關源碼分析,結合優化目標,通過如下步驟進行優化:

(1) 對collectd/src/virt.c中調用Lbvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數返回了幾個tag及判斷tag對應的內存鍵控制是否正確;

(2) 在步驟(1)得到解決的前提下,本文再通過在collectd/src/virt.c中加入想要監控和展示的相關內存項的代碼來實現增加相關監控項的優化目標。

通過在表5場景函數詳解中增加打印函數將調用Libvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數返回的tag值并將對應的內存值打印出來,具體修改如下:

for (i = 0; i < nr_domains; ++i) {

virDomainInfo info;

virVcpuInfoPtr vinfo = NULL;

virDomainMemoryStatPtr minfo = NULL;

int status;

int j;

status = virDomainGetInfo (domains[i], &info);

……

status =virDomainMemoryStats (domains[i], minfo, VIR_DOMAIN_MEMORY_STAT_NR, 0);

if (status < 0) {

ERROR (“virt plugin: virDomainMemoryStats failed with status %i.”, status);

sfree (minfo);

continue;

}

//在下面的for循環中添加文件打印函數來調用Libvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數返回的tag值并將對應的內存值打印出來

for (j = 0; j < status; j++) {

FILE *fp;//定義一個文件描述符

fp=fopen(“/root/test.txt”,”a”);//在/root下打開一個可進行內容追加的test.txt文件

//將tag及對應內存值寫入test.txt文件

fprintf(fp,”tag:%d\t的memory值:%d\n”,minfo[j].tag,minfo[j].val);

fclose(fp);//將打開的文件關閉

memory_stats_submit ((gauge_t) minfo[j].val * 1024, domains[i], minfo[j].tag);

}

sfree (minfo);

}

除了添加數值打印函數外,還要在collectd/src/virt.c的頭文件中添加:#include 和 #include,然后將修改的源碼保存,對修改過的Collectd源碼包進行編譯安裝,安裝完成之后,將Collectd監控程序啟動后在/root目錄下生成test.txt文件,對test.txt進行查看的結果如圖3所示。

圖3 打印輸出的tag值及對應的內存值

圖3只是截取了test.txt中的一部分,因為tag:0、tag:7、tag:6是一個循環,本文所示的圖3中只截取了眾多循環當中的5個循環。

分析圖3可知,調用Libvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數返回的tag值只有0、7、6這三個,傳遞給函數static void memory_stats_submit (gauge_t memory, virDomainPtr dom, int tag_index)對應的tag是swap_in、rss、actual_balloon,與虛擬機內存監控圖上列出的一致,但是這三個tag值對應的內存值一直不變,這是虛擬機內存監控圖上相關監控項目一直是直線的根本原因。

3 結 語

根據內存監控源碼優化的分析,得出如下結果:

(1)內存監控圖上的相關曲線之所以一直是直線,是因為調用Libvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數取出的值都是一直不變的,并非因為圖形展示或其他原因造成的;

(2)調用Libvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數得到的tag值只有0、7、6三個而且都已經在內存監控圖上得到展示,所以目前無法修改源碼添加其他內存監控項。

通過以上分析,本文得出結論:在Libvirt對KVM虛擬機內存監控的相關API功能得到實現與優化之后,Collectd對KVM虛擬機的內存監控項目就能補全,監控結果的準確性就能得到保障。也就是說本文為不用在KVM虛擬機里安裝任何東西的情況下實現對其內存進行監控找到了一種切實可行的方法。

參考文獻

[1]湯儒,李秦偉.Openstack云環境中KVM虛擬機性能分析[J].微型機與應用,2013,32(23):94-96,100.

[2]鄧文洋.虛擬化環境下的多機內存優化技術研究與實現[D].北京:首都師范大學,2013.

[3]杜煒.KVM客戶機主動共享的內存超量使用策略研究[D].杭州:杭州電子科技大學,2013.

[4]時衛東.基于內核的虛擬機的研究[D].長春:吉林大學,2011.

[5]王春光.虛擬操作系統行為監控技術的研究與實現[D].長沙:國防科學技術大學,2009.

[6] libvirt部分API介紹[EB/OL].2015.06, http://www.bubuko.com/infodetail-903462.html

主站蜘蛛池模板: 老司机午夜精品网站在线观看| 久久亚洲黄色视频| 国产成人亚洲无吗淙合青草| 99re在线免费视频| 免费a在线观看播放| 免费无遮挡AV| 国产精品亚洲一区二区三区在线观看| 午夜福利在线观看成人| 91免费精品国偷自产在线在线| 91精品国产自产91精品资源| 亚洲无码在线午夜电影| 中国一级特黄大片在线观看| yjizz视频最新网站在线| 色偷偷av男人的天堂不卡| 午夜不卡福利| 国产在线日本| 91在线日韩在线播放| 国产精品9| 午夜a视频| 三级国产在线观看| 乱人伦99久久| 成人精品视频一区二区在线| 啪啪啪亚洲无码| 2021精品国产自在现线看| 青青青国产免费线在| 中文字幕1区2区| 国产亚洲美日韩AV中文字幕无码成人| 黄色网页在线观看| 区国产精品搜索视频| 久久精品日日躁夜夜躁欧美| 一级福利视频| 美女扒开下面流白浆在线试听| 久久黄色小视频| 精品视频免费在线| 无码丝袜人妻| 一区二区无码在线视频| 国产精品亚洲αv天堂无码| 久久91精品牛牛| 国产欧美专区在线观看| 国产香蕉在线| 91成人在线免费视频| 色欲不卡无码一区二区| 成人精品午夜福利在线播放| 无码精品国产dvd在线观看9久| 亚洲制服中文字幕一区二区| 中文国产成人久久精品小说| 久久国产高清视频| 国产精品亚洲日韩AⅤ在线观看| 热这里只有精品国产热门精品| 国产丰满大乳无码免费播放 | 欧美伊人色综合久久天天| 美女无遮挡拍拍拍免费视频| 国产精品专区第1页| 熟妇丰满人妻av无码区| 青草国产在线视频| 成人在线天堂| 欧美三级不卡在线观看视频| 亚洲欧美成人网| 无码啪啪精品天堂浪潮av| 亚洲va精品中文字幕| 国产一级妓女av网站| 色综合激情网| 免费在线a视频| 亚洲成A人V欧美综合天堂| 精品福利视频导航| 久久动漫精品| 亚洲综合极品香蕉久久网| 亚洲国产午夜精华无码福利| 91尤物国产尤物福利在线| 亚洲成a人在线播放www| 久久情精品国产品免费| 欧美高清视频一区二区三区| 中国特黄美女一级视频| 91一级片| 亚洲日韩精品无码专区97| 成人免费网站在线观看| 日韩欧美国产成人| 亚洲av无码久久无遮挡| 国产三级毛片| 亚洲av无码久久无遮挡| 国产一区二区三区在线观看视频| 国产午夜人做人免费视频|