i需要多少QPS才能测出BUG
前段时间我关注了一篇文章,分享如果使用并发压测发现BUG。突然想起一个话题:
线程不安全需要多少QPS压测才能发现BUG?
我接触到的并发缺陷绝大部分是因为线程安全问题导致的,还有一些数据库锁的问题(这个不擅长)这里就不分享了。
关于Java的一些线程安全的问题,可以参考旧文:操作的原子性与线程安全20190716快看,i真的不安全20190719原子操作组合与线程安全20190722线程安全集合类中的对象是安全的么?20200224Lambda表达式在线程安全Map中应用20200601
下面我们来聊聊上面提到的问题,因为这涉及到不同类型的BUG需要多少QPS才能测出来BUG,今天来分享一下最简单的线程不安全操作i需要多少QPS才能测出来BUG。用例设计思路
首先,我使用的同一个JVM来测试i,发现极容易出现BUG,后来放弃了这种方式。经过思考发现如果放在一个JVM里面,本身已经创建了很多线程去执行i,这种跟实际接口测试差异比我想象的大很多。其次,我创建了一个简单的Springboot项目,写一个简单的接口来实现。
总提测下来,上面的问题需要修正,因为能不能测出来不是一个Boolean值,而是一个概率值,后面我也会用发现比例值来表示是测出BUG的难易程度。服务端设计
之前一直用mocofuntester框架来构建服务端不行了,无法动态接口返回。所以只能简单弄一个Springboot项目。其他的就不分享了,只分享一下controller的部分。这里模拟盘了一个接口平均响应时间10ms,然后执行一个非线程安全的操作。inti;GetMapping(valuefuntest)publicResulttest1(){Thread。sleep(SourceCode。getRandomInt(20));returnResult。success(i);}GetMapping(valuegeti)publicResulttest(){returnResult。success(i);}GetMapping(valuezero)publicResultte2st(){i0;returnResult。success(i);}测试用例
这里没有使用正经的测试框架,只用了异步线程池和粗略的sleep休眠的方法控制QPS,所以这里会有一个实际QPS统计。默认以固定QPS执行20s。先重置,后执行,最后获取结果。取消所有日志打印,避免误差统计误差数量和误差比
测试用例模拟盘两个模型:线程模型和QPS模型。线程模型用例publicstaticvoidmain(String〔〕args){deftest{getHttpResponse(getHttpGet(http:localhost:8080userfuntest))}defget{getHttpResponse(getHttpGet(http:localhost:8080usergeti))}definit{getHttpResponse(getHttpGet(http:localhost:8080userzero))}AtomicIntegerindexnewAtomicInteger()FunHttp。LOGKEYfalsedeft1000defsize1setPoolMax(500)init()fun{output(DEFAULTSTRING)}sleep(1。0)defstartTime。getTimeStamp()size。times{fun{t。times{test()index。getAndIncrement()}}}ThreadPoolUtil。waitFunIdle()defvalueget()。getIntValue(data)defendTime。getTimeStamp()output(当前QPS:{index(endstart)1000})output(index。get(),value)output(getPercent(index。get(),index。get()value))}QPS模型用例publicstaticvoidmain(String〔〕args){deftest{getHttpResponse(getHttpGet(http:localhost:8080userfuntest))}defget{getHttpResponse(getHttpGet(http:localhost:8080usergeti))}definit{getHttpResponse(getHttpGet(http:localhost:8080userzero))}AtomicIntegerindexnewAtomicInteger()FunHttp。LOGKEYfalsedefqps100deftqps10setPoolMax(1000)init()defdecimal1000000000qpsfun{output(decimal)}sleep(1。0)defstartTime。getTimeStamp()t。times{sleepNano(decimalaslong)fun{test()index。getAndIncrement()}}ThreadPoolUtil。waitFunIdle()defvalueget()。getIntValue(data)defendTime。getTimeStamp()output(当前QPS:{index(endstart)1000})output(index。get(),value)output(getPercent(index。get(),index。get()value))}测试结果线程模型
线程模型模仿的固定线程数去不断请求接口,这里由于接口平均响应时间10ms,每个线程执行次数设计为2000次,差不多20s执行完。
设计QPS实际QPS误差数量误差比(百分比)109。6002018。7005042001008720。120017490。22300280180。3400285230。2850041720。02QPS模型
由于对实际结果测试并不能很好预期,这里就先从较小的QPS开始了。全程没有触发性能瓶颈,误差部分,测5次,取误差最大的一次记录。这里模拟的线程模型的
线程数实际QPS误差数量误差比(百分比)17600214410。054305330。4186171110。69129272240。93
经过上面测试,对于需要多少压力才能发现可能存在的缺陷,希望本文能投提供参考。
巴金三部曲(巴金人间三部曲)巴金三部曲(巴金人间三部曲)《〈第四病室〉手稿珍藏本》为读者提供了接近巴金心路历程的罕见文献。(均华文出版社供图)今年是一代文学巨匠巴金先生诞辰115周年,《〈第四……
巴金三部曲(巴金)激流三部曲《家》、《春》、《秋》,爱情三部曲《雾》、《雨》、《电》,《憩园》、《第四病室》、《寒夜》,五卷《随想录》(包括《随想录》、《探索集》、《真话集》、《病中集》、《无题……
巴金的爱情三部曲(巴金爱情三部曲是什么)巴金的爱情三部曲(巴金爱情三部曲是什么)巴金爱情三部曲是《雾》、《雨》、《电》。《爱情三部曲》是1988年6月人民出版社出版的图书,是巴金创作的长篇小说系列之一,主题是探……
洋葱歌(洋葱哥被曝同时交往6女友后道歉)洋葱歌(洋葱哥被曝同时交往6女友后道歉)洋葱哥董康潮这一次是洗不干净了,他原本就是球场渣男人设,专门以单挑女生、噩耗女生为噱头的篮球网红,他的身高只有1。72米很矮,而且……
印度公布航天计划路线图,明年首次载人航天,想象中的宏伟实现难印度航天远景规划,明年和2024年都是很重要的节点,包括:首次载人航天、对月球南北极探测、火星和金星的探测,甚至发射航天器出太阳系像旅行者号探测器那样对外星系探险。以印度……
滑铁卢是什么意思(滑铁卢)滑铁卢是什么意思(滑铁卢)滑铁卢是比利时的一个小镇。1815年6月18日,拿破伦的军队在这里与以英国为首的联军激战,最后全军覆没,被迫再度宣布退位,最后流放到南大西洋的圣……
女人学会舍得(女人做到三个舍得)女人学会舍得(女人做到三个舍得)想掌握家中的财政大权吗?这个问题想必对于每一个已婚女人来说,都不陌生。即便是女性越来越独立,即便无数人提倡婚后AA,其实仍然有大部分女人认……
科幻变为现实,科学家推出寿命计算器,准确率高达98如果某款软件,可以让你知道自己的生命还剩多少时间,你会去使用吗?就像一部名为《倒忌时》的影片中,只要人们下载使用一个名为CountDown的App,就能够看到自己的生命还剩下多……
奥陌陌的出现,给高智商的科学家们出难题了?它的身份,又变了又变了,奥陌陌是外星产物?能加速,也能减速,让科学家沸腾奥陌陌这个名词对于天文爱好者来说,这是一个重要的发现,它是人类已知的第一进入太阳系的神秘物体。科学家们关于奥陌陌来……
我们真的存在吗?人是怎么存在的?我们到底是什么?我们真的存在吗?我听过的大多数理论都像你知道你不能证明你的存在,所以我们不存在。许多人都曾有过这样的想法,你们都生活在我的世界里,你……
周二精彩英语演讲TED为什么二十岁之后的十年至关重要FOLLOWUS轻松学英语一个有用有趣有温度的英语干货分享平台鲸小爱英语精彩英语演讲栏目为什么20岁之后的十年至关重要资深心理咨询师MegJay为20几……
谁说Reno6星黛紫是花瓶?真实体验告诉你,什么叫颜艺俱佳随着时间的流逝,暑假也进入倒计时阶段,最近后台也有不少小姐姐咨询,OPPOReno6是否值得购买?实际上,她们主要看中了OPPOReno6的颜值和影像功能,但并不知道具体表现到……