7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么

1. 前言

通过上面的学习,我们已经了解清楚crank的职责以及作用,那么我们重新回来思考一下,crank能为我们带来什么?

2. Crank带来了什么?

  • 为分布式压测提供了解决方案、可以模拟更高强度的压测

    • 单机压测最多提供65535,通过支持多个Agent可以很轻松的突破这个极限

  • 提供了压测结果二次处理的能力,并支持将结果保存到json、csv、数据库甚至是es(目前仍在对接)

    • 通过对以往压测数据的结果做折线图的展示

    • 通过ci可以完成自动化触发压测,再通过折线图清晰了解每次代码对性能的提升情况

3. Crank还能更进一步吗?

上面的实战训练我们仅仅是做了基础的工作,尽管我们通过模拟多接口同时压测完成了对单场景的压测,但真实的项目远远不会是所有人都同时访问一个页面,而不访问其它页面,那我们如何模拟出更贴近真实场景的用户轨迹呢?

真实的用户场景应该更像

06d65bf876fc27588795227a7e3602cf.png

如果我们希望更进一步,想知道我们的系统的极限究竟在哪里,我们可以按照按照此用户场景进行深度还原压测场景,完成对整个场景的压测,并通过调整副本、带宽、Redis集群、数据库集群数量等方式提升QPS,最后通过不断的压测以及配置不断的增加,了解到我们使用什么样的配置、用多少副本、用多少带宽、什么样的Redis、数据库集群能够抗住多少的用户,但这个需要视我们真实的业务场景,如果QPS到100就够用的话,那么我们花费那么高的成本搞那么大的QPS有什么意义呢?我们又不是需要再做一个淘宝出来,实际没有那么高的用户量,搞到极致的优化也只是劳民伤财罢了

4. 疑问

  • Agent的压测机配置必须很高吗?

    • 压测机的配置高,将赋予压测机更高的压测能力,但QPS的高低并不是通过压测机来决定,Qps低的项目,搞个超级计算机过来,Qps仍然低

  • 为何我启动Agent执行任务后每次都需要Install Sdk?每次安装都需要半天,翻墙我也处理过了,但还是很慢

    • 建议Agent启动时指定dotnethome,并且在启动任务时,最好指定任务的框架环境是已经存在的环境,Agent的启动配置可以查看入门篇,指定任务运行框架可以查看进阶篇

  • 为何我通过crank官方的命名运行出错呢?

    • crank还在持续更新升级中,可能会出现用新版本的crank发送上文示例不能使用的情况,可以安装指定版本的crank,以上示例都有在0.2.0-alpha.21567.1版本运行成功

  • 我想自己搭建Agent的docker镜像,文中提供的镜像不知道是否安全?

    • 文中用到的镜像是通过下面的dockerfile编译的,没有搞很复杂的东西,不放心的可以使用自建镜像

    • doddgu/crankagent:net5.0是.net 5.0版本

  • 我的压测场景也需要登录,但不需要实现每次请求都是一个新的用户,我该选择bombardier还是wrk、wrk2呢?

    • 针对压测场景简单的,又不需要实现多用户、不需要动态参数的可以用bombardier、简单不需要学习lua、成本低

    • 希望可以用动态参数,玩一些复杂场景的,选择wrk或者wrk2更合适

  • 压测场景单一,且不需要实现多用户、不需要动态参数不能使用wrk、wrk2吗?

    • bombardier能实现的场景,wrk、wrk2都可以做到

    • 针对简单的get请求,不需要更改参数使用wrk一样很简单、使用post请求的需要多掌握一点lua脚本知识,有条件的还是建议使用wrk、wrk2,它更灵活入手成本也不是太大

crank agent dockerfile

FROM mcr.microsoft.com/dotnet/sdk:5.0ENV PATH="${PATH}:/root/.dotnet/tools"EXPOSE 5010RUN dotnet tool install -g Microsoft.Crank.Agent --version "0.2.0-alpha.21567.1" ENTRYPOINT crank-agent --dotnethome "/usr/share/dotnet"

5. 总结

Crank的功能其实是很单一的,它不像我们起初想象的那样庞大,所有的事情都能做,也没那么复杂,但我们也可以说Crank什么都能干,因为它提供了让我们运行dotnet项目以及在docker中运行dotnet程序的能力。

