于 澎,劉文韜,朱建生,任貝貝
(中國鐵道科學(xué)研究院 電子計算技術(shù)研究所, 北京 100081)
研究與開發(fā)
goTicket性能測試平臺的開發(fā)與應(yīng)用
于 澎,劉文韜,朱建生,任貝貝
(中國鐵道科學(xué)研究院 電子計算技術(shù)研究所, 北京 100081)
為滿足對互聯(lián)網(wǎng)售票系統(tǒng)進行大并發(fā)模擬測試的需求,基于開源Grinder框架設(shè)計開發(fā)goTicket性能測試平臺,并應(yīng)用該平臺對系統(tǒng)進行壓力測試和性能調(diào)優(yōu)。
互聯(lián)網(wǎng)售票;壓力測試;Grinder;性能調(diào)優(yōu)
12306互聯(lián)網(wǎng)售票系統(tǒng)的研發(fā)與應(yīng)用,拓展了購票渠道,使旅客出行購票變得更加方便快捷。隨著訂票用戶的逐漸增加,旅客購票習(xí)慣的不斷改變和訂票功能的持續(xù)優(yōu)化,系統(tǒng)最大日售票量已超過500萬張,超過全路日售票量的50%。系統(tǒng)實時處理大量用戶訂票并發(fā)請求,并確保交易準確、完整,尤其在預(yù)售國慶節(jié)、春節(jié)車票期間,系統(tǒng)承擔(dān)著巨大壓力。系統(tǒng)處理用戶請求速度快慢,響應(yīng)時間長短,直接影響著用戶對系統(tǒng)的體驗度。因此,在系統(tǒng)上線前,有必要對系統(tǒng)進行性能測試,并對其進行性能調(diào)優(yōu),確保系統(tǒng)功能在大并發(fā)請求下正常穩(wěn)定運行。
目前業(yè)界有多種性能測試工具可用,如Load-Runner,它功能強大,支持眾多常用協(xié)議,但是由于是商業(yè)產(chǎn)品,其需要依照并發(fā)用戶數(shù)和協(xié)議購買指定時間內(nèi)的授權(quán),并且軟件較龐大,對系統(tǒng)配置要求較高;Compuware Gomez是一款擁有云服務(wù)器的性能測試工具,需要協(xié)調(diào)各地云服務(wù)器來產(chǎn)生壓力,所以每次測試準備和運行的周期較長,使用費用昂貴。眾多開源免費的性能測試工具,如Jmeter、Tsung、Grinder等,對模擬互聯(lián)網(wǎng)用戶請求有較好的支持,但較少支持其它協(xié)議,缺少對測試結(jié)果的分析展示,工具安裝部署比較繁瑣,操作使用不友好,因此用戶使用工具的學(xué)習(xí)成本較高,體驗度差。各種性能測試工具的對比如表1所示。
表1 各種性能測試工具對比
針對12306互聯(lián)網(wǎng)售票高并發(fā)的特點,適宜采用模擬HTTP協(xié)議的測試架構(gòu)進行壓力測試,其中Jmeter、Tsung和Grinder都可以模擬HTTP協(xié)議請求,但是Jmeter、Tsung架構(gòu)安裝配置比較復(fù)雜,Tsung運行環(huán)境中要求安裝并配置Erlang并發(fā)語言環(huán)境,并且兩種工具的測試腳本編寫不夠靈活,無法真實模擬用戶請求流量。Grinder自身結(jié)合了HTTPClient插件,對協(xié)議可以靈活處理,可以模擬訪問服務(wù)器的數(shù)據(jù)流量,測試腳本采用Jython語言編寫,可以采用Java第三方依賴包,可擴展性更強,腳本參數(shù)化也變得靈活。此外,Grinder架構(gòu)自身基于Java編寫,壓力系統(tǒng)較輕便,較容易對服務(wù)器產(chǎn)生壓力,工具容易使用,學(xué)習(xí)成本較低,因此可以采用Grinder性能測試工具對互聯(lián)網(wǎng)售票系統(tǒng)進行性能測試。
2.1 開源測試框架
Grinder是一套性能測試框架,如圖1所示,主要是由多臺機器同時運行測試腳本以實現(xiàn)對被測系統(tǒng)產(chǎn)生壓力,并實時收集運行場景的響應(yīng)時間和TPS等信息。整個測試框架由3部分組成,包括控制臺、代理進程和工作進程。其中,控制臺負責(zé)協(xié)調(diào)代理和工作進程,收集和顯示測試結(jié)果,提供測試腳本簡單編輯和分發(fā)功能;代理進程在后臺持續(xù)運行,主要負責(zé)啟動和停止工作進程,并接收控制臺發(fā)送的測試腳本進行本地緩存;工作進程主要任務(wù)是重復(fù)執(zhí)行測試腳本,每個進程可以有多個線程獨立的運行腳本,并將測試結(jié)果發(fā)送給控制臺。
圖1 Grinder性能測試框架圖
2.2 平臺改造
Grinder性能測試框架中控制臺為C/S架構(gòu),界面不友好,使用過程中測試結(jié)果無法實時展現(xiàn)。為了使之在對互聯(lián)網(wǎng)售票系統(tǒng)進行性能測試和調(diào)優(yōu)過程中能夠起到指導(dǎo)作用,有必要對其進行以下5方面的開發(fā)改造:(1)對其已有功能進行Web化改造;(2)對測試腳本進行版本控制;(3)對測試結(jié)果進行實時展示和保存;(4)對歷史結(jié)果可查看回放;(5)對系統(tǒng)架構(gòu)進行優(yōu)化,使系統(tǒng)易于安裝部署,實現(xiàn)可以根據(jù)壓力需求進行橫向拓展的目標(biāo)。
goTicket測試平臺采用Grinder開源測試框架并進行二次開發(fā),是一整套模擬12306用戶訂票業(yè)務(wù)的性能測試解決方案,平臺采用B/S架構(gòu)模式,界面友好,用戶操作簡單方便。goTicket性能測試平臺對不同級別用戶進行角色管理,其中使用者可以進行性能腳本編輯與管理,性能測試場景創(chuàng)建與執(zhí)行,性能測試結(jié)果收集與展示;管理者除具備以上功能外,還可以進行用戶管理、壓力機管理和系統(tǒng)配置修改等功能操作。
2.3 平臺功能邏輯
goTicket性能測試平臺由一個控制臺和多臺壓力機共同組成。其中控制臺負責(zé)與用戶進行交互,用戶通過網(wǎng)頁可以在線編輯與管理測試腳本,創(chuàng)建與管理測試場景,啟動與停止性能測試運行,查看性能測試結(jié)果。壓力機負責(zé)接收控制臺指令,執(zhí)行測試腳本,并將運行結(jié)果返回給控制臺。另外在被測系統(tǒng)上可以部署監(jiān)控程序,負責(zé)收集被測系統(tǒng)性能指標(biāo),并回傳給控制臺??刂婆_是整個測試平臺的核心部分,負責(zé)與用戶交互,壓力機控制和結(jié)果展示,也是整個平臺開發(fā)的重點。
goTicket性能測試平臺架構(gòu)如圖2所示。
goTicket控制臺主要由腳本管理、場景控制、SVN管理、控制臺管理、壓力機管理和監(jiān)控管理組成。(1)腳本管理模塊與用戶進行交互,提供列表式的腳本展示,可以記錄腳本名稱,腳本附加信息,腳本修改時間,版本和大小等信息,可以實現(xiàn)腳本的新建和已有腳本的刪除。腳本管理整合Grinder腳本調(diào)試功能,對于用戶已建的腳本可以單次運行,方便用戶查看腳本的正確性,并且可以進行簡單編輯修改。腳本通過SVN模塊進行版本控制,對于線下編輯的腳本可直接上傳至SVN中,新增腳本顯示在腳本列表中,其它模塊通過調(diào)用統(tǒng)一的API接口實現(xiàn)腳本的簽出、提交和分發(fā),以及腳本信息查詢等操作。(2)控制臺管理模塊管理多個控制臺進程,當(dāng)有用戶計劃測試時,管理模塊給用戶分配一個可用的控制臺,與測試場景綁定,并分配可用的壓力機資源。(3)場景控制模塊負責(zé)與用戶進行交互,如測試定義、編輯和運行等操作,以列表形式展示測試場景概要信息,包括已運行完成、正在運行中和計劃運行的測試場景,可以查看測試場景的詳細信息。正在運行的場景通過控制臺將指定的測試腳本分發(fā)到壓力機上,并控制壓力機上的代理進程產(chǎn)生相應(yīng)數(shù)量的虛擬用戶,重復(fù)執(zhí)行測試腳本,從而對被測系統(tǒng)產(chǎn)生壓力。(4)壓力機管理模塊負責(zé)控制平臺可用的壓力資源,實現(xiàn)在平臺內(nèi)壓力資源的注冊、分配,以及壓力機系統(tǒng)狀態(tài)的實時監(jiān)控。(5)監(jiān)控管理模塊收集被測系統(tǒng)上監(jiān)控進程發(fā)送的信息,包括系統(tǒng)CPU使用率、內(nèi)存使用率和網(wǎng)絡(luò)流量信息??刂婆_內(nèi)部整合了Mysql數(shù)據(jù)庫,負責(zé)存儲用戶、腳本和場景信息,為測試場景結(jié)果展示提供數(shù)據(jù)基礎(chǔ)。
goTicket壓力機組成相對簡單,其采用Grinder架構(gòu)的代理模式,主要包括代理進程,實時與控制臺進行交互。當(dāng)測試運行時,壓力機會依據(jù)場景設(shè)置的虛擬用戶數(shù),啟動相應(yīng)數(shù)量的進程和線程,重復(fù)執(zhí)行測試腳本中定義的操作,最終實現(xiàn)對目標(biāo)系統(tǒng)進行不間斷的并發(fā)請求,并將測試執(zhí)行的指標(biāo),包括運行時間、請求數(shù)量、完成數(shù)量、壓力機狀態(tài)等信息發(fā)送到控制臺。
3.1 操作流程Web化
將Grinder測試流程遷移到網(wǎng)頁形式是goTicket性能測試平臺開發(fā)的重點,對原控制臺程序操作的過程進行易用性優(yōu)化。主要包括測試腳本編輯和驗證,測試場景通過頁面形式進行配置,測試運行中實時顯示運行結(jié)果和對歷史結(jié)果的查詢與展示。整個平臺采用Spring框架模式開發(fā)實現(xiàn),數(shù)據(jù)庫存儲用戶定義、場景定義等信息,采用Mysql數(shù)據(jù)庫,采用SVNkit進行版本管理,支持腳本下載本地調(diào)試與上載,使用FreeMaker編寫模板引擎,用于表現(xiàn)層界面實現(xiàn)。采用第三方JavaScript庫Jplot實現(xiàn)曲線圖的展示。平臺采用Tomcat服務(wù)器,部署在Linux操作系統(tǒng)上,對系統(tǒng)的配置要求較低。
3.2 用戶角色管理
goTicket性能測試平臺對不同級別用戶進行角色管理,明確各角色可操作的范圍。管理員可以查看平臺的運行狀況,增加與減少可用的壓力機數(shù)量,新增、修改和刪除用戶。普通用戶更接近測試,可以編輯、修改和調(diào)試腳本,執(zhí)行測試場景等。在壓力資源許可的情況下,多個用戶可以同時運行測試場景。
3.3 測試結(jié)果展示
goTicket性能測試平臺對實時測試數(shù)據(jù)進行收集、處理和展示。測試運行時,壓力機重復(fù)運行測試腳本,記錄所定義事務(wù)的執(zhí)行次數(shù)、執(zhí)行時間、運行結(jié)果等數(shù)據(jù),并將數(shù)據(jù)發(fā)送到控制臺進行處理??刂婆_依據(jù)采樣間隔時間對收集的數(shù)據(jù)進行分析處理,通過表格和動態(tài)曲線圖的方式展示測試的響應(yīng)時間和TPS關(guān)鍵數(shù)據(jù),使得用戶對運行的測試場景有直觀的了解。所有的測試數(shù)據(jù)和分析處理后的結(jié)果都會存儲在平臺的Mysql數(shù)據(jù)庫內(nèi),這使得用戶查看歷史測試結(jié)果更加方便。
3.4 Jython腳本支持
goTicket性能測試平臺的學(xué)習(xí)和使用成本大大降低,其主要原因是其繼承了Grinder對Jython測試腳本的支持。Grinder架構(gòu)針對HTTP協(xié)議有錄制腳本工具和豐富的插件,并且有大量的HTTP協(xié)議處理工具,這些都使得基于HTTP協(xié)議的測試腳本容易編寫與維護。Jython是Python解釋器在Java中的完整重現(xiàn),其繼承Python語法風(fēng)格,編寫簡單,同時又繼承了Java的類庫,再加上測試腳本支持引用第三方Java類庫,這使得腳本功能極大地提升。
4.1 手機訂票性能測試
手機訂票作為互聯(lián)網(wǎng)售票系統(tǒng)的拓展,其共用一部分互聯(lián)網(wǎng)售票系統(tǒng)組件,但也新增部分應(yīng)用服務(wù)器,為確保上線后手機服務(wù)器穩(wěn)定運行,有必要模擬多客戶端訪問請求產(chǎn)生對應(yīng)用服務(wù)器的壓力。由于移動設(shè)備訪問應(yīng)用服務(wù)器需要進行多步確認,模擬操作處理過程相對復(fù)雜,單個業(yè)務(wù)邏輯內(nèi)請求較多,所以測試腳本編寫較困難,維護也有較大難度。測試過程經(jīng)過了多天多輪次的壓力測試,又經(jīng)過數(shù)天的系統(tǒng)調(diào)優(yōu)過程。測試模擬Android用戶直壓WorkLight,壓測WorkLight負載均衡,直壓Nginx,壓測Nginx負載均衡多個測試場景,并模擬不同并發(fā)用戶數(shù)量請求。測試場景模擬10 000個并發(fā)用戶,思考時間為100 ms,其中使用10臺壓力機,每臺壓力機啟動10個工作進程,每個進程產(chǎn)生100個線程,總TPS為38 200,平均響應(yīng)時間150 ms。
手機訂票性能測試TPS曲線圖和響應(yīng)時間曲線圖如圖3、圖4所示。
圖3 手機訂票性能測試TPS曲線圖
圖4 手機訂票性能測試響應(yīng)時間曲線圖
4.2 互聯(lián)網(wǎng)售票擴能性能測試
為保證互聯(lián)網(wǎng)售票系統(tǒng)在春運期間平穩(wěn)運行,系統(tǒng)進行應(yīng)急擴能,擴展A5、A6、A7共3組售票節(jié)點,且首次使用X86架構(gòu)平臺承載售票核心數(shù)據(jù)庫。goTicket測試平臺對線上功能進行壓力測試,模擬用戶登入、訂票、查詢訂單和登出操作。測試場景模擬200個并發(fā)用戶訂票,思考時間為100 ms,其中使用5臺壓力機,每臺壓力機啟動2個工作進程,每個進程產(chǎn)生20個線程,總TPS為160,平均響應(yīng)時間680 ms。
互聯(lián)網(wǎng)售票擴能性能測試TPS曲線圖和響應(yīng)時間曲線圖如圖5、圖6所示。
圖5 互聯(lián)網(wǎng)售票擴能性能測試TPS曲線圖
圖6 互聯(lián)網(wǎng)售票擴能性能測試響應(yīng)時間曲線圖
goTicket性能測試平臺作為客票系統(tǒng)的一個組成部分,目前已用于模擬HTTP協(xié)議,實現(xiàn)對互聯(lián)網(wǎng)售票系統(tǒng)的性能測試,并且在平臺持續(xù)產(chǎn)生壓力的情況下對被測系統(tǒng)進行性能調(diào)優(yōu),平臺將持續(xù)提供對系統(tǒng)不同需求的測試服務(wù)??推毕到y(tǒng)是一個大型分布式系統(tǒng),其數(shù)據(jù)庫的穩(wěn)定運行和客票核心業(yè)務(wù)的正確運行同樣重要,因此有必要對goTicket性能測試平臺進行拓展,為以上功能的測試與調(diào)優(yōu)提供更強的技術(shù)保障。另一方面,基于互聯(lián)網(wǎng)業(yè)界迅速發(fā)展的云服務(wù),可以研究和部署互聯(lián)網(wǎng)云服務(wù)器壓力測試環(huán)境,模擬互聯(lián)網(wǎng)用戶對系統(tǒng)所產(chǎn)生的壓力。
[1] 趙 斌. 軟件測試技術(shù)經(jīng)典教程[M]. 北京:科學(xué)出版社,2011.
[2] 陳能技,郭柏雅. 性能測試診斷分析與優(yōu)化[M]. 北京:電子工業(yè)出版社,2012.
責(zé)任編輯 陳 蓉
goTicket performance testing platform
YU Peng, LIU Wentao, ZHU Jiansheng, REN Beibei
( Institute of Computer Technologies, China Academy of Railway Sciences, Beijing 100081, China )
In order to meet the test demand on Internet Ticketing and Reservation System with high concurrency simulation, goTicket performance testing platform based on open source Grinder framework was designed, and applied for pressure testing and performance tuning.
Internet Ticketing and Reservation System; pressure testing; Grinder; performance tuning
U293.22∶TP39
A
1005-8451(2015)06-0001-04
2014-11-03
于 澎,助理研究員;劉文韜,副研究員。