張玉中,浮明軍,李國杰,常 衛,楊豐源,谷 威
(許繼電氣股份有限公司 中試部,許昌 461000)
隨著大數據、云服務等新技術的出現,原有傳統型數據庫,很難滿足新系統對數據操作的需求,為提高數據訪問速度,內存非關系型數據庫—實時庫在新系統中的應用越來越廣泛[1].評價一個實時庫的好壞,首先功能是否完備,性能是否滿足要求是兩個至關重要的指標.功能完備性是實時庫的基本要求,當前的主流實時庫系統都能滿足需要,性能的優越性成了評價實時庫的首要指標.
目前,實時庫測試特別是性能測試目前主要有兩大難點:(1)在Linux 系統上沒有成熟實時庫測試工具;(2)由于使用實時庫的新系統規模龐大,開發周期長,短期內很難搭建集成測試環境,即沒有完善的測試環境.針對以上情況,根據實時庫在新系統中的使用特性設計開發了實時庫測試系統[2],該測試系統能很好的支持實時庫的性能測試和功能測試,在一定程度上解決了目前實時庫測試所面臨的兩大難題.
根據實際應用系統的業務特性及運行環境分析,影響實時庫實時性的因素主要包括:批量讀寫、并發操作、內存占用情況和網絡使用情況等,接下來對以上幾種因素做具體分析.
測試檢驗一次處理單條數據和一次處理多條數據對實時庫模塊的效率的影響,具體影響程度需要進一步測試檢驗.測試方法是改變測試用例,把一定數量的數據如(100 萬條數據)按一次處理一條,與一次處理多條,并且一次處理條數逐漸增加,統計處理完這100 萬條數據所用時間.測試的目的就是要弄清楚批量和非批量處理之間的差別.
實時庫一般為單線程處理,面對高并發請求,采用隊列模式將并發訪問變為串行訪問,其本身沒有鎖的概念,在實時庫客戶端對實時庫服務器進行并發訪問時會發生連接超時、數據轉換錯誤、阻塞、客戶端關閉連接等問題,這些問題均是由于客戶端連接混亂造成[3,4].測試方法是采用幾十個客戶端同時向實時庫服務器發送數據,統計記錄服務器處理時間.
測試檢驗系統內存余量對實時庫服務器實時性的影響,具體影響程度需要進一步測試檢驗[5].測試方法是改變測試用例,分別在初始條件和滿內存情況下進行基礎實時性測試.
(1)初始條件:剛啟動實時庫時進行,內存占用900 MB/31.3 GB,通過測試軟件執行測試,統計性能數據,進行基礎性能測試.
(2)滿內存:向實時庫中寫入數據使內存占用30.1 GB/31.3 GB,通過測試系統執行測試,統計性能數據,進行基礎性能測試.
測試檢驗實時庫服務器網絡部署對實時庫模塊的效率的影響,具體影響程度需要進一步測試檢驗.測試方法是改變測試用例,通過網絡部署實時庫服務器與本機部署進行測試對比,檢驗網絡對實時庫模塊效率影響.
實時庫測試系統的整體結構如圖1所示,軟件部分主要包括實時庫測試軟件,實時庫客戶端和實時庫服務端,(需要說明的是實時庫客戶端是以插件的形式嵌入到測試軟件中了);硬件部分包括部署測試軟件和實時庫客戶端的PC 機,部署實時庫服務的PC 機,以及連接服務端與客戶端的千兆交換機.具體使用時,如果不考慮網絡對實時庫的影響,也可以把測試軟件、實時庫客戶端和服務端統一部署在一臺PC 機上,這樣可 以不用千兆交換機.