但它最后能做什么事取决于使用它的人想用它来干什么,它只是一个工具而已,不要把它想得太美好,有了它以后可以不写代码,自动化完成测试工作,我只需要等结果,自动出报告等等……有这样想法的还是去洗洗脸吧,大白天的竟然在做梦?

压测以及性能调优考验的是我们对整个系统的一个全局掌控能力,通过压测让我们知道目前系统的瓶颈在哪里?等我们的业务规模到了瓶颈时,可以通过调优提高项目的QPS、使其响应能力更快,不会因为系统而影响我们的业务,其目的是帮助业务发展的更好,但如果业务没发展起来,一味的陷入性能调优这个深坑中去,会使得我们花费高昂的代价做了没有实际意义的事,就比如说家里总共就四口人,非得搞个中巴,美其名曰可以拉更多的人,过年走亲戚不会坐不下什么的,每次出门费油又心疼的不得了,最后舍不得开了,最后还得花钱给它找停车位,那就得不偿失了

开源地址

MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks

MASA.Contrib:https://github.com/masastack/MASA.Contrib

MASA.Utils:https://github.com/masastack/MASA.Utils

MASA.EShop:https://github.com/masalabs/MASA.EShop

MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor

如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们

05fe425acc5bdda2a35eeae2a3e8cd62.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3732: Network

3732: Network Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 395 Solved: 179[Submit][Status]Description 给你N个点的无向图 (1 < N < 15,000)&#xff0c;记为&#xff1a;1…N。 图中有M条边 (1 < M < 30,000) &#xff0c;第j条边的长度为&#xff1a; …

Android编译出现XML or text declaration not at start of entity

1、问题 运行Android项目的时候提示出现这个XML or text declaration not at start of entity 日了狗前几天都正常2、解决办法 原来是我的一个xml文件的头部有空格&#xff0c;去掉了就好了。

我的CSDN,我的编程生涯

我的CSDN&#xff0c;我的编程生涯&#xff0c;由此开始&#xff0c;加油&#xff01;

里rust怎么找蓝图_Rust错误处理

错误处理是程序开发中必不可少的一个环节&#xff0c;在Rust中&#xff0c;错误分成两个类别&#xff1a;可恢复错误和不可恢复错误。 可恢复错误&#xff1a;比如说未找到文件&#xff0c;Rust中用Result<T,E>来实现 不可恢复错误&#xff1a;比如数组访问越界&#xff…

转载牛X文章

2019独角兽企业重金招聘Python工程师标准>>> Java中有关Null的9件事&#xff1a; http://www.importnew.com/14229.html 深入理解java异常处理机制&#xff1a; http://blog.csdn.net/hguisu/article/details/6155636 Android JNI知识简介&#xff1a; http://blog.…

Android Listview中Button按钮点击事件冲突解决办法

今天做项目时&#xff0c;ListView中含有了Button组件&#xff0c;心里一早就知道肯定会有冲突&#xff0c;因为以前就遇到过&#xff0c;并解决过&#xff0c;可惜当时没有记录下来。 今天在做的时候&#xff0c;继续被这个问题郁闷了一把&#xff0c;后来解决后&#xff0c;赶…

使用.Net6中的System.Text.Json遇到几个常见问题及解决方案

前言以前.NetCore是不内置JSON库的&#xff0c;所以大家都用Newtonsoft的JSON库&#xff0c;而且也确实挺好用的&#xff0c;不过既然官方出了标准库&#xff0c;那更方便更值得我们多用用&#xff0c;至少不用每次都nuget安装Newtonsoft.Json库了。不过日常开发使用中会有一些…

Android开发之运行客户的Demo拿不到数据

1、问题 自己照着客户的Demo写发现拿不到数据&#xff0c;很奇怪&#xff0c;检查不出哪里有问题2、思考 我自己写的东西和Demo本质上没有区别&#xff0c;但是就是拿不到数据&#xff0c;这尴尬了&#xff0c;后面发现我是在onCreate里面直接初始化然后马上调用&#xff0c;客…

C#系统开发登录窗体在MDI窗体之前显示

通常,系统运行时的启动窗体是MDI窗体,起作用的是main()函数的Application.Run(new Mdi())语句,但我们的效果是先显示登录窗体,再显示Mdi窗体。此时,如果将该句改为Application.Run(new Login()),运行时虽可出现登录窗体Login,但Mdi窗体会闪一下然后隐藏。解决办法: …

