欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net core系列 67 Web压力测试工具WCAT

程序员文章站 2022-07-05 10:58:51
一.介绍 最近搭建了一套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:

    安装后文件在c:\program files\wcat下,有三个可执行文件(exe)和一个windows脚本文件(wsf)以及文档(doc)和示例文件夹(samples)。里面的home.ubr和settings.ubr是我从示例文件夹中拿出来修改的,log.xml文件夹是压力测试后的一个分析报告结果。

asp.net core系列 67 Web压力测试工具WCAT

    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

asp.net core系列 67 Web压力测试工具WCAT

    输出以下信息,包括性能统计指标,测压的server服务器为:localhost。一个物理客户端clients。

asp.net core系列 67 Web压力测试工具WCAT

  (3) 步骤3启动客户端.

     客户端将尝试连接到控制器。如果它没有连接,程序将在十秒后再次尝试,并将继续尝试每十秒钟,直到你终止wcclient.exe。要终止wcclient.exe,请在命令提示符下键入ctrl + c.

    下面是启动客户端:在打开一个物理客户端命令提示符界面(有200个虚拟客户端,也就是200个并发)。

    c:\program files\wcat> wcclient localhost

asp.net core系列 67 Web压力测试工具WCAT

    下面测压前的一些配置信息打印,如下图所示:

asp.net core系列 67 Web压力测试工具WCAT

 

五.查看分析

   接下来会在控制台打印,按之前配置10秒(interval = 10)打印一次信息统计,持续300秒测压的信息统计。下图是第一轮10秒的信息统计,共300秒还会有29轮。

asp.net core系列 67 Web压力测试工具WCAT

  

  下面在测压过程中来分析查看:测压中包含了登录,产生的会话是6500个。 post修改数据产生的cqrs事件源有4997条。数据库监控一切正常。只是会话多了redis会连接失败与内存有关系

   (1) post修改产生的事件源(也就是修改一条数据,同时新增一个事件源),300秒产生4997条数据。

asp.net core系列 67 Web压力测试工具WCAT

  (2)会话存储,300秒产生6502个登录会话

asp.net core系列 67 Web压力测试工具WCAT

  (3) sql server profile的监控,可以查看sql性能

asp.net core系列 67 Web压力测试工具WCAT

  

.log.xml查看分析

  完成300秒测压后,结果将存储在控制器机器当前目录的log.xml文件中。wcat有一个xslt“report.xsl”,可以将这个xml转换为可读的安装文件夹。

  log.xml用来分析结果包含:文件头,结果,性能计数器(如果您指定了所需的那些),文件和类统计信息。 可查看wact安装后doc文件夹中的帮助文档。

  通过分析log.xml可以看到一些统计信息,如请求的http状态,如下图请求http 200的有11078个, 请求登录产生的302有5558个,没有其它http 状态,说明200个并发没有报程序错误。

asp.net core系列 67 Web压力测试工具WCAT

    下面是http响应的时间:

asp.net core系列 67 Web压力测试工具WCAT

    下面是300秒内200个并发的总连接请求数,平均每秒请求55个url(16710/300.0)

asp.net core系列 67 Web压力测试工具WCAT

 

七.分析结论

  上面第一个方案测压持续时间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