劉世緣,李云春,,陳 晨,楊海龍
(1.北京航空航天大學(xué)計(jì)算機(jī)學(xué)院,北京 100191;2.北京航空航天大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,北京 100191)
大數(shù)據(jù)技術(shù)廣泛應(yīng)用于搜索、社交、金融、醫(yī)療和能源等諸多領(lǐng)域,當(dāng)前,全球數(shù)據(jù)量飛速增長(zhǎng),根據(jù)國(guó)際權(quán)威機(jī)構(gòu)Statista的統(tǒng)計(jì)和預(yù)測(cè),預(yù)計(jì)到2035年,全球數(shù)據(jù)產(chǎn)生量預(yù)計(jì)達(dá)到2 142 ZB。以往應(yīng)用程序可以使用傳統(tǒng)數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),但使用傳統(tǒng)數(shù)據(jù)庫(kù)的存儲(chǔ)方式已很難滿足大數(shù)據(jù)應(yīng)用的需求[1],因此研究人員設(shè)計(jì)了一些可以解決大數(shù)據(jù)存儲(chǔ)問(wèn)題的系統(tǒng)和解決方案。例如,Hadoop分布式文件系統(tǒng)HDFS(Hadoop Distributed File System)[2]、GlusterFS[3]和Ceph[4]等。大數(shù)據(jù)應(yīng)用從這些分布式文件系統(tǒng)中讀寫(xiě)數(shù)據(jù),從而實(shí)現(xiàn)對(duì)大量數(shù)據(jù)的分析處理,這也表明分布式文件系統(tǒng)的存儲(chǔ)性能會(huì)直接影響大數(shù)據(jù)應(yīng)用程序的性能,使得分布式文件系統(tǒng)處于十分重要的位置。通過(guò)對(duì)分布式文件系統(tǒng)進(jìn)行性能評(píng)測(cè),可以指導(dǎo)大數(shù)據(jù)開(kāi)發(fā)人員分析及定位大數(shù)據(jù)應(yīng)用性能瓶頸,提高數(shù)據(jù)利用率。因此,對(duì)分布式文件系統(tǒng)進(jìn)行性能分析和評(píng)測(cè),進(jìn)而優(yōu)化分布式存儲(chǔ)以及大數(shù)據(jù)應(yīng)用的性能,具有重要的研究和應(yīng)用意義。
分布式文件系統(tǒng)通常利用多個(gè)節(jié)點(diǎn)來(lái)提高系統(tǒng)的吞吐量,保證系統(tǒng)的高可用,實(shí)現(xiàn)數(shù)據(jù)容錯(cuò),這增加了對(duì)分布式文件系統(tǒng)進(jìn)行性能評(píng)測(cè)及分析的難度。在以往的工作中,通常使用基準(zhǔn)測(cè)試的方式來(lái)對(duì)不同大數(shù)據(jù)框架進(jìn)行性能評(píng)測(cè)[5],或者采用插樁并分析軌跡(trace)文件的方式對(duì)分布式文件系統(tǒng)進(jìn)行性能分析。這2種方法采用的分析角度不同,并沒(méi)有形成合理的評(píng)測(cè)體系來(lái)評(píng)價(jià)大數(shù)據(jù)分布式存儲(chǔ)系統(tǒng)。同時(shí),以往的性能評(píng)測(cè)方法僅針對(duì)分布式文件系統(tǒng)本身進(jìn)行測(cè)試分析,而大數(shù)據(jù)應(yīng)用與大數(shù)據(jù)基準(zhǔn)測(cè)試程序?qū)Ψ植际轿募到y(tǒng)的使用模式并不相同。
針對(duì)上述背景及存在的問(wèn)題,本文提出一種主動(dòng)測(cè)試與被動(dòng)測(cè)試相結(jié)合的大數(shù)據(jù)存儲(chǔ)系統(tǒng)性能評(píng)測(cè)體系結(jié)構(gòu)。在主動(dòng)性能評(píng)測(cè)方面,對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)主動(dòng)發(fā)起性能測(cè)試,分析大數(shù)據(jù)存儲(chǔ)系統(tǒng)的基準(zhǔn)性能指標(biāo),從應(yīng)用層、分布式文件系統(tǒng)層和基礎(chǔ)IO層得出大數(shù)據(jù)存儲(chǔ)系統(tǒng)的基準(zhǔn)性能。在被動(dòng)性能評(píng)測(cè)方面,通過(guò)分析運(yùn)行在大數(shù)據(jù)存儲(chǔ)系統(tǒng)之上的大數(shù)據(jù)應(yīng)用,分析大數(shù)據(jù)應(yīng)用程序低效的原因,并根據(jù)大數(shù)據(jù)應(yīng)用程序不同的低效表現(xiàn),從低效任務(wù)、低效算子和低效函數(shù)3個(gè)層次對(duì)運(yùn)行在大數(shù)據(jù)存儲(chǔ)系統(tǒng)之上的大數(shù)據(jù)應(yīng)用的性能瓶頸進(jìn)行分析。本文依據(jù)提出的大數(shù)據(jù)存儲(chǔ)系統(tǒng)性能評(píng)測(cè)方法體系結(jié)構(gòu)對(duì)HDFS進(jìn)行了性能評(píng)測(cè)分析,從不同層次給出了分析結(jié)果。
對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行性能分析在業(yè)界有著廣泛的研究,但國(guó)內(nèi)對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)的性能分析主要停留在應(yīng)用配置層面和資源監(jiān)控層面,缺少對(duì)存儲(chǔ)系統(tǒng)的多層次、全面的性能分析方法。文獻(xiàn)[6]認(rèn)為Hadoop的應(yīng)用程序性能主要由4個(gè)因素決定:Hadoop執(zhí)行的應(yīng)用程序、應(yīng)用程序的輸入、Hadoop集群的資源和Hadoop的配置參數(shù),其中,應(yīng)用程序無(wú)法進(jìn)行自動(dòng)優(yōu)化,數(shù)據(jù)輸入也無(wú)法優(yōu)化,Hadoop的集群資源無(wú)法改變,只有Hadoop配置是可以優(yōu)化的,所以作者只考慮了Hadoop配置的影響。文獻(xiàn)[7]對(duì)Spark低效算子進(jìn)行了研究,雖然通過(guò)插樁方式得到了Spark算子粒度的性能信息,但并未分析低效算子產(chǎn)生的原因。
而大多數(shù)的國(guó)外研究則是對(duì)存儲(chǔ)系統(tǒng)進(jìn)行細(xì)粒度的分析,例如面向性能事件的插樁工具,Magpie[8]和Dapper[9]都需要對(duì)源代碼修改并進(jìn)行預(yù)插樁后得到性能軌跡數(shù)據(jù)。XRay[10]是Google提出的一個(gè)函數(shù)調(diào)用軌跡分析系統(tǒng),可以輸出循環(huán)計(jì)數(shù)、時(shí)間戳和足夠的元數(shù)據(jù)。另外,文獻(xiàn)[5,11]對(duì)大數(shù)據(jù)系統(tǒng)的基準(zhǔn)測(cè)試進(jìn)行了較為詳細(xì)的綜述,但均為大數(shù)據(jù)框架具體的性能指標(biāo)的采集及評(píng)測(cè)。文獻(xiàn)[12]雖然對(duì)現(xiàn)有的基準(zhǔn)測(cè)試工具的特點(diǎn)進(jìn)行了對(duì)比分析,但仍未提出對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行性能評(píng)測(cè)的體系。
上述研究雖然對(duì)具體的性能評(píng)測(cè)方式給予了詳盡的分析,但仍缺少對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)性能評(píng)測(cè)體系的研究。為此,本文面向大數(shù)據(jù)存儲(chǔ)系統(tǒng),在細(xì)粒度的性能分析基礎(chǔ)上,構(gòu)建了一種多層次的主動(dòng)與被動(dòng)相結(jié)合的大數(shù)據(jù)存儲(chǔ)系統(tǒng)性能評(píng)測(cè)體系結(jié)構(gòu),來(lái)對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行多角度的測(cè)試,為基于大數(shù)據(jù)存儲(chǔ)系統(tǒng)的大數(shù)據(jù)應(yīng)用開(kāi)發(fā)人員提供全面的性能評(píng)測(cè)方案與指導(dǎo)。

