.介绍

  最近搭建了一套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个。

参考文献

  StressTestingWCAT

  WCAT – Simple Performance Test Tool

  Using WCAT to Stress-Test IIS

asp.net core系列 67 Web压力测试工具WCAT的更多相关文章

  1. web压力测试工具(小而精)

    实际的测试过程中,我们一般都是采用A.B两台机器,一台跑Web服务,另外一台跑ab测试.也有的情况是单机对单机可能测不出结果,那就要采用很多台机器同是跑AB去请求一台机器进行测试,根据多台机器反馈的结 ...

  2. web压力测试工具

    ab apache 自带的web压力测试工具,window和linux下均有. 命令行:./ab -c 100 -n 1000 http://www.baidu.com 说明: -c 表示同时处理10 ...

  3. 推荐一个linux下的web压力测试工具神器webbench

    推荐一个linux下的web压力测试工具神器webbench2014-04-30 09:35:29   来源:   评论:0 点击:880 用多了apache的ab工具之后你就会发现ab存在很多问题, ...

  4. python的web压力测试工具-pylot安装使用

    http://blog.csdn.net/chenggong2dm/article/details/10106517 pylot是python编写的一款web压力测试工具.使用比较简单.而且测试结果相 ...

  5. asp.net core系列 40 Web 应用MVC 介绍与详细示例

    一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...

  6. asp.net core系列 39 Web 应用Razor 介绍与详细示例

    一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...

  7. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  8. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  9. 使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

    0. 简要介绍 WRK 是一款轻量且易用的 HTTP 压力测试工具,通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试,并且针对测试的情况返回结果. PS:Wrk 并不能针对测试的 ...

随机推荐

  1. EasyUI-DataGrid多线动态实现选择性合并

    jQuery EasyUI有一个非常易于使用的数据列表控件,这是DataGrid控制.某些背景json格式可以传递给在前景中显示的控制,很强大.只要有时需求须要这样即多行合并,如在列表中假设同样的部门 ...

  2. 【转载】json 数据 添加 删除 排序

    张映 发表于 2014-02-10 分类目录: js/jquery 标签:json, 删除, 排序, 添加 js数据格式和json数据格式,各有各的用处,就个人而言,json更好用一点,js自身的数组 ...

  3. windows Hook 消息分类

    调用SetWindowsHookEx的DLL的模块实例句柄,它可以经由DllMain入口的第一个参数得到.HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpf ...

  4. Web前端开发人员实用Chrome插件收集

    越来越多的前端开发人员喜欢在Chrome里开发调试代码,Chrome有许多优秀的插件可以帮助前端开发人员极大的提高工作效率.尤其Chrome本身是可以登录的,登录后你所有的插件都会自动同步到每一个登录 ...

  5. 赵伟国辞去TCL集团董事等职位,紫光参与TCL定增浮盈已超7亿

    集微网消息,TCL 集团于8月9日晚间发布公告称,公司董事会于近日收到董事赵伟国先生的书面辞职报告,赵伟国先生因个人原因申请辞去公司董事及公司战略委员会委员职务.辞任后,赵伟国先生不再担任公司任何职务 ...

  6. Telnet协议详解(远程登陆协议)

    1. 概述 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议.Telnet协议的目的是提供一个相对通用的,双向的,面向八位字节的通信方法,允许界面终端设备和面向终 ...

  7. mage J和Graphpad如何对Western Blot条带灰度分析

    原文 mage J和Graphpad如何对Western Blot条带灰度分析 WB是研究蛋白表达的一个经典方法.对于一些时间点或者是不同组织蛋白表达量的分析就涉及到量的变化.一些凝胶成像软件带有此分 ...

  8. 微信小程序把玩(三十四)Audio API

    原文:微信小程序把玩(三十四)Audio API 没啥可值得太注意的地方 重要属性: 1. wx.getBackgroundAudioPlayerState(object) 获取播放状态 2.wx.p ...

  9. EasyUI之combogrid

    html代码: <div class="item-label">@Html.L("Name"):</div> <input id= ...

  10. msys2 安装笔记(可以按照这个关键字搜索)

    以前一直在用 msys,最近发现还有个 msys2,并且msys2 配套的编译器是MinGW-w64. 就试着用了用,感觉还不错,这里把安装过程记录一下. 简单的说,MSYS2 是MSYS的一个升级版 ...