关于XXXX生产环境压测报告
文章目录
| 修订历史 | ||||
|---|---|---|---|---|
| 所属部门 | 版本号 | 编制修改原因 | 人员 | 修改日期 |
| XXXXX | 001 | 创建 | XXXXX | XXXX年XX月XX日 |
| XXXXX | 002 | 修订 | XXXXX | XXXX年XX月XX日 |
| XXXXX | 003 | 修订 | XXXXX | XXXX年XX月XX日 |
| XXXXX | 004 | 修订 | XXXXX | XXXX年XX月XX日 |
| XXXXX | 005 | 评审 | XXXXX | XXXX年XX月XX日 |
目录
本次测试是针对XXXXX系统服务进行的压力测试,本次压测主要提取XXXXX进行压力测试。
本次采用apache的开源测试工具Jmeter,采用Jmeter代理服务器录制脚本生成http请求脚本,并通过http协议post方式发送访问请求,收集服务器响应速度等情况。
安装启动JMeter,分别对以上页面进行压力测试分别测试50、100、500、1000、2000、3000、4000个线程,即模拟这些数目的用户并发; Ramp-up period(inseconds)的值设为1(即1s启动50、100、500、1000、2000、3000、4000并发访问),并发持续运行为5分钟。


图示请求无消息体内容(下面是展示消息体Json格式):
{
"orderNo": "AAAA",
"areaId": 123456,
"updatetDate": "2022-10-14",
"createDate": "null",
"mobile": "12345678911",
"userId": 2,
"address":{
"city":330300,
"street":"aaaa"
}
}



| 测试项 | 并发数 | 持续运行时间 | 响应时间最小 | 响应时间最大 | 平均响应时间 | 成功率 | 总请求量 | 吞吐量 |
|---|---|---|---|---|---|---|---|---|
| 系统入口 | 50 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec |
| 100 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec | |
| 200 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec | |
| 500 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec | |
| 1000 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec | |
| 2000 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec | |
| 3000 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec | |
| 4000 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec |
XXXX服务服务器器极限值
| 主机用途 | 机型/OS | 台数 | CPU/台 | 内存容量/台 |
|---|---|---|---|---|
| 模拟用户请求 | Windows | 2 | 8 | 16G |
本次测试是在公网中进行的测试,更能模拟用户操作环境,可以会对压测造成影响。
| 压测环境 | 测试人 | 测试时间 |
|---|---|---|
| XXXX生产环境 | XXXX | 2022年10月14日 |
系统已经经过开发人员部署在虚机上,无需另外再次进行系统部署。
名词定义(时间的单位均为ms):
样本----本次场景中一共完成了多少个线程
平均值----平均响应时间
中位数----50%请求的响应时间
90%百分位----90%请求响应时间
95%百分位----95%请求响应时间
99%百分位----99%请求的响应时间
最小值----最小的响应时间
最大值----最大的响应时间
异常%----错误率=错误的请求的数量/请求的总数
吞吐量----吞吐量即表示每秒完成的请求数
接收 KB/sec----每秒从服务器端接收到的数据量
发送 KB/sec----每秒从客户端发送的请求的数量
压测场景:
聚合报告
并发50个用户,持续运行5分钟,完成71036次访问请求,最小响应速度为37ms,最大为2815ms,平均响应速度为210ms,与预期的快,访问成功率100%,符合预期的需求。

从下图可以看出从开始压测,并持续运行5分钟到结束,总共处理请求71036个,几乎所有请求的响应时间都在1秒左右,符合预期。

聚合报告
并发100个用户,持续运行5分钟,完成89001次访问请求,最小响应速度为36ms,最大为2050ms,平均响应速度为336ms,吞吐量在293.5/sec,比预期的快,访问成功率100%,符合预期的需求。

从下图可以看出从开始压测,并持续运行5分钟到结束,总共处理请求89001个,几乎所有请求的响应时间都在1秒左右,符合预期。

聚合报告
并发200个用户,持续运行5分钟,完成95803次访问请求,最小响应速度为55ms,平均响应速度在1秒内,与预期的快,访问成功率100%,符合预期的需求。

从下图可以看出从开始压测,并持续运行5分钟到结束,总共处理请求95803个,几乎所有请求的响应时间都在2秒内,符合预期。

聚合报告
并发500个用户,持续运行5分钟,完成102473次访问请求,最小响应速度为88ms,最大为5188ms,平均响应速度为1462ms,并且吞吐量达到为340.7/sec,比预期的快,访问成功率100%,符合预期的需求。