Figure 1 A storage system evaluation architecture with active & passive performance evaluation methods for big data applications
為了針對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)形成系統(tǒng)的評(píng)測(cè)方法及評(píng)測(cè)理論,本文提出了主動(dòng)測(cè)試與被動(dòng)測(cè)試相結(jié)合的、面向大數(shù)據(jù)應(yīng)用特性的存儲(chǔ)系統(tǒng)性能評(píng)測(cè)體系結(jié)構(gòu),如圖 1所示。
在主動(dòng)性能評(píng)測(cè)方法方面,本文可以在應(yīng)用層、分布式文件系統(tǒng)層和基礎(chǔ)IO層對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行多層次的性能基準(zhǔn)測(cè)試,為測(cè)試人員提供全面、統(tǒng)一的基準(zhǔn)測(cè)試程序。通過(guò)多層次主動(dòng)評(píng)測(cè)方法,對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)主動(dòng)發(fā)起性能測(cè)試,可以了解大數(shù)據(jù)存儲(chǔ)系統(tǒng)的基本性能信息。本文對(duì)應(yīng)用層的經(jīng)典領(lǐng)域、搜索引擎、機(jī)器學(xué)習(xí)、圖計(jì)算、數(shù)學(xué)領(lǐng)域和數(shù)據(jù)查詢共6個(gè)領(lǐng)域,超過(guò)20個(gè)應(yīng)用進(jìn)行大數(shù)據(jù)存儲(chǔ)系統(tǒng)的性能測(cè)試。在分布式文件系統(tǒng)層,本文集成了開(kāi)源測(cè)試工具,形成統(tǒng)一的程序入口和輸出報(bào)告。在基礎(chǔ)IO層,可以針對(duì)具體的存儲(chǔ)設(shè)備進(jìn)行隨機(jī)寫(xiě)、順序?qū)?、隨機(jī)讀和順序讀測(cè)試。
在被動(dòng)性能評(píng)測(cè)方法方面,本文關(guān)注大數(shù)據(jù)存儲(chǔ)系統(tǒng)的重要性能指標(biāo)[12],并將系統(tǒng)性能指標(biāo)依據(jù)特征劃分為4類(lèi),即離散特征、數(shù)值特征、資源特征和時(shí)間特征。應(yīng)用在存儲(chǔ)系統(tǒng)上運(yùn)行時(shí)會(huì)產(chǎn)生軌跡(trace)文件,利用合適的分析方法分析軌跡文件可以定位程序的性能瓶頸。本文利用課題組前期工作ASTracer[13]中的自適應(yīng)采樣模塊對(duì)分布式存儲(chǔ)系統(tǒng)進(jìn)行動(dòng)態(tài)采樣率的采樣。對(duì)采集到的軌跡文件進(jìn)行數(shù)據(jù)特征的提取,并定義低效行為,對(duì)采集到的任務(wù)信息、算子信息、函數(shù)信息通過(guò)前期工作中的BigRoot[14]、SparkOT[15]和ASTracer[13]分別進(jìn)行低效任務(wù)、低效算子和低效函數(shù)定位。
為了對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行完整的性能評(píng)測(cè),形成完整的性能評(píng)測(cè)方法體系結(jié)構(gòu),在本文提出的主動(dòng)性能評(píng)測(cè)方法中,需要實(shí)現(xiàn)如表 1所示的多層次、多領(lǐng)域的性能測(cè)試。
目前業(yè)界存在多種多樣的性能評(píng)測(cè)軟件,但一些大數(shù)據(jù)基準(zhǔn)測(cè)試程序集的測(cè)試程序分類(lèi)不夠準(zhǔn)確,缺少統(tǒng)一的配置方式,測(cè)試結(jié)果獲取困難,本文對(duì)目前廣泛使用的基準(zhǔn)測(cè)試程序進(jìn)行整合開(kāi)發(fā)。在本文提出的主動(dòng)性能評(píng)測(cè)方法中,需要提供多層次的測(cè)試方法選擇、測(cè)試程序配置、測(cè)試數(shù)據(jù)生成和測(cè)試結(jié)果分析方法。具體需要實(shí)現(xiàn)的方法有:
(1) 列出基準(zhǔn)測(cè)試程序及其相關(guān)說(shuō)明??梢酝ㄟ^(guò)程序直接獲取應(yīng)用列表、應(yīng)用領(lǐng)域?qū)?yīng)的基準(zhǔn)測(cè)試程序列表,以及每個(gè)測(cè)試程序的功能描述。
(2) 提供測(cè)試數(shù)據(jù)生成和任務(wù)運(yùn)行的配置參數(shù)輸入功能。根據(jù)所選的測(cè)試程序,給出測(cè)試程序數(shù)據(jù)生成和任務(wù)運(yùn)行的輸入配置參數(shù)的幫助。
(3) 測(cè)試數(shù)據(jù)生成。提供基準(zhǔn)測(cè)試數(shù)據(jù)生成入口,為相應(yīng)的測(cè)試功能生成所需測(cè)試數(shù)據(jù)。
(4) 測(cè)試結(jié)果分析。獲取任務(wù)原始信息并進(jìn)行處理,提供任務(wù)運(yùn)行過(guò)程中的信息以及測(cè)試結(jié)果。

