一.介紹 最近搭建了一套CQRS框架,需要在投入開發前,進行必要的壓力測試。Web Capacity Analysis Tool (Wcat)是一種輕量級HTTP負載生成工具,主要用於衡量受控環境中Web伺服器的性能。WCAT可以模擬數千個併發用戶向單個網站或多個網站發出請求。WCAT引擎使用一個簡 ...
一.介紹
最近搭建了一套CQRS框架,需要在投入開發前,進行必要的壓力測試。Web Capacity Analysis Tool (Wcat)是一種輕量級HTTP負載生成工具,主要用於衡量受控環境中Web伺服器的性能。WCAT可以模擬數千個併發用戶向單個網站或多個網站發出請求。WCAT引擎使用一個簡單的腳本來定義要回放到Web伺服器的HTTP請求集。WCAT是一個非常輕量級但功能強大的工具,可供IT專業人員和開發人員使用。其豐富的設置可用於大多數情況。它最大的缺點是缺乏用於創建和管理負載測試場景的GUI。
WCAT有四個組件來運行WCAT測試:伺服器,客戶端,控制器和網路,運行測試時,控制器和客戶端運行不同的WCAT程式,而伺服器使用WCAT文件響應請求。
伺服器
伺服器負責響應連接請求,管理連接以及接收,處理和響應Web內容請求。
客戶端
指定測試中的客戶端瀏覽器數量來配置各種級別的客戶端; 客戶請求的大小,類型和速率; 請求發送的頻率以及請求的頁面; 和測試的持續時間。你不必為要測試的每個客戶端配備一臺客戶端電腦。每個WCAT客戶端測試都在自己的進程中運行,因此您可以在客戶端電腦上運行多個客戶端。這些稱為虛擬客戶端。
控制器
控制器指示客戶端機器向伺服器發送特定請求,並且伺服器響應。收集統計信息並將狀態消息發送到客戶端電腦。控制器監視測試的持續時間。這是WCAT根據模擬的工作負載確定伺服器性能的時間。如果您已指定要監視性能計數器,則控制器將在實驗期間監視這些計數器。
網路
出於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性能
六.LOG.xml查看分析
完成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個。
參考文獻
WCAT – Simple Performance Test Tool