.介绍

  最近搭建了一套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. Node.js 中开源库探秘 object-assign | 全栈之路

    这篇内容呢,讲的是另一个技术栈 Node.js 系列,虽然和咱们这里的主题不是特别吻合,不过嘛,汲取多样性的养分是快速成长的好方法,也是现在流行的全栈工程师的必经之路. 由于这篇内容涉及的是 Node ...

  2. 工具:sql server profiler(分析器)

    打开profiler新建->连接数据库进行监测 任何访问该数据库的都有记录   image 对于linq的检验:sql实际如何->运行程序,查看分析器记录   image         ...

  3. 隐藏在QRCode二维码背后的秘密

    原文:隐藏在QRCode二维码背后的秘密 隐藏在QRCode二维码背后的秘密,您知道吗? 1.容错级. 二维码的容错级分别为:L,M,Q和H.其中,L最低,H最高.如何从二维码中一眼看出其容错级别呢? ...

  4. Fiddler应用

    Fiddler是什么 Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一 . 它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请 ...

  5. 【C++】小心使用文件读写模式:回车('\r') 换行('\n')问题的一次纠结经历

    原来没有仔细注意C++读写文件的二进制模式和文本模式,这次吃了大亏.(平台:windows  VS2012) BUG出现: 写了一个程序A,生成一个文本文件F保存在本地,然后用程序B读取此文件计算MD ...

  6. ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...

  7. TIME WINAPI

    GetDynamicTimeZoneInformation https://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs ...

  8. 毕设(三)NotifyIcon

    NotifyIcon是一个比较特殊的组件,其特殊之处是既可以把它归类到控件中,也可以把它归类到组件中.这是因为将其拖放到设计窗体后,我们并不能马上看到它的界面(像组件),而是在运行时才能看到它(像控件 ...

  9. Linux文件系统操作与磁盘管理

    简单文件操作 df---->report file system disk space usage du---->estimate file space usage 2.简单的磁盘管理 d ...

  10. IntelliJ IDEA Maven工程保证JDK版本不变

    创建maven项目后修改pom文件idea会默认将jdk版本调回到1.5,这是因为没有在pom里面设置项目的jdk版本 解决方法: 在pom文件中设定jdk版本即可,以下这种写法会自动更新idea中的 ...