Table 1 Evaluation layers and fields of active performance evaluation method
多層次多領(lǐng)域的主動(dòng)性能評(píng)測(cè)可以為大數(shù)據(jù)存儲(chǔ)系統(tǒng)提供全面的性能指標(biāo),在應(yīng)用層,應(yīng)用領(lǐng)域的選擇能夠反映大數(shù)據(jù)系統(tǒng)基準(zhǔn)測(cè)試程序集的應(yīng)用方向,提供大數(shù)據(jù)應(yīng)用在不同領(lǐng)域的性能表現(xiàn),對(duì)于大數(shù)據(jù)Spark程序,可以統(tǒng)計(jì)Spark程序的運(yùn)行時(shí)間,以及在當(dāng)前存儲(chǔ)系統(tǒng)上運(yùn)行時(shí)系統(tǒng)IO、CPU、內(nèi)存等性能變化軌跡,存儲(chǔ)系統(tǒng)的讀寫(xiě)速率、IOPS等性能參數(shù)。在分布式文件系統(tǒng)層,提供當(dāng)前運(yùn)行的大數(shù)據(jù)存儲(chǔ)系統(tǒng)負(fù)載能力以及吞吐量、操作延遲等性能指標(biāo)。在基礎(chǔ)IO層,提供所用硬件設(shè)備的物理性能指標(biāo)。
通過(guò)使用主動(dòng)性能評(píng)測(cè)方法,可以為大數(shù)據(jù)存儲(chǔ)系統(tǒng)提供基準(zhǔn)的性能測(cè)試參數(shù),以及通用應(yīng)用在大數(shù)據(jù)存儲(chǔ)系統(tǒng)上的性能表現(xiàn)。
本文提出的基于被動(dòng)測(cè)量的大數(shù)據(jù)存儲(chǔ)系統(tǒng)性能評(píng)測(cè)方法BDSProf主要包括大數(shù)據(jù)程序低效任務(wù)評(píng)測(cè)技術(shù)、大數(shù)據(jù)程序低效算子評(píng)測(cè)技術(shù)和大數(shù)據(jù)程序低效函數(shù)評(píng)測(cè)技術(shù)。
被動(dòng)性能測(cè)評(píng)方法的核心思想是利用ASTracer[13]中的自適應(yīng)采樣模塊對(duì)分布式存儲(chǔ)系統(tǒng)進(jìn)行采樣率動(dòng)態(tài)變化的采樣,收集大數(shù)據(jù)程序在存儲(chǔ)系統(tǒng)上運(yùn)行時(shí)產(chǎn)生的trace文件,對(duì)采集到的trace文件進(jìn)行數(shù)據(jù)特征提取,并定義低效行為。最終可以分別進(jìn)行低效任務(wù)、低效算子和低效函數(shù)定位。
3.2.1 大數(shù)據(jù)程序低效任務(wù)評(píng)測(cè)技術(shù)
Spark將一個(gè)階段劃分為多個(gè)任務(wù),如果某些任務(wù)慢于同一階段中的其他任務(wù),整個(gè)應(yīng)用程序的執(zhí)行會(huì)因這些任務(wù)(也稱為慢任務(wù))而變慢。這些慢任務(wù)會(huì)顯著影響整個(gè)應(yīng)用程序的執(zhí)行速度。但是,傳統(tǒng)的性能監(jiān)控工具如Ganglia[16]和Nagios[17],雖然仍然是大型分布式計(jì)算系統(tǒng)所采用的主要性能檢測(cè)工具,然而其粗粒度的系統(tǒng)運(yùn)行數(shù)據(jù)展示無(wú)法為具體應(yīng)用的分析提供所需的細(xì)粒度事件信息,不能有效地挖掘慢任務(wù)背后的原因并進(jìn)行有針對(duì)性的改進(jìn)。
低效任務(wù)評(píng)測(cè)技術(shù)著眼于應(yīng)用層面分析,采集被廣泛采用的系統(tǒng)特征,包括CPU、IO和網(wǎng)絡(luò)流量等資源占用特征以及數(shù)據(jù)局部性、讀寫(xiě)數(shù)據(jù)量、混洗讀寫(xiě)數(shù)據(jù)量、JVM(Java Virtual Machine)垃圾收集時(shí)間、任務(wù)序列化和反序列化時(shí)間等應(yīng)用特征。評(píng)測(cè)過(guò)程使用Linux采樣工具收集系統(tǒng)資源占用信息,采樣工具會(huì)在Spark啟動(dòng)時(shí),自動(dòng)開(kāi)始采樣,記錄采樣開(kāi)始時(shí)間戳,每秒鐘搜集一次系統(tǒng)資源占用信息,寫(xiě)入日志,當(dāng)Spark應(yīng)用程序結(jié)束運(yùn)行時(shí),調(diào)度器在集群各個(gè)節(jié)點(diǎn)上終止采樣進(jìn)程,然后聚合集群各個(gè)節(jié)點(diǎn)的采樣日志,通過(guò)和Spark任務(wù)執(zhí)行時(shí)間進(jìn)行對(duì)比,就可以得到任務(wù)運(yùn)行時(shí)的資源占用情況。應(yīng)用特征則是從Spark日志文件中抽取,反映了慢任務(wù)產(chǎn)生的內(nèi)部原因,如數(shù)據(jù)傾斜、數(shù)據(jù)局部性、JVM垃圾搜集、任務(wù)序列化和反序列化、數(shù)據(jù)本地性等。運(yùn)用數(shù)學(xué)統(tǒng)計(jì)的方法,從以上特征中,找出根原因影響程序運(yùn)行的規(guī)律,從而可反向推算根原因出現(xiàn)的時(shí)刻。
(1)數(shù)據(jù)特征提取。
采用Linux采樣工具收集系統(tǒng)信息,包括iostat、mpstat和sar。利用式(1)~式(3)分別計(jì)算系統(tǒng)資源占用特征[14]:
(1)
(2)
(3)
其中,user_timet是指t時(shí)間內(nèi)用戶占用的 CPU 時(shí)間,total_timet是指t時(shí)間內(nèi)總的CPU時(shí)間,IO_timet是指t時(shí)間內(nèi)IO占用的時(shí)間,bytes_sendt是指t時(shí)間內(nèi)網(wǎng)卡發(fā)送的數(shù)據(jù)量,bytes_receivedt是指t時(shí)間內(nèi)網(wǎng)卡接收的數(shù)據(jù)量。
(2)根原因分析方法。
特征分為4類(lèi),包括離散特征、數(shù)值特征、資源特征和時(shí)間特征,本文針對(duì)不同的特征提出了不同的分析方法。資源特征包括CPU、IO和網(wǎng)絡(luò)特征,屬于數(shù)值特征的一個(gè)特例,由于需要排除應(yīng)用自身造成的假陽(yáng)性(FP),所以要有特殊的約束條件。時(shí)間特征包括任務(wù)序列化和反序列時(shí)間、垃圾搜集時(shí)間,也是數(shù)值特征的一個(gè)特例,需要排除該特征雖然有波動(dòng)但是相比于任務(wù)執(zhí)行時(shí)間可以忽略不計(jì)的情況。對(duì)于數(shù)值特征,當(dāng)滿足式(4)中的全部條件時(shí),則認(rèn)為它是根原因特征。對(duì)于資源占用特征,使用邊緣檢測(cè)(Edge Detection)[14]的方法來(lái)過(guò)濾由任務(wù)本身導(dǎo)致的高資源占用率的情況。從數(shù)學(xué)的角度來(lái)講,如果任務(wù)滿足式(5)中的全部條件,那么就認(rèn)為高資源占用率是由任務(wù)本身引起的。數(shù)據(jù)本地性是本文唯一考慮的離散特征。如果局部性值為2并且滿足式(6)中的條件,則將局部性作為根原因[14]。
F>global_quantileλq,
F>mean(Fpeer)λq
(4)


