asp.net core系列 67 Web壓力測試工具WCAT

来源:https://www.cnblogs.com/MrHSR/archive/2019/07/11/11160476.html
-Advertisement-
Play Games

一.介紹 最近搭建了一套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控制器運行

    命令中localhostWCATClientMachineName可以用逗號分隔的客戶端名稱或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個。

 

 

參考文獻

   StressTestingWCAT

  WCAT – Simple Performance Test Tool

  Using WCAT to Stress-Test IIS

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • public partial class Form1 : Form { /// <summary> /// 存放圖片地址 /// </summary> List<string> ImgList = new List<string>(); /// <summary> /// 當前下載文件 /// </ ...
  • AspectCore Project 介紹 什麼是AspectCore Project ? AspectCore Project 是適用於Asp.Net Core 平臺的輕量級 Aop(Aspect-oriented programming) 解決方案,它更好的遵循Asp.Net Core的模塊化開 ...
  • webapi集成swagger後,在本地運行沒有問題,但是發佈到伺服器上就有問題。 報錯信息:Could not find file 'D:\\home\\site\\wwwroot\\bin\\WebAPI.XML 原因:發佈項目的時候,這個 項目根目錄下\bin\WebAPI.XML文件沒有發佈 ...
  • --表:table --欄位:columsA、columsB、columsC、columsD void Main(){ string sql="select columsA from table"; DataTable dt=SqlHelper.executeQuery(sql); dt.rows[ ...
  • 關於winform上傳圖片到Java後端,保存到資料庫,有多種方法,本文主要介紹利用picturebox控制項,點擊按鈕上傳圖片,將圖片轉化為base64格式,以json格式上傳到Java後臺,再從java端解析,保存到資料庫。 上代碼: 首先,畫面上添加一個picturebox控制項,再添加一個but ...
  • 升級比對可訪問 "NEST 6.X升級到7.X" 查看 ElasticClient CreateIndex 升級前代碼,NEST版本6.6.0 升級後代碼,NEST版本7.0.1 升級參考地址: "ElasticClient CreateIndex.cs" ElasticClient IndexEx ...
  • 1、問題原因 使用.net core 生成 api項目 post 請求 把post參數放到請求方法參數內 獲取不到 解決方案 : 1. 可以在參數前加上 [fromform] string phone (看起來不簡潔) 2. 把生產api項目是自動生成的[ApiController] control ...
  • 我們在用C# 開發程式時,經常會使用的多線程,實現多任務的處理。一般常用的方法是新建多個線程,進行處理。 今天我分享一個採用線程池的方式來實現的實例。對有需要的朋友做個借鑒。 實例: Winform using System; using System.Collections.Generic; us ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...