python测试之道pdf百度云_Python测试之道——笔记1

引言如果利用python做自动化测试的话&#xff0c;一些python相关的基础知识是必须要掌握的。常用的比如&#xff1a;python代码规范、变量与数据类型、运算、函数和字符串处理等。语法规范这里只介绍重点和常用的一些注意事项。在使用python编码的时候&#xff0c;我们应该严格…

libcurl实现解析(3) - libcurl对select的使用

1.前言 在本系列的前一篇文章中。介绍了libcurl对poll()的使用。參考"libcurl原理解析(2) - libcurl对poll的使用"。 本篇文章主要分析curl_poll()中对select()的封装使用。与前一篇类似&#xff0c;我们仅仅分离出与select相关的代码。 2.curl_poll函数分析 这个函数…

C#子窗体运行时无法正常最大化的解决办法

通常情况下,要是一个窗体运行时最大化,最简单的做法就是鼠标捏一下将窗体的WindowState属性设为Maximized。但要是一个窗体是MDI的子窗体的话,以上做法就失灵了!这是我们就选择用代码控制,示例代码如下: Education_Train TE = new Education_Train(); TE.MdiParent = thi…

C和指针之高级指针话题通过函数指针实现在链表中找到特定的值

1、问题 通过函数指针实现在链表中找到特定的值,这里可以是int 类型或者char *类型 思路: 整形数据自己写比较函数,字符串比较用strcmp,然后把这个函数指针传递到函数作为参数。 2、代码实现 #include <stdio.h> #include <string.h>typedef struct No…

internet访问局域网内部方法之----------路由器端口映射

很多人每天都问为什么要端口映射&#xff1f;例如:通过路由器上网的&#xff0c;网站自己可以访问&#xff0c;但是别人就不能&#xff1b;输入127.0.0.1可以访问&#xff0c;别人还是看不到&#xff1b;输入localhost可以看到&#xff0c;但是别人就是看不到&#xff0c;气人啊…

Xamarin效果第四篇之CollectionView子项右侧布局

前面基于PopupPage然后实现了手机底部弹窗;今天再次基于他从手机右侧弹出一个可以交互的窗口;直接看看最终实现的效果:右侧弹窗不是重点主角是排行榜:我还是直接使用CollectionView然后对于头像那一块还是CollectionView然后通过修改他的子项和Header模板然后旋转让子项从右侧布…

由于TempDB设置错误导致SQL Server无法重启错误的解决方案

场景&#xff1a;前几天接到一个朋友的电话&#xff0c;说他们由于将TempDB设置错误导致SQL Server无法重启&#xff0c;让我帮忙看看。他们本来是想将TempDB的文件挪动到其他路径,比如准确的脚本应该是&#xff1a; USE master GO ALTER DATABASE tempdb  MODIFY FILE (…

知道经纬度用python画路线图_神级程序员教你用Python如何画一个中国地图!(好好玩)...

为什么是Python先来聊聊为什么做数据分析一定要用 Python 或 R 语言。编程语言这么多种&#xff0c; Java , PHP 都很成熟&#xff0c;但是为什么在最近热火的数据分析领域&#xff0c;很多人选择用 Python 语言&#xff1f;数据分析只是一个需求&#xff0c;理论上来讲&#x…

判断一个偶数(大于4)是不是两个素数之和

问题:编制具有如下原型的函数sushu(int n),用来判断整数n是否为素数; 而后编制主函数,任意输入一个大于4的偶数d,找出满足d=d1+d2的所有数对,其中要求d1与d2均为素数(通过调用sushu函数来判断素数)。如偶数18可以分解为11+7以及13+5;而偶数80可以分解为:43+37、61+19、…

C和指针之动态内存分配堆、栈、全局区(静态区)、常量区对比总结学习笔记

一、各个区的介绍 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是…

.NET 6 使用 string.Create 提升字符串创建和拼接性能

本文告诉大家&#xff0c;在 dotnet 6 或更高版本的 dotnet 里&#xff0c;如何使用 string.Create 提升字符串创建和拼接的性能&#xff0c;减少拼接字符串时&#xff0c;需要额外申请的内存&#xff0c;从而减少内存回收压力本文也是跟着 Stephen Toub 大佬学性能优化系列博客…