(5)
(6)

3.2.2 大數(shù)據(jù)程序低效算子評(píng)測(cè)技術(shù)
該技術(shù)對(duì)Standalone模式下運(yùn)行的Spark大數(shù)據(jù)應(yīng)用程序的性能數(shù)據(jù)進(jìn)行采集,使用采集到的數(shù)據(jù)分析性能瓶頸,最終通過(guò)可視化展示的形式向Spark大數(shù)據(jù)程序開(kāi)發(fā)人員提供程序運(yùn)行時(shí)的各層系統(tǒng)性能軌跡、程序運(yùn)行時(shí)事件、Straggler瓶頸任務(wù)的檢測(cè)分析,以及性能熱點(diǎn)算子的檢測(cè)分析服務(wù)。
在Spark的圖依賴關(guān)系中,如果一個(gè)彈性分布式數(shù)據(jù)集RDD(Resilient Distributed Dataset)的分區(qū)依賴于父RDD的多個(gè)分區(qū),Spark混洗數(shù)據(jù)之前需要等待父RDD所有分區(qū)完成計(jì)算,Spark據(jù)此將應(yīng)用程序劃分成多個(gè)階段。但是,如果一個(gè)RDD只依賴父RDD的一個(gè)分區(qū),就無(wú)需等待別的分區(qū)完成計(jì)算,而本文主要分析這種情況下算子的低效行為。這種算子粒度的低效行為比應(yīng)用粒度的低效任務(wù)更為復(fù)雜,低效算子不僅要考慮算子相對(duì)于其他算子執(zhí)行時(shí)間的長(zhǎng)短,還要考慮算子自身的執(zhí)行時(shí)間和算子所在任務(wù)的執(zhí)行時(shí)間。
(1)低效算子定義及評(píng)價(jià)。
為了定位低效算子,本文為每個(gè)算子賦予一個(gè)低效算子評(píng)分,然后將低效評(píng)分較高的算子作為低效算子。本文采用算子評(píng)分OG(Operator Grade)的方法[18]來(lái)對(duì)Spark框架中的低效算子進(jìn)行定位,在計(jì)算出每個(gè)算子相應(yīng)的算子評(píng)分之后,從中選擇評(píng)分較高的算子作為低效算子,并進(jìn)行后續(xù)的優(yōu)化處理。本文主要考慮以下幾個(gè)評(píng)分原則:
① 算子實(shí)例的執(zhí)行時(shí)間差異很大,執(zhí)行時(shí)間較長(zhǎng)的算子實(shí)例應(yīng)該分配較高的分?jǐn)?shù)。
② 在關(guān)鍵流水線優(yōu)化后,其他算子流水線有可能會(huì)成為新的關(guān)鍵流水線,因此,應(yīng)該為執(zhí)行時(shí)間較長(zhǎng)的算子流水線中的算子實(shí)例分配較高的分?jǐn)?shù)。
③ 算子實(shí)例的優(yōu)化潛力也應(yīng)該被考慮在內(nèi),一般來(lái)說(shuō),相比于同階算子執(zhí)行時(shí)間更長(zhǎng)的算子實(shí)例具有更多優(yōu)化潛力,應(yīng)該被分配較高的分?jǐn)?shù)。
為了滿足第1個(gè)原則,本文使低效評(píng)分IS(Inefficiency Score)與算子實(shí)例的執(zhí)行時(shí)間成正比。為了滿足第2個(gè)和第3個(gè)原則,本文使用流水線因子[18]PF(Pipeline Factor)為每個(gè)算子流水線分配一個(gè)合理的評(píng)分。PF使用式(7)計(jì)算:
(7)
其中,i代表第i條算子流水線,j代表第j個(gè)片段,ni代表第i條算子流水線內(nèi)的片段數(shù)量,N表示關(guān)鍵算子流水線可以劃分的階段數(shù)量,Sj表示第j個(gè)片段的流水線執(zhí)行時(shí)間。
為了滿足第3個(gè)原則,本文使用SS(Straggler Scale)作為IS的一個(gè)因子。SS是當(dāng)前算子實(shí)例的執(zhí)行時(shí)間除以同階算子實(shí)例執(zhí)行時(shí)間的中位數(shù),這個(gè)因子代表算子的優(yōu)化潛力。把上述因素組合在一起后,利用式(8)可推導(dǎo)出IS[18]。
ISij=PFi×spanij×SSij=
(8)
其中,spanij是指第i條算子流水線中第j個(gè)片段的執(zhí)行時(shí)間,Medianj表示第j個(gè)流水線片段的平均執(zhí)行時(shí)間。
3.2.3 大數(shù)據(jù)程序低效函數(shù)評(píng)測(cè)技術(shù)
大數(shù)據(jù)程序低效函數(shù)評(píng)測(cè)技術(shù)重點(diǎn)分析分布式文件系統(tǒng)內(nèi)部的低效行為,這些性能信息在應(yīng)用層面和框架層面的性能分析中都無(wú)法獲取,但是分布式文件系統(tǒng)對(duì)所有的大數(shù)據(jù)系統(tǒng)都是至關(guān)重要的,這是大數(shù)據(jù)應(yīng)用程序區(qū)別于高性能程序的一個(gè)重要特點(diǎn)。
分布式文件系統(tǒng)的性能和應(yīng)用層面、框架層面的性能息息相關(guān),應(yīng)用層面的數(shù)據(jù)傾斜和框架層面的Hadoop函數(shù)都和分布式文件系統(tǒng)性能緊密相關(guān)。
對(duì)HDFS進(jìn)行性能分析必須還原每一個(gè)IO請(qǐng)求的函數(shù)調(diào)用樹(shù),否則便無(wú)法分析HDFS消耗在各個(gè)函數(shù)的延遲,也無(wú)法定位造成性能瓶頸的高延遲函數(shù)?;趩喂?jié)點(diǎn)的動(dòng)態(tài)插樁技術(shù)無(wú)法滿足分布式文件系統(tǒng)的動(dòng)態(tài)插樁需求,只能采用靜態(tài)插樁的方式對(duì)分布式文件系統(tǒng)插樁(直接修改源代碼并進(jìn)行編譯)。
在獲取性能日志文件之后,首先需要利用父子關(guān)系將日志還原成多個(gè)調(diào)用樹(shù)結(jié)構(gòu),這些樹(shù)結(jié)構(gòu)規(guī)模十分龐大,不便于分析,因此需要采用一種同構(gòu)樹(shù)壓縮的算法進(jìn)行大規(guī)模壓縮。在進(jìn)行壓縮之后,還可以對(duì)壓縮節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行規(guī)約,比如只保留函數(shù)執(zhí)行時(shí)間的均值、方差、極值和分位點(diǎn)等統(tǒng)計(jì)信息。經(jīng)過(guò)壓縮后不僅數(shù)據(jù)規(guī)模大幅下降,同時(shí)也方便抽取典型IO模式以及每種IO模式下的性能瓶頸。
實(shí)際HDFS任務(wù)運(yùn)行過(guò)程中,有一些調(diào)用樹(shù)會(huì)頻繁出現(xiàn),將其全部采樣既無(wú)必要,又消耗了大量計(jì)算和存儲(chǔ)資源,有時(shí)記錄trace消耗的時(shí)間會(huì)嚴(yán)重影響任務(wù)本身的運(yùn)行時(shí)間,另外過(guò)大的trace文件對(duì)于后續(xù)分析也會(huì)造成極大負(fù)擔(dān)。與以往的工作不同,本文的采樣器都是以調(diào)用樹(shù)為決策的基本對(duì)象,而不是全局或單個(gè)函數(shù)調(diào)用。但是,考慮到采樣對(duì)應(yīng)用性能的影響,采樣器設(shè)計(jì)不能過(guò)于復(fù)雜。本文使用根節(jié)點(diǎn)近似代替調(diào)用樹(shù)。
針對(duì)全局采樣率容易造成調(diào)用樹(shù)遺漏的問(wèn)題,本文使用的方法是根據(jù)調(diào)用樹(shù)出現(xiàn)次數(shù)調(diào)整采樣率[19]。該方法主要考慮到不同的調(diào)用樹(shù)出現(xiàn)次數(shù)差異較大,尤其是在迭代多次的工作負(fù)載中,即使是用了較小的數(shù)據(jù)量,但由于頻繁的迭代計(jì)算,不同調(diào)用樹(shù)出現(xiàn)次數(shù)相差甚至5~6個(gè)數(shù)量級(jí)。對(duì)這類(lèi)函數(shù)的采樣會(huì)造成trace文件過(guò)大,也會(huì)對(duì)任務(wù)性能造成影響。
(1)核心采樣器。
① bump采樣器。bump 采樣器使用bump函數(shù)作為采樣概率生成器,使用bump函數(shù)的原因是,這一類(lèi)函數(shù)存在一個(gè)突變點(diǎn),當(dāng)變量超過(guò)一定值后數(shù)值會(huì)發(fā)生突變,利用該屬性,可以把函數(shù)調(diào)用的執(zhí)行次數(shù)作為變量,設(shè)定參數(shù)λ的值,可以保證函數(shù)在執(zhí)行指定次數(shù)之前有較大的概率被采樣到,但超過(guò)閾值之后,函數(shù)被采樣的概率會(huì)急劇下降,在保證了函數(shù)最低采樣的同時(shí),也能防止一些執(zhí)行次數(shù)過(guò)多的函數(shù)被大量采樣。本文中使用的bump函數(shù)如式(9)所示:
(9)
其中,t1表示函數(shù)執(zhí)行次數(shù),λ為超參數(shù)。
② 令牌桶采樣器。該方法的特點(diǎn)在于,不再使用采樣率的概念,而是用桶中是否有剩余的令牌來(lái)決定是否采樣,同時(shí)靈活性較高,可以通過(guò)設(shè)置參數(shù)滿足不同環(huán)境的采樣需求。這種方法帶來(lái)的效果是,頻繁出現(xiàn)的調(diào)用會(huì)被壓制,而罕見(jiàn)的調(diào)用幾乎總是被采樣到,尤其是當(dāng)某一函數(shù)調(diào)用短時(shí)間內(nèi)高并發(fā)式出現(xiàn)時(shí),該采樣器可以有效壓縮采樣。
(2)采樣調(diào)優(yōu)。
本文采用了參數(shù)自動(dòng)調(diào)優(yōu)機(jī)制,利用模擬退火算法對(duì)采樣器的參數(shù)設(shè)置進(jìn)行自動(dòng)搜索,從而獲取最優(yōu)的參數(shù)設(shè)置。模擬退火算法首先設(shè)置一個(gè)隨機(jī)的初始解x,并計(jì)算目標(biāo)函數(shù)f(x),如式(10)所示:
(10)
其中,entropy(x)表示采樣結(jié)果的信息熵,代表著trace文件包含的信息量,信息熵越大,獲取的信息越多;dist(x)表示采樣后的結(jié)果和全采樣結(jié)果的相似度,這里用歐氏距離來(lái)表示,歐氏距離越小相似度越高。本文還加入了如式(11)所示的約束:
0.1×Sp0.1≤S≤Sp0.1
(11)
其中,Sp0.1表示使用0.1概率采樣到的結(jié)果大小,S表示調(diào)參后動(dòng)態(tài)采樣器采樣到的trace文件大小。即在保證較好的壓縮trace文件大小的同時(shí)又不會(huì)因?yàn)槲募《鴣G失太多信息。
本文實(shí)驗(yàn)環(huán)境如表 2所示,使用R2220-D08服務(wù)器組成集群,通過(guò)測(cè)試終端登錄到集群進(jìn)行實(shí)驗(yàn)。

