分析并优化单次查询很快但是高并发时变慢的接口

您所在的位置:网站首页 naturalantibody检索很慢吗 分析并优化单次查询很快但是高并发时变慢的接口

分析并优化单次查询很快但是高并发时变慢的接口

2024-07-03 19:05| 来源: 网络整理| 查看: 265

目录

摘要

1、性能测试

1.1、POSTMAN 50次逐条查询

1.2、Jmeter 50 并发查询

1.3、Jmeter 100 并发查询

2、数据库慢查询监控

2.1、SQL执行计划分析

2.2、单次SQL执行时间

2.3、并发情况下SQL执行时间

3.1、总体监控

3.2、告警监控

4、优化

4.1、设置连接数

4.2、缓存配置

4.3、最大允许的数据包

4.4、修改配置

4.5、其他优化

5、缓存优化

6、程序优化

7 并发查询

8、性能测试

6、总结

 

摘要

系统中出现了很多,单次查询很快,但是并发量一高就变慢的接口。下面根据具体情况,进行分析并解决相关性能问题。优化的点主要就是 数据库、缓存、接口逻辑、并发设计等。

1、性能测试 1.1、POSTMAN 50次逐条查询

逐条执行的时候,响应时间基本都是一致的,且比较快。

 

 

1.2、Jmeter 并发查询

在并发测试的时候,数据库并发连接数增加以后,查询的响应时间,明显增加很多。

50并发

Samples

吞吐量Throughput

最小响应时间

最大响应时间

平均响应时间

错误率

50

3.3/sec

5188ms

14379ms

10504ms

0%

100并发

Samples

吞吐量Throughput

最小响应时间

最大响应时间

平均响应时间

错误率

100

3.3/sec

6421ms

29513ms

18282ms

0%

zipkin调用链拿到调用信息,最好能拿到接口的调用详情,可辅助分析性能问题

 

 

 

2、数据库慢查询监控

最终还是要回归到数据库上,对SQL进行分析。

2.1、SQL执行计划分析

已经使用了索引,说明SQL本身的效率应该是可以的

 

2.2、单次SQL执行时间

执行时间只有200ms

 

2.3、并发情况下SQL执行时间

高并发时,SQL执行时间都在6S左右,效率比较低

 

3、Navicat Monitor  监控

借助监控工具可以有效的分析数据库的性能瓶颈,也可通过其他的监控工具,比如monyog,Innotop等。通过上面的分析,可以断定部分问题应该还是出在数据库上。

3.1、总体监控

首先分别在5:48,5.50,5.54 做了三次压测。然后截取监控图片如下,应该不是内存和CPU资源不足的问题,再看数据库的总连接数,明显小于已记录的最大并发连接数量。

 

 

3.2、告警监控

重点分析严重的告警,其中两个跟数据库的连接数有关。

 

当前服务器上的打开连接

每秒全表扫描

 

最大并发连接数量

 

InnoDB 写入缓冲区效率

 

查询缓存命中率

 

最大允许的数据包

4、优化

简单查看系统用户线程数和 系统支持的最大线程数。(一般都没有问题)

4.1、设置连接数 #如果用户线程的并发数小于64,可以将这个参数设为0,如果系统并发很严重,可以先将这个参数设为128,或者更大。但是运行一段时间,看下系统负载,如果负载过高,就调低这个参数,如果负载很低,也可以调高点。 innodb_thread_concurrency=128 # 如果客户端尝试连接的错误数量超过这个参数设置的值,则服务器不再接受新的客户端连接。可以通过清空主机的缓存来解除服务器的这种阻止新连接的状态,通过FLUSH HOSTS或mysqladmin flush-hosts命令来清空缓存。 max_connect_errors = 30000 # 设置客户端的并发连接数量 max_connections = 2000 # 设置客户端的并发连接数量 max_user_connections = 2000 4.2、缓存配置 # mysql服务缓存以重用的线程数 thread_cache_size = 120 # 为查询结果所分配的缓存 query_cache_size = 256M #当这个参数为1或ON时,则MySQL服务器会缓存所有查询结果(除了带有SELECT SQL_NO_CACHE的语句) query_cache_type = 1 4.3、最大允许的数据包

考虑下网络带宽,有的企业内网可能就是100M,所以设置成50M,一般就足够了。

max_allowed_packet = 50M 4.4、修改配置

修改mysql以上配置,并重启数据库

4.5、其他优化

对于全表扫描的情况,说明还有很多额外的SQL 没有使用索引。要逐一优化。主要是给表都加上合适的索引,同时还要分析表模式设计是不是有问题,必要时可以添加一些冗余字段(主要是枚举值的字段或者不会修改的字段),尽量避免多表关联的情况。

优化方式见:https://blog.csdn.net/weixin_41715077/article/details/100938141

5、缓存优化

数据库的问题解决了,其他问题应该还是出在应用程序的设计上。最好借助监控工具分析下,可以借助zipkin或者skywalking等分布式调用链监控工具分析响应最慢的一些接口。

在zipkin查找: http.path=/plan/api/alarm/history   很多其他接口需要这个三个接口的提供基础数据,于是将查询结果全部放到redis中。 /iir/manager/device/list-all /visible/api/visible-equipment/list-all /iir/manager/device-handle/all/list

6、程序优化

在zipkin查找: http.path= device/api/monitor/device-list   发现For 循环频繁调用设备服务的接口。 http.method GET http.path /device/api/device-monitor/type mvc.controller.class DeviceMonitorServiceImpl mvc.controller.method getMonitorDeviceType Client Address 10.0.10.210:46850,

将for循环中查询接口 修改成批量查询接口,在for循环外层调用一次,然后在内层组织数据。

7、 并发查询

优化过程发现,一些代码在for循环中逐条调用图片接口拉取图片,而这个图片接口是通过ceph 的网关拉取图片的,没办法像数据库一样改成批量查询,这里 Cellection.parallelStream()并发拉取图片,提高效率。

8、性能测试

找其中一个接口测试下调优后的性能。

50并发

200并发



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3