CodeBenchmark之压力测试详解
CodeBenchmark是一款高性能可视化的并发测试组件,通过组件可以对任意逻辑代码或服务进行并发测试;组件最终通过可视化的方式来显示测试结果,在测试结果中可以看到具体的并发情况和处理延时的分布。组件不仅可以对单个逻辑或服务进行并发测试,还可以同时对多个逻辑代码用例进行不同并发分组压测,最终显示它们之间的性能差异和不同并发下的最优结果。接下来介绍如何使用这一组件对逻辑代码或服务进行并发测试。
构建测试项目
可以通过vs或vscode构建一个控制台项目然后引用组件(引用最新版本的BeetleX.CodeBenchmark)
Install-Package BeetleX.CodeBenchmark -Version 1.0.
实现一个HTTP压测
引用组件后就可以编写具体的测试用例,测试用例编写必须符合组件测试要求,所以需要实现一个接口来编写测试代码,接口描述如下:
public interface IExample:IDisposable
{
void Initialize(Benchmark benchmark);
Task Execute();
}
HTTP压测逻辑代码
[System.ComponentModel.Category("TCP")]
class HttpGet : IExample
{
public void Dispose()
{
}
public async Task Execute()
{
var result = await _httpHandler.json();
}
public void Initialize(Benchmark benchmark)
{
if(_httpApi==null)
{
_httpApi = new BeetleX.Http.Clients.HttpClusterApi();
_httpApi.DefaultNode.Add("http://192.168.2.19:8080");
_httpHandler = _httpApi.Create<IHttpHandler>();
}
}
static BeetleX.Http.Clients.HttpClusterApi _httpApi;
static IHttpHandler _httpHandler;
[BeetleX.Http.Clients.FormUrlFormater]
public interface IHttpHandler
{
// http://host/json
Task<string> json();
}
}
在并发实例初始化的时候创建一个请求http请求对象,HttpClusterApi是一个线程安全对象所以只需要静态化构建一个即可;组件会针对第一个并发来构建一个实例。
启动压测
当测试用例写好后就需要进行测试,通过以下简单代码即可以打开测试管理
Benchmark benchmark = new Benchmark();
benchmark.Register(typeof(Program).Assembly);
benchmark.Start();//在本地打开管理服务,服务端口默信是9090
if(Environment.OSVersion.Platform== PlatformID.Win32NT)
benchmark.OpenWeb();
代码中做了一下判断,如果当前系统是windows则自动打开浏览器访问服务(由于服务是基于vue实现,会存在一些旧浏览器兼容问题,建议使用新版浏览器)。
管理和测试
当服务打开后就可以通过浏览器管理测试用例,具体界面如下:

在管理界面中你只需要选择测试用例和添加并发测试即可以进行压测,以下是开启10个并发并运行10秒的测试情况:

运行后能看到并发完成的数量和平均的RPS,点击测试的用例还能看到延时分布,可以知道大部分处理分布在那个时间区域。
不同并发对比
很多时候需要对一个服务进行不同并发的测试,这样可以观察服务在那个并发量下的最并发处理能力;组件支持对同时添加多个测试并发组并进行测试和结果对比。

在这个硬件和测试场景之下,显然是8并发的测力测试结果最高

通这个测试就可以针对服务情况来规划并发控制设计。接下来换个环境试下同样的测试

通过工具可以很快就能测出不同环境下最优的并发处理效果
多逻辑并发能性能对比
组件也支持多用例压测对比,只需要在测试的时候选择多个测试用例即可。接下来简单地测试一下不同json组件序列化的性能对比。 测试分别有Newtonsoft.Json,Utf8Json,SwifterJson和spanJson.相应代码如下:
Newtonsoft.Json
[System.ComponentModel.Category("Serializer-Stream")]
class Newtonsoft_Stream : CodeBenchmark.IExample
{
public void Dispose()
{ }
public Task Execute()
{
memoryStream.Position = ;
var users = User.List();
jsonSerializer.Serialize(jsonTextWriter, users);
jsonTextWriter.Flush(); return Task.CompletedTask;
} private System.IO.MemoryStream memoryStream; private System.IO.StreamWriter streamWriter; private Newtonsoft.Json.JsonSerializer jsonSerializer; private Newtonsoft.Json.JsonTextWriter jsonTextWriter; public void Initialize(Benchmark benchmark)
{
memoryStream = new System.IO.MemoryStream();
jsonSerializer = new Newtonsoft.Json.JsonSerializer();
streamWriter = new StreamWriter(memoryStream);
jsonTextWriter = new Newtonsoft.Json.JsonTextWriter(streamWriter);
}
}Utf8Json
[System.ComponentModel.Category("Serializer-Stream")]
class Utf8Json_Stream : CodeBenchmark.IExample
{
public void Dispose()
{
} public async Task Execute()
{
MemoryStream.Position = ;
var users = User.List();
await Utf8Json.JsonSerializer.SerializeAsync<List<User>>(MemoryStream, users);
TextWriter.Flush();
} private System.IO.MemoryStream MemoryStream = new System.IO.MemoryStream(); private System.IO.TextWriter TextWriter; public void Initialize(Benchmark benchmark)
{
TextWriter = new System.IO.StreamWriter(MemoryStream, Encoding.UTF8);
}
}SwifterJson
[System.ComponentModel.Category("Serializer-Stream")]
class Swifter_Stream : CodeBenchmark.IExample
{
public void Dispose()
{
}
public async Task Execute()
{
MemoryStream.Position = ;
var users = User.List();
await Swifter.Json.JsonFormatter.SerializeObjectAsync<List<User>>(users, TextWriter);
TextWriter.Flush();
} private System.IO.MemoryStream MemoryStream = new System.IO.MemoryStream(); private System.IO.TextWriter TextWriter; public void Initialize(Benchmark benchmark)
{
TextWriter = new System.IO.StreamWriter(MemoryStream, Encoding.UTF8);
}
}SpanJson
[System.ComponentModel.Category("Serializer-Stream")]
class Span_Stream : CodeBenchmark.IExample
{
public void Dispose()
{ } public async Task Execute()
{
var users = User.List();
MemoryStream.Position = ;
await SpanJson.JsonSerializer.NonGeneric.Utf8.SerializeAsync(users, MemoryStream);
} private System.IO.MemoryStream MemoryStream = new System.IO.MemoryStream(); public void Initialize(Benchmark benchmark)
{ }
}
接下来对这几个逻辑进行2,4,8,16和32的并发压测(注意:在这里提醒一下,如果是压测内存运算数据的情况并发数最好不要超过CPU的逻辑核数,否则会导致组件计数Timer可能没机会触发或触发延时)


