一:压力测试报错
1.1 java.net.SocketException: Socket closed
参考:JMeter压测“java.net.SocketException: Socket closed”解决方法
要使用http1.1
,在Connector里面加上 keepAliveTimeout
=“150000” maxKeepAliveRequests
="-1"
其中:
keepAliveTimeout
:表示在下次请求过来之前,tomcat保持该连接多久。这就是说假如客户端不断有请求过来,且为超过过期时间,则该连接将一直保持。
maxKeepAliveRequests
:表示该连接最大支持的请求数。超过该请求数的连接也将被关闭(此时就会返回一个Connection: close
头给客户端)。
1.2 java.net.SocketException: Socket Refused
分析原因:tomcat最大连接数maxConnections
(我们设置1万) + acceptCount
(等待队列数,我们设置2000), 超过就 报错connection refused
1.3 nginx "429 Too Many Requests”的原因与解决方法
428: nginx的话,就是限流了,限制每秒访问数。
429: nginx的话,限制单个ip打开的连接数。
二:性能指标
2.1 UV
UV:一段时间内,独立访问ip。
PV: 一段时间内,访问页面数量。
2.2 PV
三:通用性能的提升
通用性能优化口诀,三部曲
a:缓存、b:异步、c:批处理,基本上可以解决99%的性能问题,来源阿里大牛 。
3.1 性能提升三部曲
- 缓存
如:openrestry(linux) lua 缓存 、redis缓存、Guava Cahche缓存, 多级缓存配合推到离用户最近的地方, 这种方式可以提高成千上万倍的性能提高。
本地热点缓存:热点数据、脏度不明感、内存可控。 对脏读非常不敏感,本地缓存没有io开销,比redis少了io开销。存储到每个jvm内存中,可以完成上几千万、上亿的访问量。一般数据时间都不redis少的多。
多级缓存:本地缓存(保存1分钟)》redis缓存(10分钟)》数据库 - 异步处理
如:支付宝、微信 支付付款异步返回结果,支付链路可能非常复杂,有结果轮训或者主动推送。要对接银行体系、风控体系、商户体系等。
还如:异步发送短信、异步发送邮件、异步抢单。 - 批处理
如有成千上万,或者几十条的数据要插入、更新,批量操作销量会提高很多。for循环的insert/update 20条 和 一次行insert 20条的销量就能看出来了。
3.2 QPS(每秒查询性能)、TPS(每秒写性能)
3.2.1 测试nginx
#测试nginx
#测试接口get:nginx/get_json.json
location ~ ^/get_json {
default_type application/json;
return 200 '{"status":"success","result":"nginx json"}';
}
测试对象 | 线程数 | Ramp-up时间(秒)【多久启动这么多线程】 | 循环次数 | 带宽 | QPS峰值 | QPS终值 | 评价请求时间 | 异常% |
---|---|---|---|---|---|---|---|---|
nginx | 1000 | 5 | 30 | 1M | 800 | 316 | 1821 | 0.00 |
nginx | 1000 | 5 | 30 | 3M | 1300 | 316 | 733 | 0.00 |
nginx | 1000 | 5 | 30 | 5M | 2200 | 1300 | 386 | 0.00 |
nginx | 1000 | 5 | 30 | 10M | 3700 | 1698 | 168 | 0.00 |
nginx | 1000 | 5 | 30 | 30M | 3600 | 1388 | 208 | 0.00 |
3.2.2 测试tomcat
#测试tomcat
#测试接口get:projectname/api/constants
测试对象 | 线程数 | Ramp-up时间(秒)【多久启动这么多线程】 | 循环次数 | 带宽 | QPS峰值 | QPS终值 | 评价请求时间 | 异常% |
---|---|---|---|---|---|---|---|---|
tomcat | 1000 | 5 | 30 | 1M | 30 | 15 | 7000 | 0.00 |
tomcat | 1000 | 5 | 30 | 3M | 180 | 54 | 6300 | 0.00 |
tomcat | 1000 | 5 | 30 | 5M | 150 | 80 | 4000 | 0.00 |
tomcat | 1000 | 5 | 30 | 10M | 450 | 190 | 2900 | 0.00 |
tomcat | 1000 | 5 | 30 | 30M | 1000 | 600 | 1164 | 0.00 |
3.2.3 全方案测试
单台tomcat | 两台tomcat | 加入redis | 加入guava cach | 加入nginx lua share内存缓存 | 加入nginx lua redis缓存 |
---|---|---|---|---|---|
270QPS | 1500QPS | 2000QPS | 3000QPS | 3500QPS | 3500QPS |
1:并发上去不去,只有200-300服务器是,服务器打开的线程数上不去。需要下对tomcat调优 ; 2:调优之后打开线程数从40到400, 但是QPS还是没上去; 3:带宽升级到20M QPS上1000;4 :打开压测和后台的keepalive的选项,减少 | 1台nginx、2台tomcat、1台mysql | redis有效期10分钟,减少数据库压力 | 增加jvm内存缓存,缓存一分钟,直接内存读取,没有带宽开销比较redis缓存更快 | nginx cache 文件缓存 是基于文件的比较慢,我们不使用。我们使用 nginx(openrestry) + lua + share共享内存缓存,缓存1分钟。必须要修改请求路径,缺点无法更新缓存。 | nginx(openRestry)+lua+redis缓存,比共享缓存能慢点,但是可以方便更新缓存。距离用户更新,直接不过数据库 |
3.3 优化方案列举
优化次序 | 优化对象 | 优化方式 | 方法 | 结果 | 负面影响 | 花费时间 |
---|---|---|---|---|---|---|
1 | tomcat打开线程数 | 1:并发上去不去,只有200-300服务器是,服务器打开的线程数上不去。需要下对tomcat调优 ; | 最大连接数 max-connections:10000 ;4C8G最大线程数:max-threads=800 、8C16G=2000、16C32G=4000;等待线程数:min-spare-threads=100 | 调优之后打开线程数从40到400, 但是QPS还是没上去; | -不同配置服务器要配不同调优参数- | 1day |
2 | 带宽增大 | 带宽5M==>20M | 花钱购买 | 调优之后QPS上升到1000 | -不同配置服务器要配不同调优参数- | 1day |
3 | tomcat keepalive开启 | 配置tomcat | keepAliveTimeOut: 多少毫秒后不影响断开keepAlive、keepAliveTimeOut: 多少毫秒后不影响断开keepAlive、maxKeepAliveRequests: 多少次请求后断开失效、使用webServerFactoryCustomized定制化tomcat配置 | 平均耗时明显降低 | 花钱 | 2day |
4 | keepalive开启 | nginx调整 | nginx http从1.0 升级到1.1 打开keepalive ,减少不断的开启关闭连接的消耗; proxy_http_version 1.1; proxy_set_header Connection “”; | 平均耗时进一步降低 | 花时间调优 | 0.5day |
5 | 缓存服务器 | 代码开发 | 能放到缓存服务的全放到redis里面,减少直接操作数据库,一般设置10分钟有效期器 | QPS能翻倍,到2000 | 需要开发,根据缓存范围不同开发成本有变化;极大的减少了直接操作数据库,性能会极大提高;时间成本是问题;有脏数据库需要得到pm认可。 | 2week |
6 | 热点数据缓存Guava Cache | 代码开发 | 热点数据jvm缓存,热点数据缓存到jvm内存,缓存时间一分钟;jvm缓存不存在取redis | QPS能提升到接近3000QPS | 直接jvm内存取数据,效率比走redis网络和处理销量更高。脏数据无法清理 | 1week |
7 | openrestry(linux) lua + 共享内存 缓存 | nginx配置 | nginx lua 脚本开发和配置 | 能有效减轻数据库服务器和应用服务器压力,缓存时间1分钟。缺点:无法更新缓存; 需要开发lua代码,每个请求单独开发。 | 1w | |
8 | openrestry(linux) lua + redis 缓存 | nginx lua 脚本开发和配置 | 。优势:可以更新缓存。缓存10分钟; 有点网络开销比 内存缓存慢一点 | nginx配置。能有效减轻数据库服务器和应用服务器压力 | 1w | |
9 | 服务器部署手工 | 2台服务器 | 做2台服务器做一个tomcat集群 | QPS进一步提升 3500QPS | 缓解单台服务器压力 | 3days |
10 | 服务器部署手工 | 4台服务器 | nginx一台、tomcat2台、数据库一台 | QPS进一步提升 4000QPS | 数据库压力、服务器压力完全分开,缺点增加服务器需要有人看守手工增加 | 1w |
11 | aliyun成套方案 | 阿里云4台起步,数量无上限 | 购买负载均衡器SLB(免费)、购买OSS(按量不贵)、购买CDN加速(按量)、购弹性伸缩(Auto Scaling)、购买2台应用服务ECS、一台基础服务ECS、一台高可用数据库RDS | 缺点花钱,优势ECS服务器可以无人看守自动高峰期可以自动扩充服务器,可以一键自动扩从无限多台服务器,理论上QPS可以到无上限。当然流量地方也可以自动降低配置减少成本 | 花钱、改架构,ecs可以无限扩充、数据库可以使用高可用版本、图片使用OSS | 1w |