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. .NETCoreCSharp 中级篇2-3 Linq简介

    .NETCoreCSharp 中级篇2-3 本节内容为Linq及其拓展方法.Linq中表达式树的使用 简介 语言集成查询(LINQ)是一系列直接将查询功能集成到C#语言的技术统称.数据查询历来都表示为 ...

  2. 并发知识(2)——关于Thread

    一些容易混淆的知识点 sleep vs wait sleep是Thread,wait是Object方法 wait和notify只能在同步代码块中调用 wait释放锁资源,sleep不释放锁资源 唤醒条 ...

  3. k8s+istio:流量控制之灰度发布

    通过Kubernetes+Istio的流量控制实现灰度发布,主要演示通过流量权重实现蓝绿,通过http自定义头实现金丝雀 准备环境 k8s和istio不想自己装的话可以在云上买个按量付费集群,用完即删 ...

  4. 假装前端工程师(一)Icework + GitHub pages 快速构建可自定义迭代开发的 react 网站

    icework + gh-pages 超快部署超多模版页面 项目地址:https://github.com/yhyddr/landingpage效果地址:https://yhyddr.github.i ...

  5. linux学习总结--linux100day(day2)

    Linux中的哲学--一切皆文件 为了便于操作,我们可以使用secureCRT或Xshell连接到我们的虚拟机. 要用远程工具连接到虚拟机上,我们只需要打开虚拟机上的ssh服务,在xshell中填写主 ...

  6. Spring 2017 Assignments3

    一.作业要求 原版:http://cs231n.github.io/assignments2017/assignment3/ 翻译:http://www.mooc.ai/course/268/lear ...

  7. java后端开发面经 数据库相关

    小姐姐:怎么理解感情中的付出和回报? 你答:有这样一个故事,讲的是一个小男孩和一个小女孩,这个小男孩呢,用很多好玩石头,而这个小女孩呢,有好多好吃的糖果,有一天,他们相互约定:小男孩用所有的石头交互小 ...

  8. ZooKeeper实现生产-消费者队列

    [欢迎关注公众号:程序猿讲故事 (codestory),及时接收最新文章] 生产-消费者队列,用于多节点的分布式数据结构,生产和消费数据.生产者创建一个数据对象,并放到队列中:消费者从队列中取出一个数 ...

  9. Elasticsearch由浅入深(一)

    什么是Elasticsearch 什么是搜索 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条感兴趣的新闻(提到搜索的第一印象 ...

  10. 深度搜索(dfs)+典型例题(八皇后)

    深度优先搜索简称深搜,从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”. 如上面的图所示:加入我们要找一个从V0到 ...