Table 2 Experimental environment configuration
4.2.1 應(yīng)用層性能評(píng)測(cè)實(shí)驗(yàn)
應(yīng)用層性能評(píng)測(cè)以數(shù)學(xué)領(lǐng)域的Bayes應(yīng)用為例。運(yùn)行Bayes應(yīng)用后,可以在結(jié)果文件中得到應(yīng)用運(yùn)行過(guò)程中的數(shù)據(jù)吞吐量情況以及不同節(jié)點(diǎn)吞吐量情況,如表 3所示。

Table 3 Active performance evaluation results of Bayes application at application layer
主動(dòng)性能評(píng)測(cè)記錄程序運(yùn)行過(guò)程中的CPU、內(nèi)存、磁盤(pán)和網(wǎng)絡(luò)使用情況,圖 2是截取的與讀寫(xiě)相關(guān)的性能指標(biāo),縱軸表示吞吐量,橫軸表示時(shí)間,可以觀察到程序運(yùn)行期間讀寫(xiě)隨時(shí)間變化的情況,由于程序運(yùn)行過(guò)程中會(huì)提前準(zhǔn)備數(shù)據(jù),所以寫(xiě)操作發(fā)生在前,讀操作發(fā)生在后。

Figure 2 Active performance evaluation partial results of Bayes application at application layer
4.2.2 分布式文件系統(tǒng)層性能評(píng)測(cè)實(shí)驗(yàn)
分布式文件系統(tǒng)層性能評(píng)測(cè)以Dfsioe測(cè)試為例。表 4展示了使用分布式文件系統(tǒng)層Dfsioe應(yīng)用對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行主動(dòng)性能評(píng)測(cè)的結(jié)果。

