張玉中,浮明軍,李國(guó)杰,常 衛(wèi),楊豐源,谷 威
(許繼電氣股份有限公司 中試部,許昌 461000)
隨著大數(shù)據(jù)、云服務(wù)等新技術(shù)的出現(xiàn),原有傳統(tǒng)型數(shù)據(jù)庫(kù),很難滿足新系統(tǒng)對(duì)數(shù)據(jù)操作的需求,為提高數(shù)據(jù)訪問(wèn)速度,內(nèi)存非關(guān)系型數(shù)據(jù)庫(kù)—實(shí)時(shí)庫(kù)在新系統(tǒng)中的應(yīng)用越來(lái)越廣泛[1].評(píng)價(jià)一個(gè)實(shí)時(shí)庫(kù)的好壞,首先功能是否完備,性能是否滿足要求是兩個(gè)至關(guān)重要的指標(biāo).功能完備性是實(shí)時(shí)庫(kù)的基本要求,當(dāng)前的主流實(shí)時(shí)庫(kù)系統(tǒng)都能滿足需要,性能的優(yōu)越性成了評(píng)價(jià)實(shí)時(shí)庫(kù)的首要指標(biāo).
目前,實(shí)時(shí)庫(kù)測(cè)試特別是性能測(cè)試目前主要有兩大難點(diǎn):(1)在Linux 系統(tǒng)上沒(méi)有成熟實(shí)時(shí)庫(kù)測(cè)試工具;(2)由于使用實(shí)時(shí)庫(kù)的新系統(tǒng)規(guī)模龐大,開(kāi)發(fā)周期長(zhǎng),短期內(nèi)很難搭建集成測(cè)試環(huán)境,即沒(méi)有完善的測(cè)試環(huán)境.針對(duì)以上情況,根據(jù)實(shí)時(shí)庫(kù)在新系統(tǒng)中的使用特性設(shè)計(jì)開(kāi)發(fā)了實(shí)時(shí)庫(kù)測(cè)試系統(tǒng)[2],該測(cè)試系統(tǒng)能很好的支持實(shí)時(shí)庫(kù)的性能測(cè)試和功能測(cè)試,在一定程度上解決了目前實(shí)時(shí)庫(kù)測(cè)試所面臨的兩大難題.
根據(jù)實(shí)際應(yīng)用系統(tǒng)的業(yè)務(wù)特性及運(yùn)行環(huán)境分析,影響實(shí)時(shí)庫(kù)實(shí)時(shí)性的因素主要包括:批量讀寫、并發(fā)操作、內(nèi)存占用情況和網(wǎng)絡(luò)使用情況等,接下來(lái)對(duì)以上幾種因素做具體分析.
測(cè)試檢驗(yàn)一次處理單條數(shù)據(jù)和一次處理多條數(shù)據(jù)對(duì)實(shí)時(shí)庫(kù)模塊的效率的影響,具體影響程度需要進(jìn)一步測(cè)試檢驗(yàn).測(cè)試方法是改變測(cè)試用例,把一定數(shù)量的數(shù)據(jù)如(100 萬(wàn)條數(shù)據(jù))按一次處理一條,與一次處理多條,并且一次處理?xiàng)l數(shù)逐漸增加,統(tǒng)計(jì)處理完這100 萬(wàn)條數(shù)據(jù)所用時(shí)間.測(cè)試的目的就是要弄清楚批量和非批量處理之間的差別.
實(shí)時(shí)庫(kù)一般為單線程處理,面對(duì)高并發(fā)請(qǐng)求,采用隊(duì)列模式將并發(fā)訪問(wèn)變?yōu)榇性L問(wèn),其本身沒(méi)有鎖的概念,在實(shí)時(shí)庫(kù)客戶端對(duì)實(shí)時(shí)庫(kù)服務(wù)器進(jìn)行并發(fā)訪問(wèn)時(shí)會(huì)發(fā)生連接超時(shí)、數(shù)據(jù)轉(zhuǎn)換錯(cuò)誤、阻塞、客戶端關(guān)閉連接等問(wèn)題,這些問(wèn)題均是由于客戶端連接混亂造成[3,4].測(cè)試方法是采用幾十個(gè)客戶端同時(shí)向?qū)崟r(shí)庫(kù)服務(wù)器發(fā)送數(shù)據(jù),統(tǒng)計(jì)記錄服務(wù)器處理時(shí)間.
測(cè)試檢驗(yàn)系統(tǒng)內(nèi)存余量對(duì)實(shí)時(shí)庫(kù)服務(wù)器實(shí)時(shí)性的影響,具體影響程度需要進(jìn)一步測(cè)試檢驗(yàn)[5].測(cè)試方法是改變測(cè)試用例,分別在初始條件和滿內(nèi)存情況下進(jìn)行基礎(chǔ)實(shí)時(shí)性測(cè)試.
(1)初始條件:剛啟動(dòng)實(shí)時(shí)庫(kù)時(shí)進(jìn)行,內(nèi)存占用900 MB/31.3 GB,通過(guò)測(cè)試軟件執(zhí)行測(cè)試,統(tǒng)計(jì)性能數(shù)據(jù),進(jìn)行基礎(chǔ)性能測(cè)試.
(2)滿內(nèi)存:向?qū)崟r(shí)庫(kù)中寫入數(shù)據(jù)使內(nèi)存占用30.1 GB/31.3 GB,通過(guò)測(cè)試系統(tǒng)執(zhí)行測(cè)試,統(tǒng)計(jì)性能數(shù)據(jù),進(jìn)行基礎(chǔ)性能測(cè)試.
測(cè)試檢驗(yàn)實(shí)時(shí)庫(kù)服務(wù)器網(wǎng)絡(luò)部署對(duì)實(shí)時(shí)庫(kù)模塊的效率的影響,具體影響程度需要進(jìn)一步測(cè)試檢驗(yàn).測(cè)試方法是改變測(cè)試用例,通過(guò)網(wǎng)絡(luò)部署實(shí)時(shí)庫(kù)服務(wù)器與本機(jī)部署進(jìn)行測(cè)試對(duì)比,檢驗(yàn)網(wǎng)絡(luò)對(duì)實(shí)時(shí)庫(kù)模塊效率影響.
實(shí)時(shí)庫(kù)測(cè)試系統(tǒng)的整體結(jié)構(gòu)如圖1所示,軟件部分主要包括實(shí)時(shí)庫(kù)測(cè)試軟件,實(shí)時(shí)庫(kù)客戶端和實(shí)時(shí)庫(kù)服務(wù)端,(需要說(shuō)明的是實(shí)時(shí)庫(kù)客戶端是以插件的形式嵌入到測(cè)試軟件中了);硬件部分包括部署測(cè)試軟件和實(shí)時(shí)庫(kù)客戶端的PC 機(jī),部署實(shí)時(shí)庫(kù)服務(wù)的PC 機(jī),以及連接服務(wù)端與客戶端的千兆交換機(jī).具體使用時(shí),如果不考慮網(wǎng)絡(luò)對(duì)實(shí)時(shí)庫(kù)的影響,也可以把測(cè)試軟件、實(shí)時(shí)庫(kù)客戶端和服務(wù)端統(tǒng)一部署在一臺(tái)PC 機(jī)上,這樣可 以不用千兆交換機(jī).
圖1 實(shí)時(shí)庫(kù)測(cè)試系統(tǒng)整體結(jié)構(gòu)圖
測(cè)試系統(tǒng)軟件的功能結(jié)構(gòu)如下圖2所示,該實(shí)時(shí)庫(kù)測(cè)試系統(tǒng)的軟件部分主要包括測(cè)試用例編輯模塊、測(cè)試用例執(zhí)行模塊、測(cè)試結(jié)果判定模塊、性能指標(biāo)統(tǒng)計(jì)模塊和測(cè)試報(bào)告生成模塊等五個(gè)功能模塊[6,7],以下具 體介紹每個(gè)模塊的功能及其實(shí)現(xiàn)機(jī)制.
2.2.1 測(cè)試用例生成模塊主要功能及實(shí)現(xiàn)機(jī)制
測(cè)試用例生成模塊的主要功能是自動(dòng)生成測(cè)試數(shù)據(jù),為了便于統(tǒng)計(jì)數(shù)據(jù)大小,這里數(shù)據(jù)類型統(tǒng)一使用字符型,可以單個(gè)添加數(shù)據(jù),也可以批量生成大量數(shù)據(jù).生成測(cè)試數(shù)據(jù)時(shí),按用戶指定行數(shù)和每行字節(jié)數(shù)生成測(cè)試數(shù)據(jù).
2.2.2 測(cè)試執(zhí)行主要功能及實(shí)現(xiàn)機(jī)制
測(cè)試執(zhí)行送模塊主要功能是通過(guò)調(diào)用客戶端提供的接口實(shí)現(xiàn)與實(shí)時(shí)庫(kù)服務(wù)器建立鏈接并寫數(shù)據(jù)到服務(wù)器.在執(zhí)行用例時(shí)可以選擇的測(cè)試項(xiàng)有:功能測(cè)試、性能測(cè)試、同步測(cè)試、異步測(cè)試、并發(fā)測(cè)試和拷機(jī)等測(cè)試類型,以及哈希、字符串、集合三種存儲(chǔ)結(jié)構(gòu)體的任一種進(jìn)行測(cè)試執(zhí)行.
當(dāng)選擇功能測(cè)試時(shí),測(cè)試執(zhí)行結(jié)果打印到控制臺(tái)上,這樣測(cè)試軟件自動(dòng)判定測(cè)試結(jié)果的同時(shí),測(cè)試人員也可以人工抽查判定,能夠增加測(cè)試的可靠性,功能測(cè)試時(shí),三種存儲(chǔ)結(jié)構(gòu)可以同時(shí)測(cè)試.選擇性能測(cè)試時(shí),由于測(cè)試結(jié)果的打印會(huì)影響性能,為了提高測(cè)試的精度,就不在打印測(cè)試結(jié)果數(shù)據(jù),性能測(cè)試時(shí),需要統(tǒng)計(jì)性能數(shù)據(jù),只能選擇一種存儲(chǔ)結(jié)構(gòu)進(jìn)行測(cè)試.同步測(cè)試與異步測(cè)試分別對(duì)應(yīng)客戶端提供的同步接口和異步接口,實(shí)時(shí)庫(kù)只有在寫時(shí)才分同步和異步,主要區(qū)別是同步寫時(shí),寫數(shù)據(jù)接口會(huì)有返回值,通過(guò)返回值可以判斷實(shí)時(shí)庫(kù)是否寫成功.并發(fā)測(cè)試和拷機(jī)測(cè)試都是對(duì)實(shí)時(shí)庫(kù)穩(wěn)定性的測(cè)試,測(cè)試時(shí)通常同時(shí)進(jìn)行.
2.2.3 測(cè)試結(jié)果判定主要功能及實(shí)現(xiàn)機(jī)制
測(cè)試結(jié)果判定模塊主要功能是從服務(wù)器讀數(shù)據(jù)并與寫入數(shù)據(jù)進(jìn)行比較,若一致則實(shí)時(shí)庫(kù)讀寫功能正常,反之讀寫功能異常,需要進(jìn)一步判定是寫異?;蜃x異常.其實(shí)現(xiàn)機(jī)制是調(diào)用實(shí)時(shí)庫(kù)客戶端提供的讀接口,讀取數(shù)據(jù)并與測(cè)試數(shù)據(jù)進(jìn)行比較,自動(dòng)判定測(cè)試結(jié)果.
2.2.4 性能指標(biāo)數(shù)據(jù)統(tǒng)計(jì)功能及實(shí)現(xiàn)機(jī)制
性能指標(biāo)數(shù)據(jù)統(tǒng)計(jì)模塊主要功能是自動(dòng)統(tǒng)計(jì)并記錄實(shí)時(shí)庫(kù)處理數(shù)據(jù)的時(shí)間.在性能測(cè)試時(shí),操作時(shí)間的統(tǒng)計(jì),是從下達(dá)操作命令開(kāi)始,到操作結(jié)束.如果是同步寫測(cè)試,測(cè)試軟件可以通過(guò)寫數(shù)據(jù)接口的返回值判斷寫操作情況,從而能精確的統(tǒng)計(jì)寫操作時(shí)間;異步寫操作時(shí),由于接口函數(shù)沒(méi)有返回值,不了解寫操作情況,這里采用測(cè)試軟件通過(guò)讀到最后一條數(shù)據(jù)的時(shí)間判斷寫操作完成,對(duì)于寫上百級(jí)的數(shù)據(jù),操作一條數(shù)據(jù)的時(shí)間可以忽略.統(tǒng)計(jì)讀操作的時(shí)間是從下達(dá)讀操作命令開(kāi)始,讀到最后一條數(shù)據(jù)結(jié)束,能夠精確的統(tǒng)計(jì).
2.2.5 測(cè)試報(bào)告生成模塊的功能及實(shí)現(xiàn)機(jī)制
該模塊能夠根據(jù)用戶定制自動(dòng)生word 形式的成測(cè)試報(bào)告,如,按測(cè)試類型分,可以生成性能測(cè)試報(bào)告,功能測(cè)試報(bào)告;按測(cè)試用例分可以生成單個(gè)用例的測(cè)試報(bào)告或多個(gè)用例的測(cè)試報(bào)告.總之,測(cè)試報(bào)告的形式多種多樣,用戶可以靈活定制.
測(cè)試系統(tǒng)的工作流程如圖3所示,測(cè)試系統(tǒng)正常啟動(dòng)后,首先設(shè)計(jì)測(cè)試用例即生成測(cè)試數(shù)據(jù);如果選擇同步測(cè)試,調(diào)用實(shí)時(shí)庫(kù)客戶端提供的同步寫操作接口函數(shù).功能測(cè)試時(shí),調(diào)用實(shí)時(shí)庫(kù)客戶端提供的讀操作接口函數(shù);判定讀寫的測(cè)試數(shù)據(jù)是否一致,如果一致則實(shí)時(shí)庫(kù)讀寫操作功能正常,如果讀寫的測(cè)試數(shù)據(jù)不一致,則實(shí)時(shí)庫(kù)的讀或?qū)懖僮鞴δ墚惓?這時(shí)需要人工確認(rèn)異常.性能測(cè)試時(shí),測(cè)試系統(tǒng)自動(dòng)統(tǒng)計(jì)讀寫操作時(shí)間.拷機(jī)通常與并發(fā)測(cè)試同時(shí)進(jìn)行,調(diào)用實(shí)時(shí)庫(kù)客戶端提供的讀操作接口函數(shù);判定讀寫的測(cè)試數(shù)據(jù)是否一致,如果一致則實(shí)時(shí)庫(kù)讀寫操作功能正常,如果讀寫的測(cè)試數(shù)據(jù)不一致,則實(shí)時(shí)庫(kù)的讀或?qū)懖僮鞴δ墚惓?這時(shí)測(cè)試正常進(jìn)行只是統(tǒng)計(jì)記錄異常發(fā)生次數(shù),并統(tǒng)計(jì)拷機(jī)時(shí)間.
測(cè)試系統(tǒng)的軟件部分是在Linux 系統(tǒng)上采用Qt/C++開(kāi)發(fā)實(shí)現(xiàn)的,開(kāi)發(fā)環(huán)境使用Qt Creator.系統(tǒng)主界面如圖4所示,主界面中有哈希、字符串、列表三種存儲(chǔ)結(jié)構(gòu)體的選擇,即向?qū)崟r(shí)庫(kù)服務(wù)器寫數(shù)據(jù)時(shí)選擇的存儲(chǔ)結(jié)構(gòu);發(fā)送次數(shù)是連續(xù)向服務(wù)器寫的次數(shù);客戶端數(shù)是并發(fā)測(cè)試時(shí)同時(shí)幾個(gè)客戶端向服務(wù)器寫數(shù)據(jù);拷機(jī)延時(shí)是拷機(jī)時(shí),發(fā)送數(shù)據(jù)的時(shí)間間隔;數(shù)據(jù)類型統(tǒng)一采用字符型,可以單條生成數(shù)據(jù)也可以大批量生成數(shù)據(jù);最后就是時(shí)間統(tǒng)計(jì),即發(fā)送測(cè)試數(shù)據(jù)時(shí)間統(tǒng)計(jì)、接收測(cè)試數(shù)據(jù)時(shí)間統(tǒng)計(jì)和拷機(jī)時(shí)間記錄.
本測(cè)試系統(tǒng)在某公司大型新系統(tǒng)的研發(fā)測(cè)試過(guò)程中得到廣泛的應(yīng)用并進(jìn)行了不斷的完善,本次測(cè)試采用開(kāi)源實(shí)時(shí)庫(kù)redis-3.2.6 為測(cè)試對(duì)象.一臺(tái)PC 機(jī)做客戶端部署測(cè)試軟件和實(shí)時(shí)庫(kù)客戶端,一臺(tái)服務(wù)器部署redis 服務(wù),一臺(tái)千兆交換機(jī),系統(tǒng)整體部署結(jié)構(gòu)如圖1所示.具體硬件信息如表1.
應(yīng)用本測(cè)試系統(tǒng)分別對(duì)實(shí)時(shí)庫(kù)進(jìn)行大批量的讀寫操作,測(cè)試其功能、性能,以及并發(fā)、內(nèi)存、網(wǎng)絡(luò)對(duì)其性能的影響.具體測(cè)試情況如下.
選擇string 存儲(chǔ)結(jié)構(gòu)體做測(cè)試對(duì)象,應(yīng)用測(cè)試系統(tǒng)進(jìn)行測(cè)試,測(cè)試結(jié)果如表2.
通過(guò)測(cè)試結(jié)果發(fā)現(xiàn),redis 實(shí)時(shí)庫(kù)在處理數(shù)據(jù)時(shí),將一次處理單條數(shù)據(jù)改為一次處理多條,讀寫性能顯著提高.所以在開(kāi)發(fā)過(guò)程中建議使用批量處理,即每次發(fā)送多條數(shù)據(jù),以提高實(shí)時(shí)庫(kù)的性能.
選擇string 存儲(chǔ)結(jié)構(gòu)體做測(cè)試對(duì)象,應(yīng)用測(cè)試系統(tǒng)進(jìn)行測(cè)試,測(cè)試結(jié)果如表3.
經(jīng)過(guò)測(cè)試發(fā)現(xiàn),redis 在并發(fā)操作中性能提高明顯,建議適當(dāng)使用并發(fā)操作,以提高redis 時(shí)庫(kù)模塊讀寫性能.
圖3 實(shí)時(shí)庫(kù)測(cè)試系統(tǒng)工作流程圖
圖4 實(shí)時(shí)庫(kù)測(cè)試軟件框架主界面
表1 測(cè)試系統(tǒng)硬件配置信息
表2 String 類型的value 值為4 字節(jié)(單位:ms)
表3 統(tǒng)計(jì)Redis 進(jìn)行1 000 000 次訪問(wèn)的性能(單位:r/s 每 秒處理的請(qǐng)求個(gè)數(shù))
為測(cè)試系統(tǒng)內(nèi)存余量對(duì)redis 性能的影響,分別在初始條件和滿內(nèi)存情況下進(jìn)行基礎(chǔ)性能測(cè)試,具體測(cè)試如下 (該數(shù)據(jù)在單機(jī)模式下統(tǒng)計(jì)).
1)初始條件:剛啟動(dòng)redis-server 時(shí)進(jìn)行,內(nèi)存占用900 MB/31.3 GB,應(yīng)用測(cè)試系統(tǒng),進(jìn)行基礎(chǔ)性能測(cè)試.
2)滿內(nèi)存:向redis 實(shí)時(shí)庫(kù)中寫入數(shù)據(jù)使內(nèi)存占用30.1 G/31.3 G,應(yīng)用測(cè)試系統(tǒng),進(jìn)行基礎(chǔ)性能測(cè)試.
3)單位:r/s(每秒處理請(qǐng)求個(gè)數(shù)).
具體測(cè)試結(jié)果如表4所示.
表4 redis 實(shí)時(shí)庫(kù)在不同內(nèi)存占用情況下的處理能力
經(jīng)測(cè)試發(fā)現(xiàn),系統(tǒng)內(nèi)存被耗盡時(shí)系統(tǒng)極不穩(wěn)定,滿內(nèi)存操作時(shí)命令執(zhí)行失敗一次.性能較差,建議使用4 倍容量的內(nèi)存.
不同部署方式下的服務(wù)器每秒處理請(qǐng)求數(shù),應(yīng)用測(cè)試系統(tǒng)進(jìn)行測(cè)試,如表5所示.
表5 網(wǎng)絡(luò)部署和本機(jī)部署的性能比較
經(jīng)測(cè)試發(fā)現(xiàn),redis 服務(wù)在處理數(shù)據(jù)時(shí)受網(wǎng)絡(luò)影響非常大,如果本機(jī)部署redis,能獲取10 到20 倍的性能.集群情況下,網(wǎng)絡(luò)硬件、網(wǎng)速要求一定要高.盡量減少遠(yuǎn)程寫redis 服務(wù)的情況,采用本機(jī)部署redis 服務(wù)可以提高redis 寫數(shù)據(jù)的速度.
使用本測(cè)試系統(tǒng)進(jìn)行功能測(cè)試時(shí),發(fā)現(xiàn)兩個(gè)典型問(wèn)題:(1)大批量異步寫操作時(shí)有寫失敗的情況存在,最終經(jīng)多次測(cè)試驗(yàn)證得出,異步寫超過(guò)1000 萬(wàn)條數(shù)據(jù)時(shí),實(shí)時(shí)庫(kù)服務(wù)寫服務(wù)出現(xiàn)異常,有寫失敗情況.(2)非法寫操作時(shí),實(shí)時(shí)庫(kù)服務(wù)異常退出.性能測(cè)試時(shí),除了掌握以上性能規(guī)律外,還發(fā)現(xiàn)了一個(gè)有價(jià)值的問(wèn)題,當(dāng)大批量異步寫操作時(shí),CPU 占用100%,(當(dāng)大批量異步寫操作時(shí)實(shí)時(shí)庫(kù)服務(wù)消耗CPU 資源都比較多,因?yàn)楫惒綄懖僮鲀纱尾僮髦g沒(méi)有時(shí)間間隔,頻繁寫操作,實(shí)時(shí)庫(kù)服務(wù)出現(xiàn)異常)并提出很多寶貴的性能優(yōu)化建議.以上問(wèn)題及建議得到了研發(fā)人員的高度認(rèn)可,充分體現(xiàn)了本測(cè)試系統(tǒng)的價(jià)值.
影響實(shí)時(shí)庫(kù)數(shù)據(jù)處理能力的因素有很多,在對(duì)實(shí)時(shí)庫(kù)(redis)為基礎(chǔ)的實(shí)時(shí)庫(kù)影響因素進(jìn)行分析的基礎(chǔ)上,設(shè)計(jì)并開(kāi)發(fā)了一套實(shí)用性很強(qiáng)的實(shí)時(shí)庫(kù)測(cè)試系統(tǒng).經(jīng)實(shí)際項(xiàng)目應(yīng)用并完善,目前,該測(cè)試系統(tǒng)簡(jiǎn)單易用,能在很大程度上提高測(cè)試的效率和可靠性,從而進(jìn)一步提升測(cè)試的整體質(zhì)量.并且該測(cè)試系統(tǒng)有較好的通用性,其他類似軟件的測(cè)試稍作修改也可以使用.