亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Collectd對(duì)KVM虛擬機(jī)內(nèi)存監(jiān)控的測(cè)試與優(yōu)化

        2016-05-31 17:50:43崔廣章杜程劉睿
        物聯(lián)網(wǎng)技術(shù) 2016年5期
        關(guān)鍵詞:準(zhǔn)確性

        崔廣章 杜程 劉睿

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

        關(guān)鍵詞:Collectd;KVM;內(nèi)存監(jiān)控;準(zhǔn)確性

        中圖分類號(hào):TP319 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2095-1302(2016)05-00-05

        0 引 言

        隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,各種云計(jì)算平臺(tái)也應(yīng)運(yùn)而生。國外有AbiCloud、Hadoop(Apache基金會(huì))、Eucalyptus 項(xiàng)目(加利福尼亞大學(xué))、MongoDB(10gen)、Enomalism彈性計(jì)算平臺(tái)等,國內(nèi)有阿里巴巴的阿里云、中國移動(dòng)的BigCloude-大云平臺(tái)、盛大云等。虛擬化是云計(jì)算平臺(tái)的基礎(chǔ),虛擬機(jī)的穩(wěn)定性直接影響到云計(jì)算平臺(tái)的性能,這就迫切需要一套能夠?qū)μ摂M機(jī)進(jìn)行實(shí)時(shí)監(jiān)控的系統(tǒng)。但是,目前還沒有一套針對(duì)該問題成熟的監(jiān)控系統(tǒng)方案,本文用Collectd對(duì)KVM(Kernel-based Virtual Machine,KVM)虛擬機(jī)進(jìn)行監(jiān)控。

        1 Collectd對(duì)KVM虛擬機(jī)監(jiān)控的測(cè)試

        1.1 關(guān)于Collectd

        Collectd是一個(gè)守護(hù)(daemon)進(jìn)程,通過調(diào)用Libvirt-API來周期性地收集系統(tǒng)的各項(xiàng)數(shù)據(jù),然后以一定的格式(比如以RRD形式)將數(shù)據(jù)進(jìn)行存儲(chǔ),這些數(shù)據(jù)可以用來找到當(dāng)前系統(tǒng)性能的瓶頸。

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

        圖1 Collectd通過Libvirt監(jiān)控虛擬機(jī)原理圖

        通過Collectd對(duì)KVM虛擬機(jī)進(jìn)行監(jiān)控的優(yōu)勢(shì)是:首先,Collectd只需要安裝在宿主機(jī)(Host)的底層,不必在虛擬機(jī)內(nèi)部安裝代理(Agent),這樣就避免了監(jiān)控程序?qū)μ摂M機(jī)的污染,使監(jiān)測(cè)到的虛擬機(jī)的各項(xiàng)數(shù)據(jù)更加精確;其次,由于監(jiān)控程序是安裝在宿主機(jī)的底層,用戶(虛擬機(jī)的使用者)沒有權(quán)限來關(guān)閉該監(jiān)控程序,這樣就避免了用戶將監(jiān)控程序關(guān)閉而造成的監(jiān)控系統(tǒng)監(jiān)控不到虛擬機(jī)問題的發(fā)生。

        1.2 測(cè)試環(huán)境

        本文通過兩臺(tái)DELL服務(wù)器部署Collectd進(jìn)行測(cè)試,一臺(tái)服務(wù)器上部署Collectd計(jì)算節(jié)點(diǎn),另一臺(tái)服務(wù)器部署Collectd控制節(jié)點(diǎn)。部署計(jì)算節(jié)點(diǎn)的服務(wù)器同時(shí)安裝KVM,并通過KVM在該服務(wù)器上創(chuàng)建10臺(tái)虛擬機(jī)。測(cè)試環(huán)境的詳細(xì)說明如表1所列。

        控制節(jié)點(diǎn)與計(jì)算節(jié)點(diǎn)配置文件如表2所列。

        表2 配置文件詳解

        IP 節(jié)點(diǎn)類型 關(guān)鍵配置項(xiàng)

        10.10.10.20 計(jì)算節(jié)點(diǎn) 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]; //創(chuàng)建只有一個(gè)元素的value_t結(jié)構(gòu)體數(shù)組

        value_list_t vl = VALUE_LIST_INIT; //創(chuàng)建并初始化一個(gè)value_list_t鏈表

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

        values[0].gauge = memory; //用內(nèi)存memory給結(jié)構(gòu)體數(shù)組values的0號(hào)元素的gauge賦值

        vl.values = values; //用結(jié)構(gòu)體數(shù)組給鏈表vl的values賦值

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

        sstrncpy (vl.type, “memory”, sizeof (vl.type)); //表明監(jiān)控指標(biāo)類型為內(nèi)存

        //表明監(jiān)控指標(biāo)為tags指明的監(jiān)控項(xiàng)

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

        plugin_dispatch_values (&vl); //將vl的數(shù)據(jù)傳給系統(tǒng)

        }

        場(chǎng)景函數(shù)詳解如下:

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

        virDomainInfo info;//定義一個(gè)虛擬機(jī)信息結(jié)構(gòu)體

        virVcpuInfoPtr vinfo = NULL;

        virDomainMemoryStatPtr minfo = NULL;//定義一個(gè)虛擬機(jī)內(nèi)存結(jié)構(gòu)體指針

        int status;

        int j;

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

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

        ……

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

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

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

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

        ……

        //給虛擬機(jī)內(nèi)存狀態(tài)結(jié)構(gòu)體指針minfo分配內(nèi)存

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

        if (minfo == NULL) {

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

        continue;

        }

        //調(diào)用函數(shù)virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats,

        unsigned int nr_stats, unsigned int flags)來給虛擬機(jī)內(nèi)存狀態(tài)指針minfo賦值并返回對(duì)應(yīng)的內(nèi)存狀態(tài)個(gè)數(shù)

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

        //將從函數(shù)virDomainMemoryStats(…)得到的狀態(tài)標(biāo)簽及對(duì)應(yīng)的內(nèi)存值傳給函數(shù)memory_stats_submit(…)

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

        }

        sfree (minfo);

        }

        虛擬機(jī)信息結(jié)構(gòu)體詳解如下所示:

        struct virDomainInfo {

        unsigned charstate;//虛擬機(jī)的運(yùn)行狀態(tài)

        unsigned longmaxMem;//虛擬機(jī)的最大內(nèi)存

        unsigned longmemory;//虛擬機(jī)的已用內(nèi)存

        unsigned shortnrVirtCpu;//虛擬機(jī)的虛擬CPU個(gè)數(shù)

        unsigned long longcpuTime;//虛擬機(jī)的納秒級(jí)時(shí)間片

        }

        虛擬機(jī)內(nèi)存狀態(tài)結(jié)構(gòu)體及結(jié)構(gòu)體指針詳解如下:

        typedef virDomainMemoryStatStruct * virDomainMemoryStatPtr

        struct virDomainMemoryStatStruct {

        int tag;//內(nèi)存項(xiàng)標(biāo)簽

        unsigned long long val;//對(duì)應(yīng)tag的內(nèi)存值

        }

        虛擬機(jī)內(nèi)存狀態(tài)函數(shù)詳解如下:

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

        virDomainMemoryStatPtr stats(虛擬機(jī)內(nèi)存狀態(tài)指針),

        unsigned int nr_stats(虛擬機(jī)狀態(tài)數(shù)),

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

        nr_stats個(gè)虛擬機(jī)內(nèi)存狀態(tài)會(huì)被對(duì)應(yīng)的虛擬機(jī)賦值,但該函數(shù)只返回目前Libvirt版本支持的數(shù)據(jù)。

        2.2 內(nèi)存監(jiān)控源碼優(yōu)化

        由對(duì)源碼的分析可知,在collectd/src/virt.c的源碼中,對(duì)內(nèi)存(總內(nèi)存除外)進(jìn)行監(jiān)控的關(guān)鍵函數(shù)見表3所列。

        表3 內(nèi)存監(jiān)控關(guān)鍵函數(shù)詳解

        函數(shù)原形 函數(shù)作用

        Int virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) 用指定的虛擬機(jī)給虛擬機(jī)信息結(jié)構(gòu)體指針賦值,從而得到虛擬機(jī)的總內(nèi)存

        Static void memory_submit (gauge_t memory(內(nèi)存值), virDomainPtr dom(虛擬機(jī)地址)) 將由函數(shù)Int virDomainGetInfo(…)得到的虛擬機(jī)總內(nèi)存及對(duì)應(yīng)虛擬機(jī)傳遞給系統(tǒng)(Collectd)

        Int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats,

        unsigned int nr_stats, unsigned int flags) 用虛擬機(jī)指針對(duì)應(yīng)的虛擬機(jī)給虛擬機(jī)內(nèi)存狀態(tài)結(jié)構(gòu)體指針對(duì)應(yīng)的結(jié)構(gòu)體賦值,并返回對(duì)應(yīng)虛擬機(jī)的內(nèi)存狀態(tài)個(gè)數(shù)

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

        將調(diào)用函數(shù)Int virDomainMemoryStats(…)得到的函數(shù)虛擬機(jī)內(nèi)存項(xiàng)目標(biāo)簽及對(duì)應(yīng)的內(nèi)存值傳遞給系統(tǒng)(Collectd)

        基于相關(guān)源碼分析,結(jié)合優(yōu)化目標(biāo),通過如下步驟進(jìn)行優(yōu)化:

        (1) 對(duì)collectd/src/virt.c中調(diào)用Lbvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數(shù)返回了幾個(gè)tag及判斷tag對(duì)應(yīng)的內(nèi)存鍵控制是否正確;

        (2) 在步驟(1)得到解決的前提下,本文再通過在collectd/src/virt.c中加入想要監(jiān)控和展示的相關(guān)內(nèi)存項(xiàng)的代碼來實(shí)現(xiàn)增加相關(guān)監(jiān)控項(xiàng)的優(yōu)化目標(biāo)。

        通過在表5場(chǎng)景函數(shù)詳解中增加打印函數(shù)將調(diào)用Libvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數(shù)返回的tag值并將對(duì)應(yīng)的內(nèi)存值打印出來,具體修改如下:

        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循環(huán)中添加文件打印函數(shù)來調(diào)用Libvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數(shù)返回的tag值并將對(duì)應(yīng)的內(nèi)存值打印出來

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

        FILE *fp;//定義一個(gè)文件描述符

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

        //將tag及對(duì)應(yīng)內(nèi)存值寫入test.txt文件

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

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

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

        }

        sfree (minfo);

        }

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

        圖3 打印輸出的tag值及對(duì)應(yīng)的內(nèi)存值

        圖3只是截取了test.txt中的一部分,因?yàn)閠ag:0、tag:7、tag:6是一個(gè)循環(huán),本文所示的圖3中只截取了眾多循環(huán)當(dāng)中的5個(gè)循環(huán)。

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

        3 結(jié) 語

        根據(jù)內(nèi)存監(jiān)控源碼優(yōu)化的分析,得出如下結(jié)果:

        (1)內(nèi)存監(jiān)控圖上的相關(guān)曲線之所以一直是直線,是因?yàn)檎{(diào)用Libvirt-API的int virDomainMemoryStats (virDomainPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats, unsigned int flags)函數(shù)取出的值都是一直不變的,并非因?yàn)閳D形展示或其他原因造成的;

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

        通過以上分析,本文得出結(jié)論:在Libvirt對(duì)KVM虛擬機(jī)內(nèi)存監(jiān)控的相關(guān)API功能得到實(shí)現(xiàn)與優(yōu)化之后,Collectd對(duì)KVM虛擬機(jī)的內(nèi)存監(jiān)控項(xiàng)目就能補(bǔ)全,監(jiān)控結(jié)果的準(zhǔn)確性就能得到保障。也就是說本文為不用在KVM虛擬機(jī)里安裝任何東西的情況下實(shí)現(xiàn)對(duì)其內(nèi)存進(jìn)行監(jiān)控找到了一種切實(shí)可行的方法。

        參考文獻(xiàn)

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

        [2]鄧文洋.虛擬化環(huán)境下的多機(jī)內(nèi)存優(yōu)化技術(shù)研究與實(shí)現(xiàn)[D].北京:首都師范大學(xué),2013.

        [3]杜煒.KVM客戶機(jī)主動(dòng)共享的內(nèi)存超量使用策略研究[D].杭州:杭州電子科技大學(xué),2013.

        [4]時(shí)衛(wèi)東.基于內(nèi)核的虛擬機(jī)的研究[D].長(zhǎng)春:吉林大學(xué),2011.

        [5]王春光.虛擬操作系統(tǒng)行為監(jiān)控技術(shù)的研究與實(shí)現(xiàn)[D].長(zhǎng)沙:國防科學(xué)技術(shù)大學(xué),2009.

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

        猜你喜歡
        準(zhǔn)確性
        突破從句易錯(cuò)點(diǎn)提高表達(dá)準(zhǔn)確性
        淺談如何提高建筑安裝工程預(yù)算的準(zhǔn)確性
        持續(xù)質(zhì)量改進(jìn)對(duì)手術(shù)器械供應(yīng)及時(shí)性與準(zhǔn)確性的影響
        理解語境與名句的關(guān)系,提高默寫的準(zhǔn)確性
        連鑄機(jī)提高大包鋼水稱重準(zhǔn)確性方法實(shí)踐
        山東冶金(2019年1期)2019-03-30 01:35:18
        為橋梁領(lǐng)域的示值準(zhǔn)確性護(hù)航
        中國公路(2017年11期)2017-07-31 17:56:31
        影響紫外在線監(jiān)測(cè)系統(tǒng)準(zhǔn)確性因子分析
        電子制作(2016年21期)2016-05-17 03:53:03
        海外項(xiàng)目高報(bào)價(jià)準(zhǔn)確性和低不可預(yù)見費(fèi)的探析
        美劇翻譯中的“神翻譯”:準(zhǔn)確性和趣味性的平衡
        提高食品檢驗(yàn)準(zhǔn)確性的主要控制因素
        食品界(2016年4期)2016-02-27 07:36:26
        成人国成人国产suv| 久久99久久99精品观看| 亚洲午夜精品国产一区二区三区| 国产在线观看午夜视频| 国产做国产爱免费视频| 久久亚洲精品ab无码播放| 欧美激情国产一区在线不卡| 美利坚合众国亚洲视频| 伊人久久大香线蕉av色婷婷色| 国产香蕉尹人在线观看视频| 亚洲欧美日韩国产精品网| 久久精品伊人久久精品| 国内永久福利在线视频图片| 色一情一乱一伦一区二区三区日本| 国产精品久久久久久久久免费观看| 日本黄色高清视频久久| 中文字幕久久波多野结衣av不卡| 黑人巨大无码中文字幕无码| 亚州无线国产2021| 亚洲国产天堂av成人在线播放| 久久久久99精品成人片欧美| 少妇装睡让我滑了进去| 久久亚洲日本免费高清一区| 亚洲av综合av国一区二区三区| 又粗又黑又大的吊av| 香蕉久久久久久久av网站| 亚洲AV无码乱码一区二区三区| 久久中文字幕亚洲综合| 亚洲精品成人av在线| 亚洲无毛片| 美女草逼视频免费播放| 久久久久人妻精品一区二区三区| 真实国产老熟女粗口对白| 中文精品久久久久中文| 国产一区二区三区十八区| 疯狂添女人下部视频免费| 亚洲精品国产综合一线久久| 少妇极品熟妇人妻高清| 欧美精品色婷婷五月综合| 国产av一区二区精品久久凹凸| 动漫av纯肉无码av在线播放|