在做压测中遇到格式各样的问题,因此总结一下,以备以后可以避免!
1. 压单接口,须要token怎么办?
我们在做接口压测的时候有时候需要token,token呢又是需要登录才能产生,如果我把登录接口也写压测脚本中,在压测时也会大量的请求登录接口,很占用系统资源!
-
场景:场景中压测的接口并不是做一次就需要一个新的token(每个用户只能进行一次操作,例如:某个赛事的报名),一个用户可以进行多次操作这个接口
-
解决方法:
① 在线程组中设置一个"仅一次控制器",把获取token的接口放到“仅一次控制器”中,然后在获取token的接口后面添加一个“后置处理器-JSON Extractor”,提取获得的token给下个接口用!
② 在线程组中设置一个“循环控制器”,把需要压测的接口放到“循环控制器”中,设置循环次数,每个线程都只会执行一次登录,然后会按照“循环控制器”中设置的循环次数去执行!
2. 压单接口,每个接口发送都须要一个相对应的token,登录接口又只支持很小的并发,如果关联起来,登录脚本报错压测的接口也报错怎么办?
解决方法:使用jmeter后置处理器中的JSON Extractor和BeanShell PostProcessor
JSON Extractor:提取json报文中的token
BeanShell PostProcessor:把提取的token保存到本地
//log.info("................."+vars.get("tokenid")+"..............");
///log.info:打印变量使用,为了看代码对变量值的修改是否正确
FileWriter fstream=new FileWriter("${datadir}/Token.csv",true);
// ${datadir}是我在测试计划中报错的相对路径变量
BufferedWriter out =new BufferedWriter(fstream);
log.info("................."+vars.get("tokenid")+"..............");
out.write(vars.get("tokenid")+"\n");
out.close();
fstream.close();
然后在用csv文件读取本地的token进行压测
3. 使用非GUI模式执行,上个执行结果忘记删除,导致新执行的日志追加到上一个日志中
当用非GUI模式执行脚本的时候,我们会把jmeter执行的结果保存到日志中,但是往往会忘记把上个执行结果的日志删除,这样就导致了新执行的日志追加到上个日志中!用jmeter查看的日志结果就会不准确!
解决方法:
①.在测试计划中新增一个时间变量名time:变量值:${__time(MM)}-${__time(dd)}_${__time(HH:mm:ss)}
②.保存日志的文件名引用测试计划中的time变量名。
4. 怎么快速的确定cpu80%以上需要多少并发
先进行小批量的并发,例如:200个(看实际情况),然后看一下cpu使用率,大概可以按照 1/当前cpu使用率*200
而得到cpu100%时大概需要多少并发(准不准不清楚,目前我是这样弄的),然后再去慢慢调试!
5. 被压接口增加100并发,cpu都会有变法,为什么并发数一直再增加,被压系统cpu未增加也不报错!
这个需要看是否有别的因素限制了性能:
① 关注jmeter服务器的CPU、内存、磁盘、NAT的性能、EIP的性能,有木有达到瓶颈?保证首先性能瓶颈不在发端。
② RDS的cpu:数据库cpu达到瓶颈,会影响被压接口的实例cpu
③ RDS的内存:同上
④ Redis的cpu:同上
⑤ Redis的内存:同上
⑥ 带宽:同上
还有就是你的硬件性能太好啦,100只是毛毛雨看不出什么
6. bug:压测登录接口导致所有接口都很卡
token过多后,redis访问接口使用错误(具体原因忘记了)
7.查看了数据库监控, 数据库CPU满载
解决方法:
① 数据库增加缓存机制:缓存的介质一般是内存,所以读写速度很快。缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。
② 增加索引
③ 升级数据库配置
8. 数据库删除压测报名数据后,报名任然提示已报名
原因:redis缓存没有做相应的清空
什么操作最耗费数据库资源?是查询。查询中的子查询、多表查询,条件中的Group by、order by,以及limit等操作都会消耗不少的数据库资源。
-
提升数据库效率,在资金充足的情况下,我们可以通过提升硬件设施来完成:
购置多个服务器,每个服务器执行不同的数据操作,查询类操作消耗资源,可以分给好多个数据库来操作,叫做“读写分离技术”。 -
为了缓解接口(数据库)的压力,对查询的结果做了缓存的策略
1.执行查询
2.缓存中存在数据 -> 查询缓存
3.缓存中不存在数据 -> 查询实时接口 -
redis的主从模式
redis存储数据是在内存中运行的,运行速度比关系型数据库要快一些。而且它具有SortSet/Hash等具有特色的数据类型
redis有增删改查四种操作,和一般的数据库差不多。
添加、修改、删除都叫“数据写入”,主服务器可以作为“写入”服务器,而从服务器可以作为“读取”服务器。主服务器和从服务器要通过一些技术自动来同步。这叫“主从模式”。
-
创建基于redis的主从模式
我们也可以给reids构建一个“主从模式”。在多台服务器上安装Redis,然后主服务器负责写入
操作,从服务器进行读取操作。主从服务器是可以自动备份的:
(主服务器是master,从服务器是slave)
网友评论