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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...