【转】性能测试设计和LR原理的探讨
做了4个迭代的性能测试, 在没有需求的情况下步步艰辛,把代码和框架独立开发从0到一万多行代码的测试工具(脚本),作为性能测试工具佼佼者Lr,我时而拿他作参考,山寨了它很多 东西,同时带有很多疑问对它实现性能测试的原因渡过了为期3个月的性能测试之旅。以下是我对比测试脚本和LR所得出的详细问题:
1、如何计算每秒处理包的数量
我针对这个曾经研究了很久。在多线程的情况下,压服务器的时候,是专门建立一个线程去采集这些信息,还是说在每个线程里面实现这个时间。后来我采取了后者。因为在到达了某项瓶颈之后,这段时间的变化是很小但是也不能忽略了。
例如下面的伪代码1:
EachThread: BeginTime = time.time() Count = 0 While point: If RevPackage() == true: Count = Count + 1 EndTime = time.time() Runtime = BeginTime – EndTime EachsecondRpackage = float(Count) / float (Runtime) EachsecondRpackage = SumAll(EachsecondRpackage) |
伪代码2:
Count = 0 EachThread: global Count While point: If RevPackage() == true: 加锁 Count = Count + 1 解锁 TraceThread: Time.sleep(runtime) EachsecondRpackage = Count / runtime |
第一种,是每个线程自己算时间,然后在point为true的时间内算出每秒的收到的包,然后把所有线程的包加起来。第二种是线程不做任何算法操作。让 单独线程来做。第一种的好处是数值很准确,同时没有在关键点用了影响性能的锁。第二种则对总执行时间的统计很准确,但是里面用了锁。就2种来说一般第一种 用比较多,但是假如在延时比较大的发包或者关注整体事件流用的过程中,第二种的算法比较准确些(注意有时候延时越小不代表压力越大)。这里我带有的疑问 是,lr他是如何设定这个TPS的数字呢?是否2种结合还是只用了其中一种?
说到了锁,在很多性能测试中都会和数据库打 交道。我们当然想建立n多线程去冲击数据库(无论数据库是不是被测系统),但是数据库本身能够接受的线程就是有限制,而且其限制很低,虽然我们在数据库的 操作用线程锁是可以,但是造成个缺点是假如事件流很多,创建虚拟数据,和下发及时命令再带多并发的操作时,这个锁就会让很多线程(尤其是延时小的线程)会 卡在某个事件流的点上,导致socket断了。也影响数据结果(因为不知道算出来数据是否有别的事件导致出现误差)。解决方法是尽量不影响测试的情况下把 能做的数据库数据先做了,实时的数据库建议先在某个点做集合点,统计够了再做压力冲击。这里就用了Lr的集合点概念,注意的还是算平均值的开始和结束事件 要抓准。
说到数据库,假如你的db知识不是很牛的话测试数据lr是个好首选,但是一些复杂情况下我们不是每种用例都适用Lr测试。这时候你需要非常清晰的了解你的测试需求。下面的伪代码:
Python: for i in range(1000): cursor.execute(SQL); |
C++: For (I = 0;i<1000 ;i++) { cursor.execute(SQL); } |
SQL:
FOR i IN 1 .. 1000 LOOP
(SQL)
commit;
END LOOP;
这里用了py和C++,还有数据库本身的循环,3种循环用的时间都是不一样。SQL的最快,C++其次,然后是PY,不同被测系统的需求用不同 的方式测试性能,假如你直接测试数据库某个存储过程,则能用SQL就用SQL,或者其他语言调用的时候循环都要用SQL的,对比被测产品调用SQL的话, 则拿其中一种语言对比调用被测产品和直接调用数据库的差别。对于LR的疑问它假如测试出很多SQL的性能指标后,到底它是如何解决我上面提到的问题呢?
说到循环,每次我们做完测试报告写完宣讲时,开发人员总会问这个瓶颈是产品的瓶颈,还是你测试脚本的瓶颈?所以作为测试用脚本语言当然是首选, 但是脚本语言的效率不高是弱点,所以每次用脚本语言做多线程压力测试的时候,每个关键的循环尽量调用C++等效率高的语句来做,同时注意调用时间。LR这 块其实用的时候偏事件流的方式做,所以像这种变态的压其实比较少。
说到多线程,这是我研究Lr比较多的一个地方。当我自己写脚本的时候经常会深入研究不同操作系统不同硬件对线程的利用率的影响,还有线程锁,和 该不该配合队列,进程来做测试。当然理想是越多测试机做分布式,甚至用云台来做更好。但是现实情况你不仅仅考虑开多少个线程多少个测试机,而是说100个 线程用1台机器跑,和用10台机器跑的差别,测试产品瓶颈首先要测试网络,系统的瓶颈。一台机器假如到达了50个线程和100个线程所出的吞吐量是一样的 话,那么这台机器最佳启动线程是50个。我听说Lr有队列有线程有进程一起配合的情况下做制作并发测试。我也按照他的负载测试方式设计脚本,但是即使是云 台也存在分析操作系统和硬件的弱点,假设lr在单台服务器做1000(假设数据)个并发(不考虑多条件)的话,它到底是怎么实现并发的?
说到了最关键的操作系统,网络,硬件这块了。很多时候我们高科技的性能测试产物—性能报告变成废铁的。就是这3个造成。linux我最高记录并 发10800个线程(4cpu虚拟双倍),win7最高记录2100个线程(双核),这个仅仅是好看的记录,没了!因为我们IO口就这么大,磁盘读写能力 最大限制,网络带宽也有限制,所以上面开到的线程当然可以增加压力,但是在没穷到只剩1~2测试”服务器”的情况下,最好不要用一个方法,毕竟10台吊丝 台式强过1台高富帅服务器做客户端。同时虽然云计算其中一个概念是虚拟化计算,但是并不代表你每个测试机都把资源利用做虚拟机来做压力,因为最关键的线 程,虚拟机本身的软件和操作系统也消耗了一些线程的地盘,所以利用虚拟化计算做测试,需要谨慎。还有一点就是性能命令top,ps,sar等等的数值,你 要注意那些有用,哪些相对准确,虽然linux提供了很多性能命令,但是不代表他们之间是一模一样的。当然lr也是靠人工配合分析组网,测试机的性能。
最后说下你分析和出测试报告。lr的报告很华丽,很多专用性能测试名词都打上一堆,可爱的老大最喜欢看这个赚奖金的东西。但是实事求是的大牛没 那么容易骗过,把公司网络,各个资源都用上来做性能测试肯定要看到有意义的东西。我脚本投入了很多excel图表(交互式调用偷懒),来帮我做出很多图。 性能测试最重要是分析,我上面说的很多技术都为了准确获得数据分析而设计的。所以现在性能测试从单机到分布式到云都往精确这个关键点发展。很多次带着报告 面对各部分的开发老大,作为一个小QC如何把上百兆的日志和数据理出来跟这些高手报告需要注意很多细节。为什么这个阶段曲线会不没规律?什么是瓶颈?有没 问题?这些数据作为参考数据还是代表有问题?系统该不该优化?下一个迭代的任务和程序设计如何做?这些都必须自己理清楚。对比Lr,唯一的优势就是这些数 据我都知道怎么抓来的,但是要比上这个权威的工具,还是需要继续努力缩小差距。
下一个阶段不再是怎么去查询瓶颈,怎么去发现bug为主,因为敏捷到了接近尾声的时候,我需要变成选型工程师的角色,优化程序框架和处理,分析操作系统是主要任务,来为我们的产品节约成本,是性能测试的其中一个因素之一。
【转】性能测试设计和LR原理的探讨的更多相关文章
- solr的EmbeddedSolrServer原理深入探讨
solr的EmbeddedSolrServer原理深入探讨
- [Kubernetes] CRI 的设计与工作原理
咱们来看看,有了 CRI 之后, Kubernetes 的架构图: 我们可以看到, CRI 机制能够发挥作用的核心,在于每一个容器项目现在都可以自己实现一个 CRI shim ,自行对 CRI 请求进 ...
- 《jQuery技术内幕:深入解析jQuery架构设计与实现原理》
<jQuery技术内幕:深入解析jQuery架构设计与实现原理> 基本信息 作者: 高云 出版社:机械工业出版社 ISBN:9787111440826 上架时间:2014-1-10 出版日 ...
- 2本Hadoop技术内幕电子书百度网盘下载:深入理解MapReduce架构设计与实现原理、深入解析Hadoop Common和HDFS架构设计与实现原理
这是我收集的两本关于Hadoop的书,高清PDF版,在此和大家分享: 1.<Hadoop技术内幕:深入理解MapReduce架构设计与实现原理>董西成 著 机械工业出版社2013年5月出 ...
- 社区布道师揭秘消息中间件技术内幕,撰写MQ架构设计与实现原理
RocketMQ是什么 RocketMQ是由阿里捐赠给Apache的一款分布式.队列模型的开源消息中间件,经历了淘宝双十一的洗礼. RocketMQ的特性 RocketMQ基本概念 Client端 P ...
- 全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理
本系列前面的五篇文章主要介绍Dora.Interception(github地址,觉得不错不妨给一颗星)的编程模式以及对它的扩展定制,现在我们来聊聊它的设计和实现原理.(拙著<ASP.NET C ...
- kafka系列教程2(设计构造及原理1)
kafka采用了一些非主流(unconventional)并经过实践的设计使其高效和可扩展.在实际使用中kafka显示出了相对于常见流行的消息系统的优越性.并且每天能够处理上百GB的新的数据. 类 ...
- C语言的面向对象设计 —— 对 X264/FFMPEG 架构探讨
1.为什么要用C语言 直到今天,C语言虽然不是使用人数最多的语言了,但是C没有老去,在很多的核心系统代码里,依然跑的是设计精美的C,绝大多数的嵌入式开发核心库软件是C开发的,多数标准算法是基于标准C设 ...
- Lr原理初识-hc课堂笔记
showslow web服务器-apache.ngix devops 需求调研-占1/3的时间. 架构拓扑图 APP端测试工具:JT.Vtest 进程是管理单元.线程是执行单元. 虚拟用户和真实用户是 ...
随机推荐
- NagiosQL 跨站脚本漏洞
漏洞名称: NagiosQL 跨站脚本漏洞 CNNVD编号: CNNVD-201312-158 发布时间: 2013-12-11 更新时间: 2013-12-11 危害等级: 漏洞类型: 跨站脚 ...
- GitHub常用 库
来自: http://www.jianshu.com/p/6475c90e8b4d 网络请求库 https://github.com/AFNetworking/AFNetworking https:/ ...
- SharePoint Services 数据库表
转:http://dugan.bokee.com/630446.html 以下是Microsoft Windows SharePoint Services架构中数据库列表. Configuration ...
- 如何解决CHM打开乱码的问题
1. 问题 经常碰到一些 CHM 格式的帮助文档出现乱码无法阅读的情况,而且 CHM 文档不像浏览器一样,右键可以选择字符编码,非常不便.究其原因,主要就是 CHM 文档在页面中没有指定合适的字符编码 ...
- .9.png
.9.png是一种非失真性压缩位图图形文件格式.PNG格式是非失真性压缩的,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备阿尔法通道(半透明)等特性.现在有很多人使用PNG格式于互联网及 ...
- HDU 5648 DZY Loves Math 暴力打表
题意:BC 76 div1 1003有中文题面 然后官方题解看不懂,我就不说了,然后看别人的题解 因为询问i,j最大都是15000,所以可以预处理,res[i][j]代表答案,然后显然这是开不下的,也 ...
- [转]用C#实现的条形码和二维码编码解码器
条形码的标准: 条形码的标准有ENA条形码.UPC条形码.二五条形码.交叉二五条形码.库德巴条形码.三九条形码和128条形码等,而商品上最常使用的就是EAN商品条形码.EAN商品条形码亦称通用商品条形 ...
- css表格表头表尾固定,表身滚动
表头表尾固定,表身滚动实现用了3个table标签 <!DOCTYPE html> <html> <head> <meta http-equiv="C ...
- 关于 Lua 内存泄漏的检测
前一阵开始和同事一起优化内存,首先是优化 Lua 内存,因为发现每次战斗完后 Lua 内存非常大,从 3M 左右在经过了10次左右的战斗后,会暴增到近 100M,很明显是有内存泄漏. 然后我 ...
- 【HTML】Intermediate3:Meta Tags
1.Meta tags were the town criers of the Internet Do anything to the content that is presented in the ...