圖1 實時庫測試系統整體結構圖
測試系統軟件的功能結構如下圖2所示,該實時庫測試系統的軟件部分主要包括測試用例編輯模塊、測試用例執行模塊、測試結果判定模塊、性能指標統計模塊和測試報告生成模塊等五個功能模塊[6,7],以下具 體介紹每個模塊的功能及其實現機制.
2.2.1 測試用例生成模塊主要功能及實現機制
測試用例生成模塊的主要功能是自動生成測試數據,為了便于統計數據大小,這里數據類型統一使用字符型,可以單個添加數據,也可以批量生成大量數據.生成測試數據時,按用戶指定行數和每行字節數生成測試數據.
2.2.2 測試執行主要功能及實現機制
測試執行送模塊主要功能是通過調用客戶端提供的接口實現與實時庫服務器建立鏈接并寫數據到服務器.在執行用例時可以選擇的測試項有:功能測試、性能測試、同步測試、異步測試、并發測試和拷機等測試類型,以及哈希、字符串、集合三種存儲結構體的任一種進行測試執行.
當選擇功能測試時,測試執行結果打印到控制臺上,這樣測試軟件自動判定測試結果的同時,測試人員也可以人工抽查判定,能夠增加測試的可靠性,功能測試時,三種存儲結構可以同時測試.選擇性能測試時,由于測試結果的打印會影響性能,為了提高測試的精度,就不在打印測試結果數據,性能測試時,需要統計性能數據,只能選擇一種存儲結構進行測試.同步測試與異步測試分別對應客戶端提供的同步接口和異步接口,實時庫只有在寫時才分同步和異步,主要區別是同步寫時,寫數據接口會有返回值,通過返回值可以判斷實時庫是否寫成功.并發測試和拷機測試都是對實時庫穩定性的測試,測試時通常同時進行.
2.2.3 測試結果判定主要功能及實現機制
測試結果判定模塊主要功能是從服務器讀數據并與寫入數據進行比較,若一致則實時庫讀寫功能正常,反之讀寫功能異常,需要進一步判定是寫異常或讀異常.其實現機制是調用實時庫客戶端提供的讀接口,讀取數據并與測試數據進行比較,自動判定測試結果.
2.2.4 性能指標數據統計功能及實現機制
性能指標數據統計模塊主要功能是自動統計并記錄實時庫處理數據的時間.在性能測試時,操作時間的統計,是從下達操作命令開始,到操作結束.如果是同步寫測試,測試軟件可以通過寫數據接口的返回值判斷寫操作情況,從而能精確的統計寫操作時間;異步寫操作時,由于接口函數沒有返回值,不了解寫操作情況,這里采用測試軟件通過讀到最后一條數據的時間判斷寫操作完成,對于寫上百級的數據,操作一條數據的時間可以忽略.統計讀操作的時間是從下達讀操作命令開始,讀到最后一條數據結束,能夠精確的統計.
2.2.5 測試報告生成模塊的功能及實現機制
該模塊能夠根據用戶定制自動生word 形式的成測試報告,如,按測試類型分,可以生成性能測試報告,功能測試報告;按測試用例分可以生成單個用例的測試報告或多個用例的測試報告.總之,測試報告的形式多種多樣,用戶可以靈活定制.
測試系統的工作流程如圖3所示,測試系統正常啟動后,首先設計測試用例即生成測試數據;如果選擇同步測試,調用實時庫客戶端提供的同步寫操作接口函數.功能測試時,調用實時庫客戶端提供的讀操作接口函數;判定讀寫的測試數據是否一致,如果一致則實時庫讀寫操作功能正常,如果讀寫的測試數據不一致,則實時庫的讀或寫操作功能異常,這時需要人工確認異常.性能測試時,測試系統自動統計讀寫操作時間.拷機通常與并發測試同時進行,調用實時庫客戶端提供的讀操作接口函數;判定讀寫的測試數據是否一致,如果一致則實時庫讀寫操作功能正常,如果讀寫的測試數據不一致,則實時庫的讀或寫操作功能異常,這時測試正常進行只是統計記錄異常發生次數,并統計拷機時間.
測試系統的軟件部分是在Linux 系統上采用Qt/C++開發實現的,開發環境使用Qt Creator.系統主界面如圖4所示,主界面中有哈希、字符串、列表三種存儲結構體的選擇,即向實時庫服務器寫數據時選擇的存儲結構;發送次數是連續向服務器寫的次數;客戶端數是并發測試時同時幾個客戶端向服務器寫數據;拷機延時是拷機時,發送數據的時間間隔;數據類型統一采用字符型,可以單條生成數據也可以大批量生成數據;最后就是時間統計,即發送測試數據時間統計、接收測試數據時間統計和拷機時間記錄.
本測試系統在某公司大型新系統的研發測試過程中得到廣泛的應用并進行了不斷的完善,本次測試采用開源實時庫redis-3.2.6 為測試對象.一臺PC 機做客戶端部署測試軟件和實時庫客戶端,一臺服務器部署redis 服務,一臺千兆交換機,系統整體部署結構如圖1所示.具體硬件信息如表1.
應用本測試系統分別對實時庫進行大批量的讀寫操作,測試其功能、性能,以及并發、內存、網絡對其性能的影響.具體測試情況如下.
選擇string 存儲結構體做測試對象,應用測試系統進行測試,測試結果如表2.
通過測試結果發現,redis 實時庫在處理數據時,將一次處理單條數據改為一次處理多條,讀寫性能顯著提高.所以在開發過程中建議使用批量處理,即每次發送多條數據,以提高實時庫的性能.
選擇string 存儲結構體做測試對象,應用測試系統進行測試,測試結果如表3.
經過測試發現,redis 在并發操作中性能提高明顯,建議適當使用并發操作,以提高redis 時庫模塊讀寫性能.

