移动测试开发 服务端压力测试分享

opentest-oper@360.cn · October 18, 2019 · Last by liuau86 replied at October 20, 2019 · 2197 hits

一.压测的目的

压力测试是对系统不断施加压力,来获得系统最大服务能力的测试。
一般而言,只有在系统基础功能测试验证完成、系统趋于稳定的情况下,才会进行压力测试。

目的:
1.当负载逐渐增加时,观察系统各项性能指标的变化情况是否有异常
2.发现系统的性能短板,进行针对性的性能优化
(如:使用mysql存储的系统,高并发情况下,数据库读写速度慢,可以考虑增加数据库中间件,加缓存等;使用redis存储的系统,通常存储不会制约性能,但在高并发情况下,Redis的吞吐量非常大,这时候就需要考虑增加网络带宽来提高性能。)
3.系统在高并发情况下是否会报错,进程是否会挂掉
4.测试在系统某个方面达到瓶颈时,系统可以支持的最大负载

二.压测的关注点

压测的指标通常有tps、响应时间、错误率等,服务器资源监控cpu、内存、 I/O。
指标的来源:用户对各项指标提出明确需求,如果用户没有提出性能指标则根据用户需求和自己的经验来预估
观察服务器的各种异常情况
1、响应变慢
2、返回4XX、5XX错误码
3、服务器无响应
4、服务器crash等

三.压测指标


注:并发用户数≠每秒请求数
比如说:在性能测试工具或者脚本中设置了100并发用户数后,并不是每秒100个请求发给服务器。每秒发出多少请求只跟服务器返回响应的速度有关。如果用户在50ms内就收到了响应,那么它会立即发出第二个请求;而如果要一直等待3秒才能得到响应,它将会一直等到收到响应后才发出第二个请求。所以,只有当响应时间恰好是1秒时,并发用户数才会等于每秒请求数;否则每秒请求数可能大于并发用户数或小于并发用户数。
各项指标关系曲线

在并发数达到一定的数量后,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等其它消耗导致性能下降。

四.压测步骤


1.参数化是使用指定数据源中的值来替换脚本中的参数,可以更加真实的模拟现实应用。
2.压测中的场景可以理解为功能测试中的用例,合理的场景设计才会更好地发现系统的性能缺陷。
3.执行压测场景后,若分析结果没有达到预期,提出优化方案,优化后再重新测试。

五.场景设计涉及要素


1.并发用户数是多少?
2.需要包含哪些接口请求,各个接口请求的占比是多少?比如,70%的用户在请求获取配置的接口,30%的用户在请求上报结果接口。
3.各个操作之间的等待时间是多少?
4.测试刚开始时,以什么样的速率来添加并发用户?比如,每秒增加5个并发用户。
5.测试结束时,以什么样的速率来减少并发用户?比如,每秒减少5个并发用户。
6.达到最大并发用户数后持续多长时间?
7.需要监控哪些被测服务器的哪些指标?
8.脚本出错时的处理方式是什么?比如,错误率达到 10% 时,自动停止该脚本。
9.需要使用多少台施压机才能使被压机器产生足够的压力?

六.场景设计分析实例

1000台客户机,每台客户机间隔2s上报一次心跳(获取任务),服务端每秒向每个客户端下发一个任务,每个任务执行完成后向服务端上报result和message。
服务器:lvs 6台 4核8G Linux
数据库:redis、mysql
场景分析:共包含3个接口


预估tps:500+1000+1000=2500服务器每秒应能支持2500个请求
TPS=并发数/响应时间

接口平均响应时间:(100*1+150*2+400*2)/5=160ms
并发数:400
操作顺序:心跳(获取任务)->上报结果 ->上报其他信息
需要监控信息:服务器资源:CPU、内存、负载
数据库:mysql行锁时间、连接数、从库延时redis连接数、CPU使用率、内存

测试结果分析-确认问题
将测试结果与用户需求做比较,如果达不到用户需求,则需要对问题进行分析

七.常见问题分析


优化前:平均响应时间较长,Tps基本在1000左右,由于mysql操作占用较高的io,CPU大部分空闲,负载均在1左右
原因:mysql的性能影响了服务的性能,由于mysql经常连到上海、深圳,所以会时慢时快。
优化:mysql都连到北京机房
优化后:tps达到2000左右,平均响应时间是优化前的二分之一,tps是优化前的二倍。

八.压测工具介绍


Jmeter脚本创建

http头信息

http请求

参数化数据文件

BeanShell PreProcessor是一个前置处理器,它可以进行一些处理,比如执行一个算法并将结果存储到参数中。

响应断言:不符合断言的记为错误请求

设置压测任务的并发数、执行时间等

若未指定ramp-up period ,默认为零,将立即建立所有线程。假设ramp-up period 设置成T 秒, 全部线程数设置成N个, 将每隔T/N秒建立一个线程。
比如:使用10个线程,ramp-up period是100秒,每个线程会在上一个线程启动后10秒(100/10)启动

查看聚合报告



Locust脚本

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

楼主用这两个工具压测结果有比较吗,哪个感觉更准确呢?

还有一个问题就是你压测的是线上环境还是测试环境呢?

马克,留爪。。。

感觉locuat的不准,后台数据库有问题时,jmeter实际只有一二十的时候,locust还是有五百多,跟数据库没报错之前差不多

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up