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

.介紹

  最近搭建了一套CQRS框架,須要在投入開發前,進行必要的壓力測試。Web Capacity Analysis Tool  (Wcat)是一種輕量級HTTP負載生成工具,主要用於衡量受控環境中Web服務器的性能。WCAT能夠模擬數千個併發用戶向單個網站或多個網站發出請求。WCAT引擎使用一個簡單的腳原本定義要回放到Web服務器的HTTP請求集。WCAT是一個很是輕量級但功能強大的工具,可供IT專業人員和開發人員使用。其豐富的設置可用於大多數狀況。它最大的缺點是缺少用於建立和管理負載測試場景的GUIweb

  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控制器運行

    命令中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

相關文章
相關標籤/搜索