Table 4 Active performance evaluation results of Dfsioe test at distributed file system layer
在分布式文件系統(tǒng)層進(jìn)行主動(dòng)性能評(píng)測(cè)同樣會(huì)記錄CPU、內(nèi)存、磁盤(pán)和網(wǎng)絡(luò)使用情況,本文中僅截取與讀寫(xiě)相關(guān)的性能指標(biāo)進(jìn)行展示,如圖 3所示,展示了讀寫(xiě)速率隨時(shí)間的變化情況,以及每秒讀寫(xiě)次數(shù)的變化情況。

Figure 3 Active performance evaluation partial results of Dfsioe test at distributed file system layer
4.2.3 基礎(chǔ)IO層性能評(píng)測(cè)實(shí)驗(yàn)
基礎(chǔ)IO層性能評(píng)測(cè)以Iozone測(cè)試為例。在文件塊大小為128 MB的情況下,寫(xiě)速率、重復(fù)寫(xiě)速率、讀速率和重復(fù)讀速率如表 5所示?;A(chǔ)IO層測(cè)試直接在本地完成,可以測(cè)試本地文件系統(tǒng)和本地磁盤(pán)的性能。
4.3.1 大數(shù)據(jù)低效任務(wù)評(píng)測(cè)實(shí)驗(yàn)
實(shí)驗(yàn)使用Bayes應(yīng)用作為工作負(fù)載,從圖 4可

