最近搭建了一套CQRS框架,須要在投入開發前,進行必要的壓力測試。Web Capacity Analysis Tool (Wcat)是一種輕量級HTTP負載生成工具,主要用於衡量受控環境中Web服務器的性能。WCAT能夠模擬數千個併發用戶向單個網站或多個網站發出請求。WCAT引擎使用一個簡單的腳原本定義要回放到Web服務器的HTTP請求集。WCAT是一個很是輕量級但功能強大的工具,可供IT專業人員和開發人員使用。其豐富的設置可用於大多數狀況。它最大的缺點是缺少用於建立和管理負載測試場景的GUI。web
WCAT有四個組件來運行WCAT測試:服務器,客戶端,控制器和網絡,運行測試時,控制器和客戶端運行不一樣的WCAT程序,而服務器使用WCAT文件響應請求。redis
服務器sql
服務器負責響應鏈接請求,管理鏈接以及接收,處理和響應Web內容請求。數據庫
客戶端瀏覽器
指定測試中的客戶端瀏覽器數量來配置各類級別的客戶端; 客戶請求的大小,類型和速率; 請求發送的頻率以及請求的頁面; 和測試的持續時間。你沒必要爲要測試的每一個客戶端配備一臺客戶端計算機。每一個WCAT客戶端測試都在本身的進程中運行,所以您能夠在客戶端計算機上運行多個客戶端。這些稱爲虛擬客戶端。服務器
控制器網絡
控制器指示客戶端機器向服務器發送特定請求,而且服務器響應。收集統計信息並將狀態消息發送到客戶端計算機。控制器監視測試的持續時間。這是WCAT根據模擬的工做負載肯定服務器性能的時間。若是您已指定要監視性能計數器,則控制器將在實驗期間監視這些計數器。併發
網絡mvc
出於WCAT的目的,網絡只是客戶端計算機,控制器和服務器之間的通訊連接。網絡必須使用TCP / IP,建議網絡帶寬爲每秒100兆位。設置測試時,請確保鏈接到網絡的計算機都已正確配置,以便您知道任何性能問題都不是由不正確的安裝引發的。框架
下載WCAT 6.3:https://www.iis.net/downloads/community/2007/05/wcat-63-x64
安裝後文件在C:\Program Files\wcat下,有三個可執行文件(exe)和一個Windows腳本文件(wsf)以及文檔(doc)和示例文件夾(samples)。裏面的home.ubr和settings.ubr是我從示例文件夾中拿出來修改的,log.xml文件夾是壓力測試後的一個分析報告結果。
wcctl.exe - 控制器
wcclient.exe - 客戶端
wcutil.exe - 用於查看測試簡要報告的小實用程序
wcat.wsf - 用於在各類客戶端計算機上更新,終止和運行wcclient
(1) settings.ubr文件
在\samples\scripts下有這二個示例文件。settings.ubr文件一般包括:
(1)客戶端須要執行的方案文件。 如: clientfile = "home.ubr";
(2)服務器機器名稱或ip。 如:server = "localhost";
(3)將HTTP負載發送到服務器的物理客戶端數。如:clients= 5;
(4)此測試的虛擬客戶端數,是指線程數。如: virtualclients = 10;
(5)表現計數器 counters
(6)註冊表設置 registry
下面是一個settings.ubr的示例:
settings { //-------------------------------------------------------------------------- // General controller settings // // clientfile - specifies the client file, relative to working dir // server - host name of the webserver // virtualclients - number of 'threads' per physical client // clients - number of physical webcat client machines // //-------------------------------------------------------------------------- // Example: // clientfile = "home.ubr"; server = "localhost"; clients = 1; virtualclients = 100; // //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- // Performance counters (pass '-x' option to wcctl.exe to enable) // // interval - polling interval in seconds (default=10) // host - host name of machine to monitor (default=webserver) // counter - path of counter to monitor // //-------------------------------------------------------------------------- // Optional: // // Additional machines can be monitored by adding more counters blocks. // // Example: // // counters { // host = "sqlserver"; // name of remote machine // interval = 5; // counter = "..."; // } // //-------------------------------------------------------------------------- counters { interval = 10; counter = "Processor(_Total)\\% Processor Time"; counter = "Processor(_Total)\\% Privileged Time"; counter = "Processor(_Total)\\% User Time"; counter = "Processor(_Total)\\Interrupts/sec"; counter = "Memory\\Available KBytes"; counter = "Process(w3wp)\\Working Set"; counter = "System\\Context Switches/sec"; counter = "System\\System Calls/sec"; counter = "Web Service(_Total)\\Bytes Received/sec" ; counter = "Web Service(_Total)\\Bytes Sent/sec" ; counter = "Web Service(_Total)\\Connection Attempts/sec" ; counter = "Web Service(_Total)\\Get Requests/sec" ; } //-------------------------------------------------------------------------- // Registry Key Monitors (pass '-x' option to wcctl.exe to enable) // // path - registry path, relative to HKLM // name - name of registry key // type - type of value (REG_SZ | REG_DWORD) // //-------------------------------------------------------------------------- // Optional: // // Additional registry keys can be monitored on the web server by // adding more registry blocks to this file. Note that simple strings and // dwords are all that webcat currently supports. // // Example: // // registry { // path = "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"; // name = "DhcpDomain"; // type = REG_SZ; // } // //-------------------------------------------------------------------------- registry { path = "System\\CurrentControlSet\\Control\\FileSystem"; name = "NtfsDisableLastAccessUpdate"; type = REG_DWORD; } registry { path = "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"; name = "SynAttackProtect"; type = REG_DWORD; } }
(2) home.ubr文件
該文件是示例場景,定義測試方案。文件一般包含預熱時間warmup,測試持續時間duration,冷卻時間cooldown。默認部分容許您爲測試指定默認HTTP標頭setheader。事務(transaction)部分用於指定實際的業務場景。weight屬性用於設置此事務的優先級。請求部分(request)用於指定事務中的單個頁面請求。其中request頁面請求包括:
(1)頁面的URL
(2)可選的HTTP動詞(默認GET)。在提交數據的狀況下,必須將POST指定爲動詞。
(3)POST的POSTDATA爲提交的數據
(4)狀態代碼一般爲200(指望的狀態),但在某些狀況下,您可能須要爲移動請求指定300或302
下面是一個home.ubr的示例:
scenario { name = "IIS Home Page"; warmup = 60; duration = 300; cooldown = 20; ///////////////////////////////////////////////////////////////// // // All requests inherit the settings from the default request. // Defaults are overridden if specified in the request itself. // ///////////////////////////////////////////////////////////////// default { // send keep-alive header setheader { name = "Connection"; value = "keep-alive"; } // set the host header setheader { name = "Host"; value = server(); } // HTTP1.1 request version = HTTP11; // keep the connection alive after the request close = ka; } // // This script is made for IIS7 // transaction { id = "Default Web Site Homepage"; weight = 1; request { url = "http://localhost/customer-management/edit-customer/19"; statuscode = 200; verb = GET; } request { url = "http://localhost/member/account/login"; statuscode = 200; verb = POST; postdata = "UserName=hu&Password=123456"; } request { url = "http://localhost/customer-management/edit-customer/19"; statuscode = 200; verb = POST; postdata = "Id=19&Name=hu1&Email=hu3%40qq.com&BirthDate=1997-01-05&UUID=6b220653-c065-43fc-84f7-eead8f2d64e7"; } // // specifically close the connection after both files are requested // close { method = reset; } } }
打開cmd命令提示符界面,定位到 C:\Program Files\wcat下。接着將asp.net core mvc項目發佈到iis上,默認端口爲80。
(1) 步驟1客戶端運行:
最初,須要在全部客戶端計算機上更新WCAT設置,wcat客戶端計算機的逗號分隔列表.
C:\Program Files\wcat> wcat –terminate –update –clients {127.0.0.1} -run
(2) 步驟2控制器運行
命令中localhost爲WCATClientMachineName,能夠用逗號分隔的客戶端名稱或IP
C:\Program Files\wcat> wcat -x -run -clients localhost -f settings.ubr -t home.ubr
輸出如下信息,包括性能統計指標,測壓的Server服務器爲:localhost。一個物理客戶端Clients。
(3) 步驟3啓動客戶端.
客戶端將嘗試鏈接到控制器。若是它沒有鏈接,程序將在十秒後再次嘗試,並將繼續嘗試每十秒鐘,直到你終止wcclient.exe。要終止wcclient.exe,請在命令提示符下鍵入CTRL + C.
下面是啓動客戶端:在打開一個物理客戶端命令提示符界面(有200個虛擬客戶端,也就是200個併發)。
C:\Program Files\wcat> wcclient localhost
下面測壓前的一些配置信息打印,以下圖所示:
接下來會在控制檯打印,按以前配置10秒(interval = 10)打印一次信息統計,持續300秒測壓的信息統計。下圖是第一輪10秒的信息統計,共300秒還會有29輪。
下面在測壓過程當中來分析查看:測壓中包含了登陸,產生的會話是6500個。 post修改數據產生的cqrs事件源有4997條。數據庫監控一切正常。只是會話多了redis會鏈接失敗與內存有關係。
(1) post修改產生的事件源(也就是修改一條數據,同時新增一個事件源),300秒產生4997條數據。
(2)會話存儲,300秒產生6502個登陸會話
(3) sql server profile的監控,能夠查看sql性能
完成300秒測壓後,結果將存儲在控制器機器當前目錄的log.xml文件中。WCAT有一個XSLT「report.xsl」,能夠將這個XML轉換爲可讀的安裝文件夾。
Log.xml用來分析結果包含:文件頭,結果,性能計數器(若是您指定了所需的那些),文件和類統計信息。 可查看wact安裝後doc文件夾中的幫助文檔。
經過分析log.xml能夠看到一些統計信息,如請求的http狀態,以下圖請求http 200的有11078個, 請求登陸產生的302有5558個,沒有其它http 狀態,說明200個併發沒有報程序錯誤。
下面是http響應的時間:
下面是300秒內200個併發的總鏈接請求數,平均每秒請求55個url(16710/300.0)
上面第一個方案測壓持續時間300秒,預熱30秒,共200個線程併發,一個線程一次請求3個url(一個登陸,一個查詢,一個修改提交數據)。300秒內請求url總數爲16710個,平均每秒請求55個,平均響應時間3616ms, http 200狀態有11078個, http 302狀態有5558個。
第二個方案測壓持續時間300秒,預熱60秒,共400個線程併發,一個線程一次請求3個url(一個登陸,一個查詢,一個修改提交數據)。300秒內請求與第一個方案差很少,應該是併發上不去了。
第三個方案壓持續時間300秒,預熱60秒,共100個線程併發,一個線程一次請求3個url(一個登陸,一個查詢,一個修改提交數據)。300秒內請求url總數爲15222個,平均每秒請求152個,平均響應時間1970 ms,http 200狀態有10150個, http 302狀態有5608個。
參考文獻