到这里CodeBenchmark的使用就讲解完成,如果有兴趣可以关注https://github.com/IKende/CodeBenchmarkDoc
CodeBenchmark之压力测试详解的更多相关文章
- web 压力测试工具ab压力测试详解
Web性能压力测试工具之ApacheBench(ab)详解 原文:http://www.ha97.com/4617.html PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压 ...
- redis压力测试详解
redis做压测可以用自带的redis-benchmark工具,使用简单,效果也比较不错. linux下一般无需下载,windows下redis-benchmark压力测试工具下载地址:http:// ...
- 使用ab进行压力测试详解
ab是apache自带的压力测试工具,非常好用.转载几篇对ab工具的详细使用的博文.猛击下面的链接地址 http://www.365mini.com/page/apache-benchmark.htm ...
- 大数据笔记(十九)——数据采集引擎Sqoop和Flume安装测试详解
一.Sqoop数据采集引擎 采集关系型数据库中的数据 用在离线计算的应用中 强调:批量 (1)数据交换引擎: RDBMS <---> Sqoop <---> HDFS.HBas ...
- Ubuntu14.04搭建JSP与Servlet开发环境及其测试详解
一,搭建JDK开发环境 1,在Java官网下载Jdk软件包,我的系统是64位Ubuntu14.04,所以选择jdk-8u25-linux-x64.tar.gz. 2,解压Jdk软件包 tar xvzf ...
- 【HTB系列】靶机Frolic的渗透测试详解
出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Hack The Box是一个CTF挑战靶机平台,在线渗透测试平台.它能帮助你提升渗透测 ...
- 【HTB系列】靶机Access的渗透测试详解
出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Hack The Box是一个CTF挑战靶机平台,在线渗透测试平台.它能帮助你提升渗透测 ...
- 【HTB系列】靶机Teacher的渗透测试详解
出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Kali: 10.10.14.50 靶机地址:10.10.10.153 先用nmap 对 ...
- php set_time_limit()用法测试详解
在php中set_time_limit函数是用来限制页面执行时间的,如我想把一个php页面的执行时间定义为5秒就可以set_time_limit(5)了. 一个php脚本通过crontab每5分钟 ...
随机推荐
- ipv6的连接
基础知识不说了,网上一大堆! 基本内容不说了,写字太累了! 只说三点细节,记住就行: 1.ff开头的是多播地址,只能用于udp多播 2.fe80开头的是本地link地址,不管ping也好,connec ...
- Java - 自动配置log4j的日志文件路径
目录 1 日志路径带来的痛点 2 log4j.properties文件的配置 3 彻底解决痛点 3.1 单独的Java程序包 (非Java Web项目) 3.2 Web项目 4 附录 - 获取当前项目 ...
- Java连载11-转义字符&整数型
一.转义符 1.\'代表单引号:\\代表\; 二.native2ascii.exe JDK中自带的native2ascii.exe命令,可以将文字转换成unicode编码形式 我们使用这个程序尝试一下 ...
- 伽马变换(一些基本的灰度变换函数)基本原理及Python实现
1. 基本原理 变换形式 $$s=cr^{\gamma}$$ c与$\gamma$均为常数 可通过调整$\gamma$来调整该变换,最常用于伽马校正与对比度增强 2. 测试结果 图源自skimage ...
- jmh源码解析-整体架构
我理解的jmh运行架构图 生成字节码,字节码负责维护测试的状态和调用被测试的方法 默认在fork的进程中进行测试,可以配置多个fork进程,以减少误差 通过线程池,提交每个迭代的测试任务,任务执行后, ...
- 为什么我们不用JIRA
很多人问我,缺陷管理工具,为什么不用jira?而去自己造轮子开发一款bug记录系统 缄默如我,原因众多.如果只是3-5分钟就能讲的请的时候,我会先列出什么糟点呢? 1. 收费,一个人一个月的费用差不多 ...
- go 学习笔记之有意思的变量和不安分的常量
首先希望学习 Go 语言的爱好者至少拥有其他语言的编程经验,如果是完全零基础的小白用户,本教程可能并不适合阅读或尝试阅读看看,系列笔记的目标是站在其他语言的角度学习新的语言,理解 Go 语言,进而写出 ...
- SonarQube系列二、分析dotnet core/C#代码
[前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...
- cookie session sessionStorage localStorage
什么是会话? 会话指的是浏览器与服务器之间的数据交互.所白了就是 浏览器和服务器进行的请求和响应. http协议是无状态的,多次请求之间没有关联性 cookie和session的作用?干啥的? 利用c ...
- Android Pie 私人 DNS 使用教程
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章 ...