从下图可以看出从开始压测,并持续运行5分钟到结束,总共处理请求102473个,几乎所有请求的响应时间都在3秒左右,符合预期。

聚合报告
并发1000个用户,持续运行5分钟,完成17871次访问请求,最小响应速度为173ms,最大在15秒以内,平均响应速度为3290ms,与预期的快,访问成功率100%,符合预期的需求。

从下图可以看出从开始压测,并持续运行5分钟到结束,总共处理请求91420个,百分之90的请求响应时间在5秒以内,符合预期。

聚合报告
并发2000个用户,持续运行5分钟,完成92777次访问请求,最小响应速度为365ms,最大在30秒以内,平均响应速度为6.5秒,与预期的快,访问成功率100%,符合预期的需求。

从下图可以看出从开始压测,并持续运行5分钟到结束,总共处理请求92777个,百分之95的请求在10秒左右响应,符合预期。

聚合报告
并发3000个用户,持续运行5分钟,完成91124次访问请求,最小响应速度为809ms,平均响应速度在10秒内,吞吐量为298.0/sec与预期的快,访问成功率100%,符合预期的需求。

从下图可以看出从开始压测,并持续运行5分钟到结束,总共处理请求91124个,百分之90的请求在15秒左右响应,符合预期。

聚合报告
并发4000个用户,持续运行5分钟,完成80037次访问请求,最小响应速度为311ms,平均响应速度在15秒左右,百分之90的请求在30秒以内响应,比预期的快,访问成功率97.67%,符合预期的需求。

从下图可以看出从开始压测,并持续运行5分钟到结束,总共处理请求80037个,在开始一分钟时达到第一个峰值,表示请求挤压一定的时间,系统处理请求变得缓慢,此时jmeter发送的请求也变少,系统将积压的请求处理完成,到开始两分钟节点时,第二个峰值到来,响应时间由于系统一直处理高压事态,当jmeter发送请求略微变快,系统开始报错,但是百分之90的请求在30秒以内响应,符合预期。

压测结果:
| 测试项 | 并发数 | 持续运行时间 | 响应时间最小 | 响应时间最大 | 平均响应时间 | 成功率 | 总请求量 | 吞吐量 | 是否符合预期 |
|---|---|---|---|---|---|---|---|---|---|
| 预期结果 | 50-4000 | 5min | <1s | <2min | <20s | 100% | >80000 | >200.0/sec | * |
| 系统XXXX实际结果 | 50 | 5min | 37ms | 2815ms | 210ms | 100% | 71036 | 236.7/sec | 符合预期 |
| 系统XXXX实际结果 | 100 | 5min | 36ms | 2050ms | 336ms | 100% | 89001 | 296.5/sec | 符合预期 |
| 系统XXXX实际结果 | 200 | 5min | 55ms | 9632ms | 625ms | 100% | 95803 | 319.0/sec | 符合预期 |
| 系统XXXX实际结果 | 500 | 5min | 88ms | 5188ms | 1462ms | 100% | 102473 | 340.7/sec | 符合预期 |
| 系统XXXX实际结果 | 1000 | 5min | 173ms | 14390ms | 3290ms | 100% | 91420 | 302.7/sec | 符合预期 |
| 系统XXXX实际结果 | 2000 | 5min | 365ms | 27540ms | 6474ms | 100% | 92777 | 306.6/sec | 符合预期 |
| 系统XXXX实际结果 | 3000 | 5min | 809ms | 113810ms | 9975ms | 100% | 91124 | 298.0/sec | 符合预期 |
| 系统XXXX实际结果 | 4000 | 5min | 311ms | 347362ms | 15489ms | 97.67% | 80037 | 165.9/sec | 不符合预期 |
并发50-3000之间,持续时间5min,响应最小时间在一秒以内,平均时间在20秒以内,成功率100%,总请求在80000以上,吞吐量大于200/sec。压测发现硬件CPU及内存存在不足,并发数在2000时,请求的平均响应时间为30秒以内,平均每秒处理306个请求,但是当并发增加到了3000个时,服务器的平均响应速度变得很慢,但是每秒依旧处理将近300个请求,但是当并发到达4000个时,系统大量请求挤压,响应时间最长达5分钟,并且出现异常,系统每秒处理的请求数量也急剧下降到165个请求,如果此时大量请求持续进来,系统将宕机。
PS:该服务器还有一些其他服务运行这占有一定的CPU及内存对数据结果是存在一定的影响的。所以此数据只能作为参考值来看。
依照目前生产服务情况达到每秒3000并发,每秒吞吐量298.0将是极限,建议增加CPU及内存或作负载均衡,方可维护服务的稳定。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。