CodeBenchmark是一款高性能可视化的并发测试组件,通过组件可以对任意逻辑代码或服务进行并发测试;组件最终通过可视化的方式来显示测试结果,在测试结果中可以看到具体的并发情况和处理延时的分布。组件不仅可以对单个逻辑或服务进行并发测试,还可以同时对多个逻辑代码用例进行不同并发分组压测,最终显示它们之间的性能差异和不同并发下的最优结果。接下来介绍如何使用这一组件对逻辑代码或服务进行并发测试。

构建测试项目

可以通过vsvscode构建一个控制台项目然后引用组件(引用最新版本的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,SwifterJsonspanJson.相应代码如下:

  • 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之压力测试详解的更多相关文章

  1. web 压力测试工具ab压力测试详解

    Web性能压力测试工具之ApacheBench(ab)详解 原文:http://www.ha97.com/4617.html PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压 ...

  2. redis压力测试详解

    redis做压测可以用自带的redis-benchmark工具,使用简单,效果也比较不错. linux下一般无需下载,windows下redis-benchmark压力测试工具下载地址:http:// ...

  3. 使用ab进行压力测试详解

    ab是apache自带的压力测试工具,非常好用.转载几篇对ab工具的详细使用的博文.猛击下面的链接地址 http://www.365mini.com/page/apache-benchmark.htm ...

  4. 大数据笔记(十九)——数据采集引擎Sqoop和Flume安装测试详解

    一.Sqoop数据采集引擎 采集关系型数据库中的数据 用在离线计算的应用中 强调:批量 (1)数据交换引擎: RDBMS <---> Sqoop <---> HDFS.HBas ...

  5. Ubuntu14.04搭建JSP与Servlet开发环境及其测试详解

    一,搭建JDK开发环境 1,在Java官网下载Jdk软件包,我的系统是64位Ubuntu14.04,所以选择jdk-8u25-linux-x64.tar.gz. 2,解压Jdk软件包 tar xvzf ...

  6. 【HTB系列】靶机Frolic的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Hack The Box是一个CTF挑战靶机平台,在线渗透测试平台.它能帮助你提升渗透测 ...

  7. 【HTB系列】靶机Access的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Hack The Box是一个CTF挑战靶机平台,在线渗透测试平台.它能帮助你提升渗透测 ...

  8. 【HTB系列】靶机Teacher的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Kali: 10.10.14.50 靶机地址:10.10.10.153 先用nmap 对 ...

  9. php set_time_limit()用法测试详解

    在php中set_time_limit函数是用来限制页面执行时间的,如我想把一个php页面的执行时间定义为5秒就可以set_time_limit(5)了.   一个php脚本通过crontab每5分钟 ...

随机推荐

  1. LR有的JMeter也有之一“参数化”

    酝酿了几天,一直想写点JMeter的东西,算是对学习东西的一个整理.:) 恩,一直觉得自己领悟能力不强,别人写的东西总要看老半天也不懂.好吧!一惯的傻瓜的方式(大量的截图+参数说明)嘻嘻. 参数化:简 ...

  2. 关于dfs的套路

    void dfs(答案, 搜索层数, 其他参数) { if (层数==maxdeep) { 更新答案 return; } (剪枝) for(下一层可能的状态){ 更新全局变量表示的状态的变量 dfs( ...

  3. 【Java例题】4.4使用牛顿迭代法求方程的解

    4. 使用牛顿迭代法求方程的解:x^3-2x-5=0区间为[2,3]这里的"^"表示乘方. package chapter4; public class demo4 { publi ...

  4. C#将图片转换成字符画

    先看一下效果图 在Main方法中调用(首先要添加程序集System.Drawing,然后引入命名空间System.Drawing) ConvertToChar(new Bitmap(@"D: ...

  5. Mysql-巧用join来优化sql

    0. 准备相关表来进行接下来的测试 相关建表语句请看:https://github.com/YangBaohust/my_sql user1表,取经组 +----+-----------+------ ...

  6. 纯前端下载pdf链接文件,而不是打开预览的解决方案

    纯前端下载pdf链接文件,而不是打开预览的解决方案 一,介绍与需求 1.1,介绍 XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行 ...

  7. 多线程编程-synchronized

    使用取钱的demo来模拟实现线程的同步 package com.iotec.synchronizedTest; import java.io.ObjectInputStream; public cla ...

  8. 用小程序·云开发两天搭建mini论坛丨实战

    笔者最近涉猎了小程序相关的知识,于是利用周末时间开发了一款类似于同事的小程序,深度体验了小程序云开发模式提供的云函数.数据库.存储三大能力.关于云开发,可参考文档:小程序·云开发. 个人感觉云开发带来 ...

  9. 网站设计:将Footer固定在浏览器底部

    在设计网站的时候,如果你某个页面的内容没有满屏,那你的footer会离浏览器底部很远,整体看起来很难看,这里用JavaScript提供一种方法来将footer固定在浏览器底部. function fi ...

  10. Java中访问修饰符public、private、protecte、default

    Java中访问修饰符public.private.protecte.default的意义讲解:public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”.被其修饰的类.属性以及方法不 仅 ...