Table 5 Active performance evaluation results of Iozone test in the basic IO layer

Figure 4 Percentage of inefficiency causes

Figure 5 Analysis results of inefficient tasks
知Bayes的應(yīng)用特征為IO和CPU占用較大,符合Bayes實(shí)際的應(yīng)用特征。
圖5詳細(xì)展示了Spark運(yùn)行Bayes應(yīng)用程序時(shí)CPU、IO的資源利用率、慢任務(wù)及慢任務(wù)產(chǎn)生的根原因。
圖5中橫軸表示任務(wù)執(zhí)行時(shí)間,左側(cè)的縱軸表示資源利用率(百分比),右邊的縱軸表示通過(guò)將慢任務(wù)的持續(xù)時(shí)間除以階段持續(xù)時(shí)間中位數(shù)計(jì)算出的慢任務(wù)因子。圖5中水平的黑色部分表示標(biāo)注了慢任務(wù)的時(shí)間跨度、慢任務(wù)因子(任務(wù)執(zhí)行時(shí)間和同階段所有任務(wù)執(zhí)行時(shí)間中位數(shù)的比例)及其根原因。圖5中同時(shí)還展示了未確定根原因的慢任務(wù)。圖5上方的黑色橫線表示注入不同類(lèi)型異常的開(kāi)始時(shí)間和持續(xù)時(shí)間。
4.3.2 大數(shù)據(jù)低效算子評(píng)測(cè)實(shí)驗(yàn)
實(shí)驗(yàn)使用Nweight應(yīng)用作為工作負(fù)載,圖 6顯示了Spark運(yùn)行Nweight應(yīng)用程序時(shí)每一個(gè)導(dǎo)致數(shù)據(jù)傾斜的任務(wù)事件,并得到Straggler在不同task上的分布。

