性能压测报告
Posted 亦非我所愿丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能压测报告相关的知识,希望对你有一定的参考价值。
文章目录
业务接口性能压测报告
一、说明
本次压力测试主要是为了找出系统瓶颈,提高单台服务器及整个集群的吞吐量,并根据负载均衡SLB,系统(cpu、mem、io、network、进程及文件限制,内核参数),nginx服务,php服务等进行优化,分别对盘古的四个接口,并通过单节点,nginx代理节点及cluster多节点进行压力测试;并对产生的数据进行汇总(本次数据汇总均为调优后的压测结果)
至于为何使用两种测试工具,因为单台mac主机jmeter无法向集群发出更多请求,所以为了数据的真实性,使用阿里云付费性能压力测试方案。
类别 | 说明 |
---|---|
压测工具 | 1、apache-jmeter-5.1.1(单台压测) 2、阿里云性能测试系统(集群压测) |
压测接口 | /api-x/site/user/getUser /api-x/site/box/currentBox /api-x/site/user/getShippingAddressList /api-x/site/user/getCredit |
压测性能相关参数 | 协议: https 方法: get 并发数 总请求数 吞吐率(TPS) 响应时间 错误率 |
二、调优
1、slb
类别 | 参数 | 说明 |
---|---|---|
slb | 加权最小连接数wlc | 针对权重轮询,并考虑后端实际连接数负载再轮询 |
slb | slb.s1.small -> slb.s2.medium | 最大连接(100,000),新建连接数(10,000),查询(10,000)/Sec |
2、内核
类别 | 参数 | 说明 |
---|---|---|
kernel | vm.nr_hugepages=512 | 内核大页内存 |
kernel | net.core.somaxconn = 65535 | 端口最大监听队列长度 |
kernel | net.ipv4.tcp_max_syn_backlog | SYN同步包的最大客户端数量 |
kernel | net.ipv4.tcp_tw_reuse = 1 | TCP连接重用 |
kernel | net.ipv4.tcp_tw_recycle = 1 | TCP连接TIME-WAIT sockets的快速回收 |
kernel | net.ipv4.tcp_fin_timeout = 30 | FIN-WAIT-2状态时间 |
3、nginx
类别 | 参数 | 说明 |
---|---|---|
nginx | tengine-2.3.0 | 老版本2.1.2升级 |
nginx | worker_connections 2048 * 4 | nginx的最大进程数 |
nginx | keepalive_timeout 90 | nginx与后端的长链接时间 |
nginx | backlog 2048 | nginx backlog |
4、php
类别 | 参数 | 说明 |
---|---|---|
php.ini | opcache.huge_code_pages=1 | php opcache的内存分页特性 |
php.ini | opcache.file_cache=/tmp | php opcache的文件缓存 |
php.ini | memory_limit = 2048M | php的最大内存 |
php-fpm | listen.backlog=2048 | php的backlog |
php-fpm | pm = static | php进程的运行模式 |
php-fpm | pm.max_children = 240 | php的最大运行进程数 |
php-fpm | pm.max_requests = 2000 | php的最大请求数 |
php-fpm | rlimit_files = 10240 | php的最大文件数 |
三、盘古单节点压测数据
压测域名均为 pangu 线上域名(host解析),直接压测盘古接口(user --> slb --> 盘古)
- 压测工具:apache-jmeter-5.1.1
- 压测系统:macOS MACOS 10.13.6 I7 4G SSD
- 压测主机:site-f
- 压测说明
针对每个接口分别执行并发数及总样本数(800,80000)(900,90000)(1000,100000)进行压力测试,并对产生的每秒TPS,响应时间(min,ave,max)及错误率进行统计 - 压测结果:单节点可承受每秒1k并发
四、盘古单代理节点压测数据
压测域名均为 wwwx线上域名(host解析),通过site端进行反向代理到盘古端进行压测,较盘古单节点压力测试多一层SLB反向代理(user --> slb --> site --> slb --> 盘古)
- 压测工具:apache-jmeter-5.1.1
- 压测系统:macOS MACOS 10.13.6 I7 4G SSD
- 压测主机:site-f
- 压测说明
针对每个接口分别执行并发数及总样本数(800,80000)(900,90000)(1000,100000)进行压力测试,并对产生的每秒TPS,响应时间(min,ave,max)及错误率进行统计 - 压测结果:单节点可承受每秒1k并发
五、集群压测数据
通过对整个集群两台slb、六台服务器(分别部署site及盘古项目)进行压力测试
user --> slb --> site节点轮询 --> slb --> 盘古节点轮询
说明
- 压测工具:阿里云性能测试系统
- 压测系统:无
- 压测主机:盘古集群
- 压测接口:/api-x/site/user/getUser
1、每秒2000并发,总计5分钟压测数据
2000并发下的系统cpu使用率
2000并发下的每台nginx并发连接数
2000并发下的阿里云压力测试数据汇总
每秒2000并发的压测数据分析:
异常原因:由于响应时间为10s,所以超过10s的均为错误,异常率为0.8%
类别 | 说明 |
---|---|
接口 | /api-x/site/user/getUser |
响应超时 | 10s |
吞吐率 | 749.57 |
并发数 | 2000 |
总样本数 | 224870 |
成功率 | 99.89%(224633/227) |
异常数 | 237 |
异常率 | 0.11% |
2、每秒3000并发,总计5分钟压测数据
3000并发下的系统cpu使用率
3000并发下的每台nginx并发连接数
3000并发下的阿里云压力测试数据汇总
每秒3000并发的压测数据分析:
异常原因:由于响应时间为10s,所以超过10s的均为错误,异常率为0.8%
类别 | 说明 |
---|---|
接口 | /api-x/site/user/getUser |
响应时间 | 2.8s |
响应超时 | 10s |
吞吐率 | 764.93 |
并发数 | 3000 |
总样本数 | 229449 |
成功率 | 99.20%(227613/1863) |
异常数 | 1864 |
异常率 | 0.8% |
六、结论
1、说明
本次压测对index.html、index.php及多个项目接口的单机、代理、多层代理及集群等多种场景的内外网环境进行了压测,由于index页面和内网环境在某些情况下只是理论数据,所以没有进行统计,只是粗略的进行了nginx、php本身的最大负载压测;并对slb、系统内核参数、进程文件限制数、nginx、php等均进行了调优,覆盖了七层,四层场景,排除了潜在的影响系统性能的因素。
2、结果
- 单台服务器实现并发1000
- 集群可承载3000并发
- 业务处理提升7%
3、瓶颈
对于单主机节点压测,并发达到800、900、1000的时候,接口平均响应时间都在5s及以上;并且qps略低
- /api-x/site/user/getUser:143
- /api-x/site/box/currentBox:100
- /api-x/site/user/getShippingAddressList:200
- /api-x/site/user/getCredit:220
getUser接口当并发达到3000的时候,集群压力会达到瓶颈
- 后端少部分接口响应时间大于10s,平均响应时间3s(响应时间取决于接口每秒的吞吐量)
- php 慢日志(暴露出很多大于1s的满日志)
- rds 数据库连接数会达到上限(readonly-db3)
以上是关于性能压测报告的主要内容,如果未能解决你的问题,请参考以下文章
性能测试实战 | 修改 JMeter 源码,定制化聚合压测报告