一. 压测目标
开始一项任务前,需确定一个可测量的目标。对于一个系统,最核心的性能指标莫过于响应时间和吞吐量了,响应时间是指一个请求从发送到接收响应的总时间;吞吐量是指单位时间内系统可以处理的请求数量。这两个指标在资源恒定的情况下,存在互斥关系。
- 单线程处理下,响应时间和吞吐量的关系为:
吞吐量=1s/响应时间
- 在多CPU多线程并发技术下,上面的计算公式为:
吞吐量=(1s/响应时间)*并发数
二. 案例解析
1. 需求背景
本例中,IHDMGR 插件管理模块对外提供插件安装和插件列表查询两个接口,ihdmgr依赖于NBIWS调度中心和PROC参数下发模块,由于proc下发参数需要向个设备支持,成本巨大,我们在压测过程中设置了挡板,挡板的延时反映了正常的参数下发平均时延。
根据业务方的描述,我们确定的压测目标为:
- 插件推送模块能需要每天完成800万设备量的推送任务。
- 插件推送平均响应时间5s,最大响应时间20s。
- 插件列表查询平均响应时间为3s,最大响应时间为10s。
- 可伸缩能力为80%以上。
- 连续稳定运行24小时。
2. 业务模型分析
由于插件推送和插件列表查询是混合部署的,两类接口的调用频次依据监控系统分析约为8:2。
3. 确定测试类型
- 基准测试:指的是对单线程接口的测试,主要用于调试测试脚本的正确性 以及在无压力情况下对每个请求的响应时间,作为后续测试复杂场景的基础数据。
- 容量测试:指的是系统能处理的最大业务量,在测试过程中采用梯度加压的方式不断增加并发回话数,观察响应时间出现拐点的业务量,这个值即为系统能处理的最大业务量。通常需要数个小时进行。
- 负载测试:测试单个接口在不产生任何错误的情况下能够提供的最佳系统性能。
- 混合业务测试:按照业务流程对接口调用按照比例进行编排,获得系统的最大处理能力以及单个接口的处理能力。
- 稳定性测试:按照混合业务测试流程,施压,持续数个小时,判断系统是否健壮,是否存在内存泄露,是否有较多的上下文切换。
- 异常测试:指的是在依赖服务中断,网络中断,硬件故障等异常情况下,系统对业务的影响情况。检验数据一致性及失效转移是否生效。
4. 加压方式
- 瞬间加压:通过测试工具模拟大量请求,加压到目标系统接口,主要考验对突发流量的处理能力,同时也为考验是否设计削峰填谷功能,熔断,限流,隔离,失效转移,降级功能是否生效。
- 逐渐加压:系统的压力通常情况下为一条抛物线,分析各个时段的负载分布情况。
- 梯度加压:逐渐增加并发量,观察系统的输出能力,找到最佳系统负载组合。
- 应对压力终止的方式:逐渐退出,立即同时退出。如若立即退出 cpu,内存,io未迅速释放,则说明系统负载有连续性或者关联效应。
5. 确定时延方式
如何发送请求:
- 一个请求发送完毕立即发送下一个请求
- 一个请求发送完毕间隔固定时间再发送下一个请求
- 以一个固定的间隔均衡的发送请求 ---较为常用
6. 压测方案及场景
由于系统目标是每天处理800万设备的插件推送和列表插件任务,所以每秒的吞吐量为:
[800w/(24*60*60)]=92.6个/s=100个。
吞吐量=(1s/响应时间)*并发数=80个=(1s/5s)*插件安装并发量
吞吐量=(1s/响应时间)*并发数=20个=(1s/3s)*插件安装列表查询并发量
编号 | 接口 | 占比 | 基准测试响应时间(单线程,无压力情况下的值) | 吞吐量 | 并发量 |
1 | 插件安装 | 80% | 5s | 80 | 400个 |
2 | 插件列表查询 | 20% | 3s | 20 | 60个 |
由于web应用程序的最大并发量为200.故我们使用三梯度加压法进行测试,观察响应时间的变化和基准时间的偏离情况,分布式伸缩是否有效,系统cpu,内存是否在合理范围内。通过多轮的梯度加压数据,找到用户认可的响应时间和吞吐量之间的一个最优组合。同时也为系统并发设定一个推荐值。
编号 | 批次 | 接口 | 占比 | 测试响应时间 | 吞吐量 | 并发量 |
1 | 200并发量 | 插件安装 | 80% | 4s | ?40 | 160个 |
2 | 200并发量 | 插件列表查询 | 20% | 2s | ?20 | 40个 |
3 | 400并发量 | 插件安装 | 80% | 6s | ?54 | 320个 |
4 | 400并发量 | 插件列表查询 | 20% | 4s | ?20 | 80个 |
5 | 600并发量 | 插件安装 | 80% | 8s | ?60 | 480个 |
6 | 600并发量 | 插件列表查询 | 20% | 5s | ?24 | 120个 |
7.准备测试环境
- 软硬件环境准备:不可高于生产环境配置。
- 压测脚本准备
- 数据准备
8.压测报告生成
- 系统层面的指标:cpu,内存,磁盘IO,网络带宽,线程数,打开文件句柄数,线程切换和打开的scket数量。
- 接口的吞吐量,响应时间,错误情况,超时情况。
- 数据库的慢sql,sql死锁,缓冲区命中率,索引使用情况。
- 缓存的读写操作的吞吐量,缓存使用量的增加数量,响应时间,超时情况。
- 消息队列的吞吐量变化情况,响应时间。
压测报告的内容:
- 压测过程中记录的数据
- 分析是否满足既定目标
- 系统瓶颈点
- 系统潜在风险
- 改进意见。
三.压测常用工具
- ab:一款针对http实现性能压测的工具。可以进行简单的restful风格接口测试
ab -c 10 -n 10000 http://localhost:8080/index
ab -c 10 -n 1000 -p post.txt 'application/x-www-form-urlencoded' http://localhost:8080/billing/account/update
- jmeter
- mysql-tpcc
- mysqlslap:mysql自带的一款性能压测工具
# 单线程连接测试
mysqlslap -a uroot -ptest dbname
# 使用10个线程测试,代表10个客户端
mysqlslap -a -c 10 uroot -ptest dbname
# 多次测试对测试结果求平均值
mysqlslap -a -i 10 -uroot -ptest
# 测试读操作的性能指标,10个客户端,每个客户端并发100次查询。数据库连接重用。
mysqlslap -a -c 10 --number-of-queries=1000 --auto-generate-sql-load-type=read -uroot -ptest
#测试写操作性能
mysqlslap -a -c 10 --number-of-queries=1000 --auto-generate-sql-load-type=write -uroot -ptest
# 混合读写
mysqlslap -a -c 10 --number-of-queries=1000 --auto-generate-sql-load-type=mixed -uroot -ptest
# 多次不同并发混合操作的性能指标,不同引擎,分别产生50,100个并发
mysqlslap -a --concurrency=50,100 --number-of-queries=1000 --debug-info--engine=myisam,innodb --iterations=5 -uroot -ptest
- sysbench
# sysbench的fileio测试需要经过prepare,run,cleanup三个阶段
sysbench --test=fileio help
# 进行16个文件,总大小2GB的fileio测试:
sysbench --test=fileio --file-num=16 --file-total-size=2G prepare
# 16线程下随机读取性能。最大随机读取请求为:10000000,如果在180秒内不能完成,测试就结束了。
sysbench --test=fileio --file-total-size=2G --file-test-mode=rndrd --max-time=180 --max-requests=10000000 --num-threads=16 --init-rng=on
--file-num=16 --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=16384 run
# 清理测试程序
sysbench --test=fileio --file-num=16 --file-total-size=2G cleanup
# cpu 性能测试
sysbench --test=cpu --cpu-max-prime=20000 run
# 线程锁性能测试
sysbench --test=treads --num-threads=64 --thread-yields=100 --thread-locks=2 run
# 磁盘io性能测试,iops测试
sysbench --test=fileio --file-num=16 --file-total-size=100M prepare
sysbench --test=fileio --file-num=16 --file-total-size=100M cleanup
# 内存测试
sysbench --test=memory --num=threads=512 --memory-block-size=256M --memory-total-size=2000M run
# mysql 事务性操作测试
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000 --mysql-user=root --mysql-host=localhost --mysql-password=test --mysql-db=test run
- dd:磁盘io测试。
- loadRunner
- hprof:jdk自带的内存堆栈和cpu使用情况命令行工具。
- locust:
- 全链路监控工具:skywalking,pinpoint,zipkin。
本文暂时没有评论,来添加一个吧(●'◡'●)