游舒泓 ,蘇 仟 ,張 蓉
(1.華東師范大學(xué) 數(shù)據(jù)科學(xué)與工程學(xué)院,上海 200062;2.國家工業(yè)信息安全發(fā)展研究中心,北京 100040)
云計(jì)算平臺的應(yīng)用在近20 年內(nèi)空前增長,根據(jù)統(tǒng)計(jì)報告的預(yù)測[1],到 2025 年,公共云計(jì)算市場價值將達(dá)到 8 000 億美元,越來越多的企業(yè)選擇將工作負(fù)載運(yùn)行在公有云環(huán)境中.截至2020 年,61% 的企業(yè)已將工作負(fù)載遷移到云端,其中有46% 的公司報告說有了更好的財(cái)務(wù)狀況.因此,這一趨勢可能會在未來幾年持續(xù)下去.容器化[2]的云環(huán)境逐漸流行起來,因?yàn)楸绕鸪R?guī)服務(wù)器,用云容器部署應(yīng)用更加高效.容器編排引擎 (如 Kubernetes[3]) 可以提供跨不同云管理應(yīng)用程序的必要運(yùn)行環(huán)境,使容器化云環(huán)境更容易被用戶廣泛使用.
數(shù)據(jù)庫是一種被廣泛應(yīng)用的數(shù)據(jù)管理技術(shù),給物流數(shù)據(jù)提供了方便、高效的管理方式.云平臺的成熟與普及推動了云原生軟件系統(tǒng)的發(fā)展,其中也包括云原生數(shù)據(jù)庫,如Amazon Aurora[4-5]、阿里的PolarDB[6]、Socrates[7]和 Taurus[8].數(shù)據(jù)庫系統(tǒng)作為一個基礎(chǔ)支撐軟件運(yùn)行于系統(tǒng)環(huán)境,在運(yùn)行期間會遇到系統(tǒng)環(huán)境中的其他應(yīng)用程序搶占資源,包括硬件資源、軟件資源,進(jìn)而導(dǎo)致用戶執(zhí)行負(fù)載的性能變化.另外,在生產(chǎn)環(huán)境中,環(huán)境負(fù)載類型、負(fù)載強(qiáng)度都可能進(jìn)行動態(tài)變化,運(yùn)行環(huán)境的變化對數(shù)據(jù)庫負(fù)載運(yùn)行性能的情況甚至正確性都會造成影響.
云平臺的資源池化能力、靈活的調(diào)度能力及面向需求的無感彈性擴(kuò)展能力,在帶來便利的同時,也引入了新的挑戰(zhàn).在云平臺,一臺物理機(jī)可以托管多個應(yīng)用實(shí)例[9],系統(tǒng)中可能同時運(yùn)行大量操作類型不同、密集、高度動態(tài)的工作負(fù)載[10].雖然不同應(yīng)用所部署的容器之間可能通過軟件相互隔離,但由于這些容器共享云環(huán)境中的資源,容器間還是存在對環(huán)境資源的競爭.此外,為了充分利用云資源,云服務(wù)提供商通常會出售更多的資源以獲取更大的利潤.這些因素使得云原生應(yīng)用程序之間的資源搶奪更加嚴(yán)重,從而加劇了數(shù)據(jù)庫運(yùn)行環(huán)境的不可控性和不穩(wěn)定性.圖1 展示了一個容器中的MySQL 數(shù)據(jù)庫性能受另一個容器中的應(yīng)用負(fù)載影響的現(xiàn)象.數(shù)據(jù)庫在運(yùn)行的是事務(wù)型負(fù)載,對CPU 資源的需求大.當(dāng)其他容器中的應(yīng)用程序也開始密集消耗CPU 時 (約55 s),數(shù)據(jù)庫的平均時延明顯大幅增加.因此,模擬動態(tài)的運(yùn)行環(huán)境對評測云環(huán)境中數(shù)據(jù)庫的服務(wù)性能以及服務(wù)可用性、可靠性而言至關(guān)重要.
圖1 容器間資源競爭導(dǎo)致數(shù)據(jù)庫性能下降現(xiàn)象Fig.1 Resource competition between containers causes database performance degration
模擬云數(shù)據(jù)庫運(yùn)行環(huán)境的難點(diǎn)在于需實(shí)現(xiàn)較高的準(zhǔn)確性、高效性、全面性、通用性.準(zhǔn)確性意味著實(shí)際生成的環(huán)境要貼近目標(biāo)環(huán)境,即實(shí)現(xiàn)對目標(biāo)資源的精確消耗,并且環(huán)境模擬負(fù)載對其余系統(tǒng)資源影響微小;高效性意味著生成目標(biāo)環(huán)境的速度快;全面性意味著可模擬的資源類型較廣泛;通用性意味著可以模擬給定時刻數(shù)據(jù)庫運(yùn)行環(huán)境中涉及的環(huán)境資源的故障及非故障狀態(tài).本文設(shè)計(jì)了輕量化的環(huán)境負(fù)載,通過敏捷的算法控制環(huán)境負(fù)載的動態(tài)變化,可實(shí)現(xiàn)對目標(biāo)環(huán)境準(zhǔn)確、高效的模擬.為了更全面地模擬運(yùn)行環(huán)境,本文的資源模擬范圍涵蓋了硬件資源以及與數(shù)據(jù)庫相關(guān)的軟件資源.為了更細(xì)致地刻畫數(shù)據(jù)庫運(yùn)行環(huán)境,實(shí)現(xiàn)更好的通用性,本文將數(shù)據(jù)庫運(yùn)行環(huán)境劃分為以下兩類.
(1) 常規(guī)運(yùn)行環(huán)境: 在無故障情況下,運(yùn)行環(huán)境中其他容器的應(yīng)用程序?qū)ο到y(tǒng)資源消耗的狀態(tài).
(2) 極端運(yùn)行環(huán)境: 運(yùn)行環(huán)境中數(shù)據(jù)庫所在容器的資源被占滿,甚至是被破壞的極端情況.
基于上述設(shè)計(jì)點(diǎn),本文在Woodpecker 測試框架[11]的基礎(chǔ)上實(shí)現(xiàn)了一個全面、通用的數(shù)據(jù)庫運(yùn)行環(huán)境動態(tài)的模擬工具.該工具可生成針對硬件資源 (如CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)) 和進(jìn)程、文件系統(tǒng)等軟件資源指定強(qiáng)度的環(huán)境負(fù)載,達(dá)成對常規(guī)及極端運(yùn)行環(huán)境準(zhǔn)確、高效的模擬,可幫助評測數(shù)據(jù)庫系統(tǒng)服務(wù)的可靠性、穩(wěn)定性.在環(huán)境模擬結(jié)束后,本工具會自動恢復(fù)環(huán)境模擬中被消耗、破壞的資源.
運(yùn)行環(huán)境模擬是一項(xiàng)通過生成、運(yùn)行和控制一組環(huán)境資源工作負(fù)載,模擬實(shí)際業(yè)務(wù)場景中應(yīng)用程序運(yùn)行環(huán)境的工作.目前,數(shù)據(jù)庫測試人員在用標(biāo)準(zhǔn)評測基準(zhǔn)測試數(shù)據(jù)庫性能時,為了獲得最佳的測試結(jié)果,通常在封閉環(huán)境下完成評測,即不會同時在系統(tǒng)中運(yùn)行其他應(yīng)用負(fù)載.但是在實(shí)際業(yè)務(wù)場景中,部署云和集群環(huán)境下的數(shù)據(jù)庫系統(tǒng),其運(yùn)行效果會受到復(fù)雜多變的生產(chǎn)環(huán)境影響,即數(shù)據(jù)庫的負(fù)載性能會受到其他應(yīng)用的資源爭奪或者資源損壞帶來的影響.
隨著云環(huán)境的成熟,越來越多的數(shù)據(jù)庫部署到開放的云平臺,提供DBaaS (數(shù)據(jù)庫服務(wù)),數(shù)據(jù)庫運(yùn)行環(huán)境變得更加復(fù)雜.目前已有相關(guān)工作通過故障注入、模擬環(huán)境資源消耗等方式來制造復(fù)雜的運(yùn)行環(huán)境.不過這些工具在通用性、全面性、動態(tài)性和模擬效果的準(zhǔn)確性上各有欠缺,這些相關(guān)工作的總結(jié)見表1.
表1 運(yùn)行環(huán)境模擬相關(guān)工作總結(jié)Tab.1 Summary of work related to runtime environment simulation
混沌測試工具,如ChaosBlade[12]、Chaos-Mesh[13],通過故障注入的方式,模擬多種系統(tǒng)資源被破壞時的情況.文獻(xiàn)[14-16]通過對運(yùn)行環(huán)境施加壓力測試來評測虛擬機(jī)的性能.這些工作模擬的是極端情況下的運(yùn)行環(huán)境,雖然可以測試數(shù)據(jù)庫的容錯、恢復(fù)能力,但不能反映常規(guī)部署環(huán)境下的運(yùn)行情況,缺乏環(huán)境模擬的通用性,且工具運(yùn)行后,負(fù)載對資源的影響強(qiáng)度是穩(wěn)定的,不能模擬動態(tài)變化的場景.
在模擬環(huán)境資源消耗的工作中,很多工作提出了對單一資源的模擬方法.ProWGen[17]是一種Web 代理工作負(fù)載生成器,用來評估Web 代理的緩存替換策略.GISMO[18]可以生成貼近現(xiàn)實(shí)的、可擴(kuò)展的互聯(lián)網(wǎng)請求流,用于對互聯(lián)網(wǎng)流媒體傳輸技術(shù)進(jìn)行基準(zhǔn)測試.文獻(xiàn)[19]使用真實(shí)的工作負(fù)載特征來模擬用戶的文件訪問行為.文獻(xiàn)[20]通過模擬計(jì)算密集型工作負(fù)載以評估高性能計(jì)算架構(gòu)的性能.文獻(xiàn)[21-24]設(shè)計(jì)了高并行應(yīng)用模擬器,用于探索大規(guī)模的眾核處理器的設(shè)計(jì)空間.但是這些工作是為了評測特定應(yīng)用的性能而設(shè)計(jì)的,生成的是特定應(yīng)用程序的工作負(fù)載,不適合用于模擬實(shí)際業(yè)務(wù)場景中的運(yùn)行環(huán)境.在模擬真實(shí)的應(yīng)用環(huán)境的資源消耗工作中,比較完整的只有Jeong 等[25]研發(fā)的系統(tǒng)測試負(fù)載生成器和華東師范大學(xué)數(shù)據(jù)科學(xué)與工程學(xué)院研發(fā)的動態(tài)工作負(fù)載生成器.
Jeong 等[25]通過生成特征負(fù)載來模擬應(yīng)用的真實(shí)運(yùn)行環(huán)境.但是這個工作只能摸擬CPU、內(nèi)存和磁盤資源的消耗情況,沒有考慮網(wǎng)絡(luò)資源的消耗,也未模擬軟件資源的變化,全面性不佳,而且該工具無法模擬環(huán)境負(fù)載的動態(tài)變化.此外,該工作使用的負(fù)載較笨重,實(shí)現(xiàn)目標(biāo)場景的速度較慢,且模擬某類資源消耗的負(fù)載運(yùn)行時,會對其余硬件資源造成明顯的消耗,導(dǎo)致模擬出的場景不夠準(zhǔn)確.
華東師范大學(xué)數(shù)據(jù)學(xué)院的Zhang 等[26]自主研發(fā)了一個數(shù)據(jù)庫環(huán)境模擬的動態(tài)工作負(fù)載生成器,可以模擬CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)資源的消耗情況.該工作提出了一種動態(tài)環(huán)境生成算法,可以模擬出較復(fù)雜的應(yīng)用運(yùn)行環(huán)境,但是全面性不佳,比如對于磁盤,只模擬了占用容量和產(chǎn)生順序?qū)慖/O 的場景,對于網(wǎng)絡(luò)資源只考慮了模擬網(wǎng)絡(luò)帶寬的占用情況,且未考慮軟件資源方面的影響,能制造的場景有限.該工作在負(fù)載設(shè)計(jì)時未規(guī)避對其余資源的明顯消耗,造成模擬資源消耗場景的準(zhǔn)確性欠佳.
本文假定在常規(guī)運(yùn)行環(huán)境下,數(shù)據(jù)庫實(shí)例所在平臺系統(tǒng)的硬件資源 (CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)) 充足,數(shù)據(jù)庫內(nèi)部無異常問題.在這個前提條件下,如果數(shù)據(jù)庫負(fù)載的執(zhí)行效率變低,則有可能與負(fù)載可使用資源變少有關(guān).常規(guī)的運(yùn)行環(huán)境是指存在應(yīng)用程序間爭搶資源行為的系統(tǒng)環(huán)境.常規(guī)的運(yùn)行環(huán)境變化會對數(shù)據(jù)庫的性能穩(wěn)定性和數(shù)據(jù)庫服務(wù)的可用性造成考驗(yàn).本工具可模擬的常規(guī)運(yùn)行場景如表2所示.一般情況下,密集消耗某種資源負(fù)載的同時也可能消耗其他資源,模擬負(fù)載之間的相互作用會給環(huán)境資源模擬造成困難.因此,本文提出在設(shè)計(jì)每種資源的消耗負(fù)載上要盡量避免或者降低對其余資源的影響,從而實(shí)現(xiàn)準(zhǔn)確模擬出各類數(shù)據(jù)庫運(yùn)行的場景.
表2 常規(guī)運(yùn)行環(huán)境模擬負(fù)載總結(jié)Tab.2 Summary of regular runtime environment simulation workload
在極端情況下,系統(tǒng)中可能發(fā)生某種硬件資源被占滿,甚至被破壞的情況,這對數(shù)據(jù)庫運(yùn)行會是很大的阻礙.極端情況包含對資源的徹底性破壞和非徹底性破壞.徹底性破壞是對資源造成完全損壞,包括切斷網(wǎng)絡(luò)鏈接、破壞進(jìn)程、主機(jī)宕機(jī)、破壞文件等;非徹底性破壞是對資源造成部分損壞,如網(wǎng)絡(luò)發(fā)生部分丟包、網(wǎng)絡(luò)包損壞等情況.本工具可模擬的極端運(yùn)行場景如表3 所示.對于數(shù)據(jù)庫評測而言,這些極端環(huán)境可以幫助測試數(shù)據(jù)庫的容錯性、高可用性.
表3 極端運(yùn)行環(huán)境模擬負(fù)載總結(jié)Tab.3 Summary of extreme runtime environment simulation workload
如果數(shù)據(jù)庫可用的CPU 資源不足,包含連接、排序等計(jì)算復(fù)雜度高的負(fù)載性能就會被拖慢.CPU 負(fù)載的模擬需要考慮兩個問題: CPU 占用的速度、其他資源的相關(guān)影響.
本工具模擬CPU 占用的方法是分配一定數(shù)量的單線程進(jìn)程,在 while(true) 條件下無限次地執(zhí)行賦值操作,從而占用相應(yīng)核數(shù)的CPU.由于每個進(jìn)程都在執(zhí)行無限循環(huán)操作,進(jìn)程占用的CPU 使用率會迅速升至100%.對CPU 消耗大的負(fù)載通常會涉及算術(shù)計(jì)算,但執(zhí)行計(jì)算的過程中難免會涉及對計(jì)算中間結(jié)果的緩存,進(jìn)而使得內(nèi)存資源被明顯消耗,這樣就無法準(zhǔn)確模擬出只大量占用CPU 資源的場景.因此,本工具的CPU 占用模擬負(fù)載中只設(shè)計(jì)了賦值這樣簡單的操作,從而避免了計(jì)算中間結(jié)果的緩存,幾乎不會引起對內(nèi)存的消耗.
如果內(nèi)存資源不足,數(shù)據(jù)庫可能會頻繁地對磁盤進(jìn)行讀寫操作,而對基于LSM Tree 設(shè)計(jì)的緩存管理會造成更嚴(yán)重的頻繁數(shù)據(jù)合并,導(dǎo)致讀寫操作密集型數(shù)據(jù)庫的負(fù)載性能受到影響.為了模擬對內(nèi)存資源的占用,需要解決如下問題: 一是內(nèi)存環(huán)境的迅速構(gòu)造,二是對其他資源的無感生成方法.
本工具模擬內(nèi)存占用的方法是創(chuàng)建tmpfs 文件系統(tǒng),再往里寫入指定大小的$data_size數(shù)據(jù),以達(dá)到占據(jù)內(nèi)存的目的,模擬內(nèi)存占用執(zhí)行的命令如下所示.tmpfs 是一種虛擬內(nèi)存文件系統(tǒng),使用內(nèi)存來存儲數(shù)據(jù).本工具采用Linux 自帶的 dd 命令對tmpfs 文件系統(tǒng)填充數(shù)據(jù),方法是從/dev/zero讀取數(shù)據(jù),再寫入tmpfs,以達(dá)到占用內(nèi)存的效果.
由于/dev/zero是一個偽設(shè)備,它只產(chǎn)生空字符流,讀取不會產(chǎn)生I/O.將讀取的數(shù)據(jù)寫入內(nèi)存的速度與每次操作的數(shù)據(jù)塊大小bs 有關(guān),當(dāng)bs 被設(shè)為磁盤扇區(qū)大小的較大倍數(shù) (如512 K) 時,可大幅減少系統(tǒng)調(diào)用帶來的額外消耗,從而提高占據(jù)內(nèi)存的速度.寫入過程中自然不會產(chǎn)生對磁盤的寫I/O,只會對CPU 消耗造成少量影響,而保持占據(jù)內(nèi)存的過程幾乎不會消耗磁盤I/O 和CPU.
數(shù)據(jù)庫可用的磁盤資源如果不足,數(shù)據(jù)庫的讀寫速度也會因此受限.已有的工作大多關(guān)注對磁盤容量的模擬,忽視了對指定強(qiáng)度的IOPS (Input/output Operations Per Second)的仿真,但是IOPS 會影響即時的寫入和讀入性能,對數(shù)據(jù)庫處理磁盤操作密集型負(fù)載的性能會有明顯影響.
2.3.1 磁盤容量
系統(tǒng)中可用的磁盤容量如果不足,數(shù)據(jù)庫寫入的數(shù)據(jù)無法落盤,便會被迫終止對負(fù)載的處理.本工具設(shè)計(jì)的占用磁盤容量的負(fù)載使用了Linux 自帶的dd 命令來實(shí)現(xiàn),具體命令如下.
該負(fù)載會復(fù)制一定大小的數(shù)據(jù),寫入文件系統(tǒng)中,達(dá)到占用磁盤容量的目的.用戶可以指定需要占用的磁盤容量 ($data_size).執(zhí)行過程中雖然包含對數(shù)據(jù)文件的多次讀、寫,但是本工具在負(fù)載中指定了控制讀、寫方式的參數(shù)“flags=direct”,在對磁盤進(jìn)行操作時便可以規(guī)避文件系統(tǒng)的緩存,所以執(zhí)行負(fù)載期間對CPU 有輕微影響,幾乎不消耗內(nèi)存.為了減少寫入數(shù)據(jù)期間對磁盤I/O 的影響,本負(fù)載會從/dev/zero(一個只產(chǎn)生空字符流的偽設(shè)備) 中讀取數(shù)據(jù),這樣可以避免產(chǎn)生讀I/O.
2.3.2 磁盤IOPS
磁盤IOPS 是磁盤每秒產(chǎn)生I/O 的次數(shù).系統(tǒng)硬盤每秒產(chǎn)生I/O 的能力是有上限的,如果被其他負(fù)載占用過多IOPS,數(shù)據(jù)庫對磁盤的讀寫速度會減慢,進(jìn)而影響數(shù)據(jù)庫負(fù)載處理的效率.產(chǎn)生指定強(qiáng)度磁盤IOPS 環(huán)境的難點(diǎn)在于如下兩點(diǎn): ①必須保證負(fù)載每次對數(shù)據(jù)塊的操作可以在單次I/O 操作中完成,才能準(zhǔn)確模擬出IOPS;② 磁盤每次I/O 操作的時長可能會波動變化,難以估計(jì)指定數(shù)量的I/O 操作能否在預(yù)期時長內(nèi)完成.故目前沒有資源模擬工具可以準(zhǔn)確產(chǎn)生指定強(qiáng)度的磁盤IOPS.
本工具用于模擬占用磁盤IOPS 的負(fù)載類型有6 種: 順序?qū)?、讀、讀寫以及隨機(jī)寫、讀、讀寫,可制造多樣化的I/O 場景.
(1) 順序操作的IOPS
對順序IOPS 占用的模擬如算法1 所示.該負(fù)載每秒執(zhí)行一次 dd 命令對磁盤執(zhí)行順序讀/寫操作,負(fù)載執(zhí)行期間操作磁盤塊的數(shù)量近似是對磁盤進(jìn)行I/O 操作次數(shù),即磁盤IOPS.為了更精確地模擬產(chǎn)生指定強(qiáng)度的磁盤IOPS,本負(fù)載將每次I/O 操作的數(shù)據(jù)塊大小 (bs 參數(shù)) 設(shè)置為dd 命令允許的最小值 (512 B),這個數(shù)值遠(yuǎn)小于磁盤的block 大小 (通常只有4 096 B 左右),保證負(fù)載每次對數(shù)據(jù)塊的I/O 操作都能一次性完成,并且每次I/O 操作的時延微小,這樣可以盡可能地保證需要模擬的I/O 操作可以在1 s 內(nèi)完成.
制造順序?qū)懙腎/O 時,該負(fù)載會模擬寫入數(shù)據(jù)到文件系統(tǒng)中.其中,讀取的數(shù)據(jù)源 (fileread) 為/dev/zero,它是一個偽設(shè)備,只產(chǎn)生空字符流,讀取它并不會產(chǎn)生讀磁盤的I/O.執(zhí)行順序?qū)懙呢?fù)載期間,產(chǎn)生的I/O 都集中在輸出文件的過程中.
順序讀的負(fù)載會從文件系統(tǒng)的一個物理分區(qū)中復(fù)制一定大小的文件,輸出到/dev/null(filewrite) ./dev/null也是個偽設(shè)備,相當(dāng)于黑洞,對該設(shè)備寫入數(shù)據(jù)不會產(chǎn)生寫磁盤的I/O.執(zhí)行順序讀的負(fù)載期間,產(chǎn)生的I/O 都集中在讀取文件系統(tǒng)的過程中.
順序讀寫的負(fù)載會從文件系統(tǒng)的一個物理分區(qū)中復(fù)制一定大小的文件,輸出到另一個物理分區(qū)的文件中.所以執(zhí)行這個負(fù)載時,讀寫文件的過程都會產(chǎn)生I/O.
本負(fù)載在模擬產(chǎn)生高強(qiáng)度磁盤IOPS 場景時,對磁盤余量不會有明顯影響,這是由于每次I/O 只操作512 B 數(shù)據(jù);普通HDD 硬盤的IOPS 上限只有幾千次,即使是SSD 硬盤的IOPS 上限也只有幾萬次,就算用戶需要模擬高強(qiáng)度的IOPS,該負(fù)載每秒需要操作的數(shù)據(jù)量也只有幾MB,對磁盤容量的影響小于萬分之一.
一般來說,對磁盤進(jìn)行操作的負(fù)載需要頻繁使用內(nèi)存,故而不可避免地會占用CPU 和內(nèi)存.和占用磁盤容量的負(fù)載相似,本工具中占用磁盤IOPS 的負(fù)載指定了對磁盤進(jìn)行操作時規(guī)避使用文件緩存,執(zhí)行負(fù)載期間對CPU 和內(nèi)存消耗都只有輕微影響,并且盡可能地保證了磁盤I/O 強(qiáng)度的準(zhǔn)確性.
(2) 隨機(jī)操作的IOPS
模擬隨機(jī)操作的算法與順序操作的大致相同,其中,由于dd 命令只支持對磁盤的順序操作,本工具通過調(diào)用輕量級的磁盤測試工具fio[27]來實(shí)現(xiàn)對磁盤的隨機(jī)操作.系統(tǒng)測試中,fio 常被用于生成混合隨機(jī)讀寫的密集 I/O 工作負(fù)載.fio 運(yùn)行時會引起更多的系統(tǒng)調(diào)用,所以對于CPU、內(nèi)存的影響會更大一點(diǎn).
如果網(wǎng)絡(luò)質(zhì)量不佳,數(shù)據(jù)傳輸?shù)乃俣葧蟠鬁p慢,這對于分布式數(shù)據(jù)庫的負(fù)載處理速度會有不小影響.本工具可以模擬特殊的網(wǎng)絡(luò)環(huán)境,使網(wǎng)絡(luò)發(fā)生帶寬受限、傳輸產(chǎn)生時延等情況,也可以模擬網(wǎng)絡(luò)發(fā)生丟包、包損壞等非徹底性破壞.本工具通過直接對網(wǎng)卡施加流量限制來模擬特殊的網(wǎng)絡(luò)環(huán)境.負(fù)載中調(diào)用了Linux 的tc 工具來實(shí)現(xiàn)對網(wǎng)絡(luò)資源消耗和網(wǎng)絡(luò)故障的模擬.tc 在網(wǎng)絡(luò)輸出端口處建立一個隊(duì)列,以實(shí)現(xiàn)對Linux 內(nèi)核的流量控制.tc 可以針對特定網(wǎng)卡來制造流量限制,達(dá)成效果的速度快,并且運(yùn)行期間幾乎不會引起對CPU、內(nèi)存的消耗.
本工具還可以模擬斷開機(jī)器間的網(wǎng)絡(luò)連接.負(fù)載可以實(shí)現(xiàn)斷開特定端口的網(wǎng)絡(luò),為軟件的可靠性測試而服務(wù),如果用戶需要測試數(shù)據(jù)庫的運(yùn)行容錯性,可以用本負(fù)載來切斷數(shù)據(jù)庫端口的網(wǎng)絡(luò).本負(fù)載的實(shí)現(xiàn)方法是調(diào)用tcpkill 命令,終止對應(yīng)的tcp 連接.
當(dāng)數(shù)據(jù)文件被損壞時,數(shù)據(jù)庫需要執(zhí)行備份恢復(fù)或者啟用備庫來保證業(yè)務(wù)的開展,實(shí)現(xiàn)高可用.對于單點(diǎn)式數(shù)據(jù)庫,這種情況可以考驗(yàn)數(shù)據(jù)庫的備份恢復(fù)能力;對于分布式數(shù)據(jù)庫,特別是主備架構(gòu),這種情況還可以測試各節(jié)點(diǎn)間數(shù)據(jù)的同步能力.
本工具通過強(qiáng)制執(zhí)行系統(tǒng)的刪除命令來刪除用戶指定的文件或文件夾,以此模擬數(shù)據(jù)文件丟失的情況.除此之外,還可以模擬數(shù)據(jù)文件被惡意篡改的場景,通過輸出隨機(jī)字符改寫數(shù)據(jù)文件來實(shí)現(xiàn).
應(yīng)用程序連續(xù)創(chuàng)建進(jìn)程的行為會拖慢系統(tǒng)開啟新進(jìn)程的速度,進(jìn)而影響數(shù)據(jù)庫 (尤其是多進(jìn)程數(shù)據(jù)庫) 對負(fù)載的處理效率.本工具通過循環(huán)創(chuàng)建多個子進(jìn)程來模擬占用進(jìn)程資源空間.
數(shù)據(jù)庫進(jìn)程如果被意外終止,數(shù)據(jù)庫對負(fù)載的執(zhí)行會被強(qiáng)行結(jié)束,并且可能發(fā)生大量事務(wù)回滾,數(shù)據(jù)庫的容錯能力是不小的考驗(yàn).本工具通過調(diào)用系統(tǒng)命令來終止進(jìn)程,以此模擬應(yīng)用程序的進(jìn)程被意外結(jié)束的情況.
除此之外,本工具還可以通過執(zhí)行進(jìn)程炸彈 (fork bomb),即不停創(chuàng)建新進(jìn)程來耗盡系統(tǒng)資源,執(zhí)行命令如下所示.
在這個負(fù)載運(yùn)行期間,有進(jìn)程數(shù)量限制的系統(tǒng)無法開起新的進(jìn)程,不限制進(jìn)程數(shù)量的系統(tǒng)則會停止響應(yīng),對數(shù)據(jù)庫運(yùn)行會是很大的打擊.
如果數(shù)據(jù)庫所在的主機(jī)發(fā)生宕機(jī),數(shù)據(jù)庫處理負(fù)載的過程會被強(qiáng)行終止.這種情況可以考驗(yàn)數(shù)據(jù)庫運(yùn)行負(fù)載的正確性和數(shù)據(jù)庫的高可用性.
本工具可模擬以下多種數(shù)據(jù)庫所在的機(jī)器意外宕機(jī)的情況:
(1) 通過強(qiáng)制執(zhí)行關(guān)閉電源的命令,模擬機(jī)器的電源被破壞,機(jī)器內(nèi)所有進(jìn)程被迫終止運(yùn)行的情況;
(2) 通過執(zhí)行正常關(guān)機(jī)的命令,模擬機(jī)器被正常關(guān)機(jī)的情況;
(3) 通過切斷該機(jī)器的所有網(wǎng)絡(luò)連接,模擬機(jī)器失聯(lián)的情況.
在云環(huán)境中,密集的工作負(fù)載及新容器的建立可能會更頻繁地發(fā)生,即云數(shù)據(jù)庫的運(yùn)行環(huán)境可能隨時會動態(tài)變化.因此,為了模擬出更真實(shí)的環(huán)境,需要建模環(huán)境負(fù)載在不同時段的資源消耗情況.
本工具模擬負(fù)載動態(tài)變化的方法如算法2 所示,動態(tài)性主要由控制環(huán)境模擬負(fù)載執(zhí)行的變量targetList和timeList來實(shí)現(xiàn).算法2 中,Workloadtype表示用戶當(dāng)前要執(zhí)行的環(huán)境負(fù)載,targetList和timeList是兩個長度相等的數(shù)組,timeList中的每個值表示不同的時間段,targetList中對應(yīng)位置的值是這個時間段內(nèi)負(fù)載需模擬的目標(biāo)環(huán)境狀態(tài).本工具通過timeList來控制負(fù)載強(qiáng)度發(fā)生變化的時間點(diǎn),通過targetList中相鄰目標(biāo)環(huán)境狀態(tài)的差值(Δadjust)來控制負(fù)載強(qiáng)度變化的幅度,比如WordloadCP U(3 2 4,60 30 50)中,targetList是 (3 2 4) ,timeList是 (60 30 50),該負(fù)載一共要執(zhí)行140 s(60+30+50),模擬出的場景是: 在前60 s 占用3 核CPU,60~ 90 s 只占用2 核CPU,最后50 s 占用4 核CPU.
應(yīng)用環(huán)境模擬框架如圖2 所示.客戶端組件包括控制器、解析器、負(fù)載生成器和測試報告生成器.服務(wù)器端包括動態(tài)變化控制器、負(fù)載執(zhí)行器、指標(biāo)收集器和目標(biāo)服務(wù)器,其中,動態(tài)變化控制器用于控制負(fù)載強(qiáng)度變化,負(fù)載執(zhí)行器中的常規(guī)負(fù)載執(zhí)行器會對目標(biāo)服務(wù)器執(zhí)行環(huán)境資源消耗模擬,極端負(fù)載執(zhí)行器會對目標(biāo)服務(wù)器的資源執(zhí)行資源破壞.指標(biāo)收集器會在每次測試結(jié)束后將細(xì)粒度的測試指標(biāo)反饋給測試報告生成器,用于輸出詳盡的測試報告.
圖2 運(yùn)行環(huán)境模擬總體框架Fig.2 General framework for runtime environment simulation
環(huán)境仿真模擬的流程如下.
(1) 控制器從系統(tǒng)配置文件中識別出當(dāng)前的環(huán)境模擬任務(wù),并啟動解析器;
(2) 解析器根據(jù)詞法規(guī)則解析當(dāng)前的模擬任務(wù),并發(fā)送負(fù)載生成器;
(3) 負(fù)載生成器收到環(huán)境模擬任務(wù),生成環(huán)境負(fù)載,發(fā)送給服務(wù)端的動態(tài)變化控制器;
(4) 動態(tài)變化控制器調(diào)用負(fù)載執(zhí)行器對目標(biāo)服務(wù)器,即數(shù)據(jù)庫所在的機(jī)器,執(zhí)行環(huán)境負(fù)載,并控制環(huán)境負(fù)載的強(qiáng)度和執(zhí)行時長;
(5) 運(yùn)行環(huán)境模擬負(fù)載期間,指標(biāo)收集器會收集監(jiān)控器返回的數(shù)據(jù)庫性能指標(biāo)及數(shù)據(jù)庫所在機(jī)器的資源消耗情況,并發(fā)送客戶端;
(6) 每輪測試結(jié)束后,測試報告生成器會自動輸出詳盡的測試報告,包括環(huán)境因素和數(shù)據(jù)庫系統(tǒng)性能.
實(shí)驗(yàn)共用了4 臺服務(wù)器,均安裝CentOS 7.9 操作系統(tǒng),并配備8 核CPU,32 GB 內(nèi)存,磁盤轉(zhuǎn)數(shù)15 000 r/min、容量130 GB 的硬盤和千兆網(wǎng).
圖3 展示了實(shí)驗(yàn)集群部署情況.其中一臺服務(wù)器 (Machine A) 專用于評測環(huán)境模擬負(fù)載的性能.另外3 臺服務(wù)器同屬于另一個局域網(wǎng)并搭建分布式Kubernetes 集群,用于評測環(huán)境模擬負(fù)載對數(shù)據(jù)庫測試的有效性,分布式TiDB 數(shù)據(jù)庫[28]搭建在Kubernetes 集群上.該TiDB 數(shù)據(jù)庫包含1 個PD 節(jié)點(diǎn),1 個TiDB 計(jì)算節(jié)點(diǎn),3 個TiKV 節(jié)點(diǎn),每個數(shù)據(jù)庫節(jié)點(diǎn)安裝在不同的Kubernetes 容器中.PD 節(jié)點(diǎn)和TiDB 計(jì)算節(jié)點(diǎn)分別部署在不同的Kubernetes Follower 節(jié)點(diǎn)上,避免被Kubernetes 的主控組件搶占資源;3 個TiKV 節(jié)點(diǎn)各部署在不同的Kubernetes 節(jié)點(diǎn)上.
圖3 實(shí)驗(yàn)集群部署Fig.3 Deployment of experimental cluster
實(shí)驗(yàn)分別模擬占用CPU、內(nèi)存、磁盤和網(wǎng)絡(luò)資源,展示本文設(shè)計(jì)的環(huán)境模擬負(fù)載對模擬資源占用的準(zhǔn)確性,并與目前環(huán)境模擬方向最先進(jìn)的工作 (華東師范大學(xué)數(shù)據(jù)學(xué)院研發(fā)的數(shù)據(jù)庫環(huán)境模擬工具,下文用作者名Chunxi 來代指該工具) 在達(dá)成模擬目標(biāo)的速度、對其余環(huán)境資源的占用程度等方面進(jìn)行對比.
為了準(zhǔn)確展示環(huán)境模擬的效果,運(yùn)行環(huán)境模擬負(fù)載期間除了資源監(jiān)控工具nmon[29]以外,未在實(shí)驗(yàn)服務(wù)器中運(yùn)行與實(shí)驗(yàn)無關(guān)的軟件、程序.每次實(shí)驗(yàn)開始前,本工具會自動啟動nmon,并等待nmon 工具開始記錄指標(biāo)后再執(zhí)行資源模擬負(fù)載,防止nmon 因?yàn)閱泳徛杉坏綄?shí)驗(yàn)前幾秒的資源消耗變化.nmon 是一個輕量級的資源監(jiān)控工具,運(yùn)行期間幾乎不影響CPU 和內(nèi)存使用率.但nmon 需要每秒統(tǒng)計(jì)各類資源的消耗情況,并輸出性能指標(biāo)到監(jiān)控結(jié)果文件中,這個過程本身會消耗少量磁盤I/O.為了消除nmon 對磁盤I/O 的影響,本工具在每次實(shí)驗(yàn)前,將虛擬文件系統(tǒng)tmpfs 掛載到指定目錄中,限制該文件目錄大小為1 MB.由于tmpfs 使用內(nèi)存來存儲數(shù)據(jù),nmon 每次輸出指標(biāo)數(shù)據(jù)都相當(dāng)于直接寫入內(nèi)存中,避免了對磁盤資源的使用,并且分配給nmon 使用的這1 MB 內(nèi)存大小只占于實(shí)驗(yàn)服務(wù)器內(nèi)存總量的十萬分之三,影響微小.
5.2.1 模擬占用CPU
本實(shí)驗(yàn)分別將模擬占用CPU 的目標(biāo)設(shè)置為系統(tǒng)CPU 總量的25%、50%、75%、87.5%.從圖4 可以看出,本工具可以快速實(shí)現(xiàn)對指定核數(shù)CPU 的穩(wěn)定消耗,即使對87.5% CPU 的占用也可以在2 s 內(nèi)實(shí)現(xiàn).而Chunxi 的工具在占用CPU 期間,CPU 占用率先超過了目標(biāo)占用率,幾秒后再回落到目標(biāo)占用率,并且在模擬期間的前半段中CPU 占用率有小幅波動,這是因?yàn)樵摴ぞ咭訨ava 程序的形式運(yùn)行,運(yùn)行過程會帶來少量額外的CPU 消耗.
圖4 模擬占用CPUFig.4 Simulation of CPU usage
圖5 展示了模擬CPU 的負(fù)載運(yùn)行期間對內(nèi)存的影響情況.本工作的負(fù)載對內(nèi)存的平均消耗只在0.4%以內(nèi),這是因?yàn)楸疚脑O(shè)計(jì)的負(fù)載以Shell 腳本的形式運(yùn)行,通過調(diào)用指定數(shù)量的單線程進(jìn)程做無限死循環(huán)的操作來快速占用CPU,這個方法幾乎不消耗內(nèi)存.而Chunxi 的程序以Java 程序的形式運(yùn)行,該負(fù)載執(zhí)行期間不停地進(jìn)行pai 計(jì)算,計(jì)算過程會使用緩存來記錄中間計(jì)算結(jié)果.所以當(dāng)需要占用的CPU 核數(shù)越多,該負(fù)載對內(nèi)存的占用也明顯增加,在占用87.5% CPU 期間甚至消耗了約50%內(nèi)存.兩個工具運(yùn)行過程中對磁盤I/O 幾乎無影響.
圖5 占用CPU 的負(fù)載對內(nèi)存的平均影響Fig.5 Average impact of CPU workload on memory
5.2.2 模擬占用內(nèi)存
本實(shí)驗(yàn)分別模擬了占用25%、50%、75%、87.5%內(nèi)存的場景.如圖6 所示,本工具的負(fù)載實(shí)現(xiàn)內(nèi)存占用時,將參數(shù)bs 設(shè)為512 K,實(shí)現(xiàn)目標(biāo)的效率很高,即使占用87.5%的內(nèi)存也只需要8 s,比Chunxi的工作負(fù)載 (花費(fèi)11 s) 實(shí)現(xiàn)得略快一些.圖7 反映了模擬內(nèi)存占用的負(fù)載運(yùn)行期間對CPU 的平均影響.本工作負(fù)載因?yàn)樵谙騼?nèi)存填充數(shù)據(jù)時使用了系統(tǒng)命令,這段時間內(nèi)會對系統(tǒng)內(nèi)核CPU 造成少量消耗;但填充內(nèi)存之后只保持著不釋放內(nèi)存的狀態(tài),在此期間不消耗CPU.所以本負(fù)載運(yùn)行期間對CPU 的平均消耗率很低,即使占用了87.5%內(nèi)存,對CPU 的平均消耗也不到3%.而Chunxi 的內(nèi)存占用工具是以C 語言程序的形式運(yùn)行的,在填充內(nèi)存期間對用戶態(tài)CPU 和系統(tǒng)內(nèi)核CPU 都造成了一定消耗;并且在占用內(nèi)存期間,該負(fù)載保持活躍地操作內(nèi)存,導(dǎo)致該程序?qū)PU 的消耗明顯,即使只占用25%內(nèi)存也消耗了超過10% CPU.兩個工具都采用直接對內(nèi)存寫入數(shù)據(jù)的方式來占據(jù)內(nèi)存,所以在工具運(yùn)行期間幾乎沒有消耗磁盤資源.
圖6 模擬占用內(nèi)存Fig.6 Simulation of memory usage
圖7 占用內(nèi)存的負(fù)載對CPU 的平均影響Fig.7 Average impact of memory workload on CPU
5.2.3 模擬占用磁盤
本實(shí)驗(yàn)分別模擬了占用20%、40%、60%、90%磁盤IOPS 的場景.如圖8 所示,本工具的負(fù)載基本可以準(zhǔn)確地模擬出20%、40%、60%磁盤IOPS;在模擬產(chǎn)生90%磁盤IOPS 時,也許因?yàn)樘芗拇疟P操作本身會給磁盤帶來壓力,使得每次I/O 操作的時間發(fā)生波動,所以負(fù)載剛開始運(yùn)行時的模擬效果不太準(zhǔn)確,到中、后期模擬的IOPS 變?yōu)槠椒€(wěn),并符合模擬目標(biāo).由于本工作負(fù)載直接對磁盤進(jìn)行操作,工具運(yùn)行期間對內(nèi)存幾乎無消耗.Chunxi 的負(fù)載運(yùn)行時會占用一定程度的IOPS,但是由于該工作無法保證對每個數(shù)據(jù)塊的操作都在一次I/O 中完成,并且在負(fù)載設(shè)計(jì)中未規(guī)避對內(nèi)存的使用,導(dǎo)致該負(fù)載對指定強(qiáng)度的IOPS 的占用完全不準(zhǔn)確,所以該工具不適合用于模擬磁盤IOPS.
圖8 模擬占用磁盤IOPSFig.8 Simulation of disk IOPS usage
圖9 和圖10 分別展示了占用IOPS 期間系統(tǒng)中CPU 平均使用率、內(nèi)存使用率.本工具運(yùn)行期間避免使用文件系統(tǒng)緩存,所以運(yùn)行期間對CPU 消耗微小,并且?guī)缀醪皇褂脙?nèi)存.而Chunxi 的工具在運(yùn)行過程中大量使用了內(nèi)存,這會觸發(fā)大量的系統(tǒng)調(diào)用,進(jìn)而導(dǎo)致CPU 的使用率也較高.
圖9 占用磁盤IOPS 對CPU 的平均影響Fig.9 Average impact of disk IOPS workload on CPU
圖10 占用磁盤IOPS 對內(nèi)存的平均影響Fig.10 Average impact of disk IOPS workload on memory
5.2.4 模擬網(wǎng)絡(luò)環(huán)境
本工作和Chunxi 的工作都能模擬網(wǎng)絡(luò)環(huán)境,但實(shí)現(xiàn)的方式不同: 本工作通過直接控制機(jī)器網(wǎng)卡,實(shí)現(xiàn)對網(wǎng)絡(luò)帶寬的限制;而對比工作通過使用Java 程序在兩臺服務(wù)器間保持傳輸數(shù)據(jù)以達(dá)成占用網(wǎng)絡(luò)帶寬.為了更直觀地比較兩個工具對網(wǎng)絡(luò)帶寬的影響效果,在運(yùn)行本工具前先在實(shí)驗(yàn)服務(wù)器與另一臺服務(wù)器之間保持傳輸數(shù)據(jù),方便監(jiān)控工具記錄工具啟動后系統(tǒng)中網(wǎng)絡(luò)帶寬的變化;而在用Chunxi的工具做實(shí)驗(yàn)時,直接用監(jiān)控工具記錄系統(tǒng)中網(wǎng)絡(luò)帶寬的變化情況.
實(shí)驗(yàn)比較了兩個工具運(yùn)行期間網(wǎng)絡(luò)帶寬的變化情況,以此來反映兩個工具對網(wǎng)絡(luò)帶寬占用的效果.圖11 展示了影響20%、40%、60%、90%網(wǎng)絡(luò)帶寬時,系統(tǒng)中網(wǎng)絡(luò)帶寬的變化情況.本工具通過直接對系統(tǒng)網(wǎng)卡施加限制,達(dá)成目標(biāo)環(huán)境的效率快,在2 s 內(nèi)都能實(shí)現(xiàn)需要模擬的目標(biāo)值,并且模擬出了穩(wěn)定的網(wǎng)絡(luò)環(huán)境.Chunxi 的工具通過不停在兩臺服務(wù)器間傳輸數(shù)據(jù)來實(shí)現(xiàn)對網(wǎng)絡(luò)帶寬的占用.該程序調(diào)用了Netty 技術(shù),需要花費(fèi)一點(diǎn)時間等待兩臺服務(wù)器間建立通信.該工具執(zhí)行期間,占用的網(wǎng)絡(luò)帶寬大小發(fā)生明顯波動.這也許是因?yàn)樵摴ぞ咴诜?wù)器間傳輸數(shù)據(jù)過程中遭遇了通道阻塞,導(dǎo)致部分?jǐn)?shù)據(jù)無法被及時傳輸.
圖11 模擬影響網(wǎng)絡(luò)帶寬Fig.11 Simulation of network bandwidth usage
圖12 反映了運(yùn)行環(huán)境負(fù)載期間系統(tǒng)中CPU 的變化情況.本工具直接對系統(tǒng)網(wǎng)卡施加限制,這個方法幾乎不會影響其他硬件資源的使用.由于測試本負(fù)載期間在兩臺服務(wù)器間保持傳輸數(shù)據(jù),這本身會帶來輕微的CPU 消耗,所以單獨(dú)運(yùn)行本工具時的CPU 使用率會比圖中記錄的使用率更低一些.而Chunxi 的工具通過執(zhí)行調(diào)用了Netty 技術(shù)的Java 程序來實(shí)現(xiàn)對網(wǎng)絡(luò)資源的占用.該負(fù)載在運(yùn)行期間需要密集地計(jì)算要傳輸數(shù)據(jù)的大小,因此,網(wǎng)絡(luò)模擬的工作負(fù)載對 CPU 有較明顯影響.兩個工具運(yùn)行過程中對磁盤I/O 幾乎無影響.
圖12 模擬網(wǎng)絡(luò)環(huán)境的負(fù)載對CPU 的平均影響Fig.12 Average impact of network bandwidth workload on CPU
實(shí)驗(yàn)?zāi)M了自定義的環(huán)境場景,展示了本工具對動態(tài)變化環(huán)境的模擬效果,模擬場景包含常規(guī)運(yùn)行環(huán)境和極端運(yùn)行環(huán)境,模擬資源包含硬件資源、軟件資源.
本實(shí)驗(yàn)在部署于Kubernetes 集群的分布式TiDB 數(shù)據(jù)庫中執(zhí)行,數(shù)據(jù)庫節(jié)點(diǎn)部署在Kubernetes集群的容器內(nèi),部署情況如圖2 所示.其中PD-0 是調(diào)度節(jié)點(diǎn),負(fù)責(zé)數(shù)據(jù)庫集群的資源調(diào)度;3 個TiKV 節(jié)點(diǎn)都是數(shù)據(jù)存儲節(jié)點(diǎn);TiDB-0 是計(jì)算節(jié)點(diǎn),負(fù)責(zé)向調(diào)度節(jié)點(diǎn)請求數(shù)據(jù)的存儲位置,再向存儲節(jié)點(diǎn)請求數(shù)據(jù),最后將處理結(jié)果返回給客戶端.
本實(shí)驗(yàn)檢驗(yàn)了TiDB 數(shù)據(jù)庫在運(yùn)行TPC-C[30]負(fù)載期間遭遇各類環(huán)境模擬負(fù)載時發(fā)生的性能變化.實(shí)驗(yàn)使用SF=90 的TPC-C 負(fù)載,每次實(shí)驗(yàn)執(zhí)行TPC-C 負(fù)載400 s,共有90 個線程并發(fā)執(zhí)行TPC-C負(fù)載,每個線程每秒發(fā)送10 000 個事務(wù)處理請求.在TPC-C 負(fù)載運(yùn)行120 s 后開始執(zhí)行環(huán)境模擬負(fù)載.實(shí)驗(yàn)一共進(jìn)行了30 次,最終結(jié)果取平均值.
5.3.1 動態(tài)環(huán)境模擬負(fù)載
為配合環(huán)境模擬工具的使用,本工作設(shè)計(jì)了一套環(huán)境負(fù)載描述語言,讓用戶更加方便、靈活地實(shí)現(xiàn)自定義環(huán)境場景的模擬.
由于TPC-C 的各類事務(wù)中包含密集的讀、寫操作,執(zhí)行TPC-C 負(fù)載時TiDB 需要頻繁地與PD和TiKV 進(jìn)行網(wǎng)絡(luò)通信來請求數(shù)據(jù),TiKV 上會有較大的磁盤操作壓力.本實(shí)驗(yàn)針對這些負(fù)載行為特征,使用環(huán)境負(fù)載描述語言書寫了一份動態(tài)環(huán)境模擬的案例,內(nèi)容見表4.該負(fù)載包含2 個并發(fā)子塊的并發(fā)執(zhí)行負(fù)載,包含2 個并發(fā)子塊的并發(fā)執(zhí)行負(fù)載.不同并發(fā)子塊間的負(fù)載會并發(fā)執(zhí)行,并發(fā)子塊內(nèi)的負(fù)載內(nèi)容會按行順序執(zhí)行.表4 的行2 到行4 是第一個并發(fā)子塊的內(nèi)容,分別執(zhí)行占用tikv-0 所在容器的CPU、tikv-1 所在容器的磁盤讀I/O、終止tikv-1 的進(jìn)程;行6 到行8 是第二個并發(fā)子塊的內(nèi)容,分別要執(zhí)行限制tidb-0 所在容器的網(wǎng)絡(luò)帶寬、占用tikv-2 所在容器的磁盤讀I/O,終止tikv-2 進(jìn)程.
表4 動態(tài)環(huán)境模擬負(fù)載Tab.4 Dynamic environment simulation workload
5.3.2 數(shù)據(jù)庫性能變化
本實(shí)驗(yàn)將注入環(huán)境模擬負(fù)載前數(shù)據(jù)庫吞吐量的峰值視為100%.注入環(huán)境負(fù)載期間,數(shù)據(jù)庫的性能變化如圖13 所示.
圖13 TiDB 數(shù)據(jù)庫的性能變化Fig.13 Performance changes of TiDB database
運(yùn)行環(huán)境模擬負(fù)載的前30 s (圖13 的120~ 150 s),由于環(huán)境負(fù)載占用了7 核CPU (系統(tǒng)CPU 總核數(shù)的87.5%),同時限制網(wǎng)絡(luò)帶寬為原始大小的80%,在此期間數(shù)據(jù)庫的平均吞吐量下降到約10%;之后的30 s,環(huán)境負(fù)載對CPU 的占用減少到4 核,對網(wǎng)絡(luò)帶寬的限制放寬到原始帶寬大小的90%,期間數(shù)據(jù)庫的平均吞吐量回升到50%左右;后30 s,環(huán)境負(fù)載對CPU 的占用減少到2 核,但是限制網(wǎng)絡(luò)帶寬大小為原始大小的10%,數(shù)據(jù)庫的吞吐量驟降到10%.這驗(yàn)證了本工具可以模擬無故障情況下的常規(guī)運(yùn)行環(huán)境,可幫助測試數(shù)據(jù)庫服務(wù)性能的穩(wěn)定性,即數(shù)據(jù)庫系統(tǒng)服務(wù)質(zhì)量受部署環(huán)境動態(tài)變化的影響情況.
對CPU 和網(wǎng)絡(luò)帶寬的消耗結(jié)束后,環(huán)境模擬負(fù)載開始占用磁盤的讀I/O (圖13 的210~ 240 s),首先占用3 000 IOPS (約是磁盤IOPS 上限的60%),期間數(shù)據(jù)庫的性能只有40%左右,后30 s 內(nèi),環(huán)境模擬負(fù)載只占用1 000 IOPS (約是磁盤IOPS 上限的20%),期間數(shù)據(jù)庫的性能恢復(fù)到原吞吐峰值的65%左右.這說明當(dāng)可使用的磁盤資源不足時,數(shù)據(jù)庫處理磁盤操作密集型負(fù)載的速度會被限制.
占用磁盤的讀I/O 結(jié)束后,環(huán)境模擬負(fù)載將tikv-1 和tikv-2 的進(jìn)程終止.TiDB 數(shù)據(jù)庫花費(fèi)約30 s(圖13 的270~ 300 s) 將被終止的tikv 自動重啟,在進(jìn)程恢復(fù)期間數(shù)據(jù)庫的吞吐量為0,說明對事務(wù)的處理被迫中止;tikv 進(jìn)程恢復(fù)后,數(shù)據(jù)庫的性能逐漸回升,在70 s 后大致恢復(fù)到環(huán)境模擬負(fù)載執(zhí)行前的性能水平.這驗(yàn)證了本工具可以實(shí)現(xiàn)對數(shù)據(jù)庫進(jìn)程等軟件資源的破壞,可模擬極端的運(yùn)行場景,可以幫助測試數(shù)據(jù)庫運(yùn)行的高可用性和容錯性.
本文分析了數(shù)據(jù)庫在開放環(huán)境下運(yùn)行可能會遇到的關(guān)鍵問題,提出并定義了模擬環(huán)境狀態(tài)的有效負(fù)載,完成對環(huán)境狀態(tài)的建模,并基于Woodpecker 測試框架設(shè)計(jì)且實(shí)現(xiàn)了一個全面、通用的數(shù)據(jù)庫運(yùn)行環(huán)境動態(tài)模擬工具,可用于評測數(shù)據(jù)庫系統(tǒng)服務(wù)的可靠性、穩(wěn)定性.該工具可生成對硬件資源以及針對數(shù)據(jù)庫軟件資源的指定強(qiáng)度的環(huán)境負(fù)載,達(dá)成對各類資源消耗場景的準(zhǔn)確模擬.本工具可以方便用戶高效地實(shí)現(xiàn)自定義環(huán)境負(fù)載,降低數(shù)據(jù)庫測試工作難度,實(shí)驗(yàn)驗(yàn)證了其優(yōu)越性.
本文針對數(shù)據(jù)庫外部的運(yùn)行環(huán)境設(shè)計(jì)了這個環(huán)境模擬工具,但數(shù)據(jù)庫內(nèi)部的運(yùn)行環(huán)境也是高度復(fù)雜,有研究、模擬的價值.今后會將數(shù)據(jù)庫內(nèi)部的運(yùn)行環(huán)境模擬作為未來工作,進(jìn)一步擴(kuò)展該環(huán)境模擬工具.