圖3 實時庫測試系統工作流程圖

圖4 實時庫測試軟件框架主界面

表1 測試系統硬件配置信息

表2 String 類型的value 值為4 字節(單位:ms)

表3 統計Redis 進行1 000 000 次訪問的性能(單位:r/s 每 秒處理的請求個數)
為測試系統內存余量對redis 性能的影響,分別在初始條件和滿內存情況下進行基礎性能測試,具體測試如下 (該數據在單機模式下統計).
1)初始條件:剛啟動redis-server 時進行,內存占用900 MB/31.3 GB,應用測試系統,進行基礎性能測試.
2)滿內存:向redis 實時庫中寫入數據使內存占用30.1 G/31.3 G,應用測試系統,進行基礎性能測試.
3)單位:r/s(每秒處理請求個數).
具體測試結果如表4所示.

表4 redis 實時庫在不同內存占用情況下的處理能力
經測試發現,系統內存被耗盡時系統極不穩定,滿內存操作時命令執行失敗一次.性能較差,建議使用4 倍容量的內存.
不同部署方式下的服務器每秒處理請求數,應用測試系統進行測試,如表5所示.

表5 網絡部署和本機部署的性能比較
經測試發現,redis 服務在處理數據時受網絡影響非常大,如果本機部署redis,能獲取10 到20 倍的性能.集群情況下,網絡硬件、網速要求一定要高.盡量減少遠程寫redis 服務的情況,采用本機部署redis 服務可以提高redis 寫數據的速度.
使用本測試系統進行功能測試時,發現兩個典型問題:(1)大批量異步寫操作時有寫失敗的情況存在,最終經多次測試驗證得出,異步寫超過1000 萬條數據時,實時庫服務寫服務出現異常,有寫失敗情況.(2)非法寫操作時,實時庫服務異常退出.性能測試時,除了掌握以上性能規律外,還發現了一個有價值的問題,當大批量異步寫操作時,CPU 占用100%,(當大批量異步寫操作時實時庫服務消耗CPU 資源都比較多,因為異步寫操作兩次操作之間沒有時間間隔,頻繁寫操作,實時庫服務出現異常)并提出很多寶貴的性能優化建議.以上問題及建議得到了研發人員的高度認可,充分體現了本測試系統的價值.
影響實時庫數據處理能力的因素有很多,在對實時庫(redis)為基礎的實時庫影響因素進行分析的基礎上,設計并開發了一套實用性很強的實時庫測試系統.經實際項目應用并完善,目前,該測試系統簡單易用,能在很大程度上提高測試的效率和可靠性,從而進一步提升測試的整體質量.并且該測試系統有較好的通用性,其他類似軟件的測試稍作修改也可以使用.