Figure 6 Analysis results of Spark inefficient operator
本實(shí)驗(yàn)先用IS定位低效算子,再采用聚類(lèi)的方法對(duì)低效算子的JVM特征進(jìn)行聚類(lèi),通過(guò)分析聚類(lèi)中心的特征大小,就可以判定哪些特征和低效算子相關(guān)性較強(qiáng)。
本實(shí)驗(yàn)將定性和定量分析不同工作負(fù)載下低效算子分布情況。由于工作負(fù)載的算子出現(xiàn)的次數(shù)較多,因此實(shí)驗(yàn)只采取一些有代表性的階段進(jìn)行分析并總結(jié)出典型的低效算子模式。
4.3.3 大數(shù)據(jù)程序低效函數(shù)評(píng)測(cè)實(shí)驗(yàn)
本實(shí)驗(yàn)選用了Hibench中的Kmeans負(fù)載來(lái)驗(yàn)證ASTracer對(duì)其中異常函數(shù)的識(shí)別能力。對(duì)于函數(shù)DFSInputStream#writeChunk來(lái)說(shuō),本實(shí)驗(yàn)中觀察該函數(shù)到75%分位點(diǎn)的執(zhí)行時(shí)間都小于0.1 ms,但是該函數(shù)的最大執(zhí)行時(shí)間達(dá)到200 ms,這表示工作負(fù)載中存在著嚴(yán)重的數(shù)據(jù)不平衡。
對(duì)于Kmeans的機(jī)器學(xué)習(xí)算法要求多輪迭代,表 6展示了Kmeans的采樣函數(shù)信息,可以看到函數(shù)調(diào)用次數(shù)越多,且不同函數(shù)的執(zhí)行時(shí)間不平衡,因此數(shù)據(jù)傾斜的問(wèn)題對(duì)這樣的工作負(fù)載有著明顯的性能影響。

Table 6 Kmeans and Dfsio sampling functions
在數(shù)據(jù)量與日俱增的情況下,大數(shù)據(jù)的存儲(chǔ)處于核心位置,通過(guò)對(duì)大數(shù)據(jù)存儲(chǔ)系統(tǒng)性能的評(píng)測(cè)能夠指導(dǎo)實(shí)際開(kāi)發(fā)人員分析大數(shù)據(jù)應(yīng)用的性能瓶頸,為此,本文基于業(yè)界當(dāng)前工作進(jìn)展與課題組前期工作提出了面向大數(shù)據(jù)存儲(chǔ)系統(tǒng)的主動(dòng)與被動(dòng)測(cè)試相結(jié)合的評(píng)測(cè)理論體系,并依據(jù)本文所提出的理論體系針對(duì)主動(dòng)測(cè)試與被動(dòng)測(cè)試實(shí)現(xiàn)了評(píng)測(cè)工具,給出了當(dāng)前進(jìn)行大數(shù)據(jù)存儲(chǔ)系統(tǒng)性能評(píng)測(cè)的問(wèn)題分析與評(píng)測(cè)原理,本文所開(kāi)發(fā)的工具源碼已開(kāi)源至木蘭社區(qū)[20]。實(shí)驗(yàn)結(jié)果表明,本文所提出的方法與工具能夠提供全面的性能指標(biāo),并為大數(shù)據(jù)存儲(chǔ)系統(tǒng)提供多層次的性能評(píng)測(cè)及分析,具有較強(qiáng)的實(shí)用意義。