当前位置:网站首页>任何代码未动的情况下第二天项目访问速度明显下降,案例分析

任何代码未动的情况下第二天项目访问速度明显下降,案例分析

2022-06-23 15:03:00 惊天神猿

一、案例实际情况

1.项目基本业务

一个大型的建筑性物流平台以及投标竞标的管理平台。

2.项目基本应用技术
前后端分离,前端框架vue后端框架Springcloud、数据库MySQL、容器k8s。

3.事故描述
前一天项目还正常访问用户还正常使用,结果第二天页面数据刷不出来,好多接口请求超时。排除了人为发布项目造成的代码bug之外,也排除了运维操作失误所造成的事故之外,一头雾水。

二、事故处理过程

1.跟踪代码
一般情况下,出了问题首先要直接跟踪代码分析具体的原因,加断点一步一步分析哪块慢了。结果就分析出sql执行非常耗时。

2.优化sql
发现sql已再无优化,索引该加的都加了,而且sql并不复杂。sql执行速度非常不稳定,有时快有时很慢。

3.查询数据库状态

1)查询数据库连接数:show processlist; 

在这里插入图片描述
发现sleep连接非常多,导致我们程序代码占用数据库连接内存很少,执行sql非常慢。

2)查询最大连接数:show variables like '%max_connection%';

在这里插入图片描述

3)设置最大连接数:set global max_connections=1000;   

虽然连接数设置多了,但是sleep连接还是太多,占用了数据库的很大内存空间,sql执行速度还是很慢,所以只能清除sleep连接。

4)清除连接
  • 重启mysql服务连接数自然就清除了,但是不到非不得已建议不要重启mysql服务。
  • set global wait_timeout=100 任何sleep连接睡眠时间若超过100秒,将会被mysql服务自然终止。

4.分析造成原因
以上虽然清除了mysql的sleep超长连接等待,解决了项目的执行sql慢的问题。到底是什么造成的,以后还会不会再发生,是个值得思考的问题。

数据库连接多了,并且出问题了,那肯定是项目数据库配置出问题了。

1)查看原先的配置

在这里插入图片描述
这里列一下数据库配置所代表的意思

  • name:表示你的连接池的名称也就是你要访问连接池的地址

  • auth:是连接池管理权属性,Container表示容器管理

  • type:是对象的类型

  • driverClassName:是数据库驱动的名称

  • url:是数据库的地址

  • username:是登陆数据库的用户名

  • password:是登陆数据库的密码

  • maxIdle:最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
    接将被标记为不可用,然后被释放。设为0表示无限制。

  • MaxActive,连接池的最大数据库连接数。设为0表示无限制。

  • maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示
    无限制。

  • timeBetweenEvictionRunsMillis 动态检索时长,也就是我多久检查一下连接状况。

  • minEvictableIdleTimeMillis:设置多久未使用的连接将其释放掉。

  • validationQuery:用来检测连接是否有效的sql,要求是一个查询语句。
    如果validationQuery为null,testOnBorrow、testOnReturn、
    testWhileIdle都不会其作用。

  • testWhileIdle:建议配置为true,不影响性能,并且保证安全性。
    申请连接的时候检测,如果空闲时间大于
    timeBetweenEvictionRunsMillis,
    执行validationQuery检测连接是否有效。

  • testOnBorrow:申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

  • testOnReturn:归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

  • poolPreparedStatements:是否缓存preparedStatement,也就是PSCache。
    PSCache对支持游标的数据库性能提升巨大,比如说oracle。
    在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
    作者在5.5版本中使用PSCache,通过监控界面发现PSCache有缓存命中率记录,
    该应该是支持PSCache。

  • maxPoolPreparedStatementPerConnectionSize:指定每个连接上PSCache的大小。

  • filters:属性类型是字符串,通过别名的方式配置扩展插件,
    常用的插件有:
    监控统计用的filter:stat
    日志用的filter:log4j
    防御sql注入的filter:wall

  • connectionProperties:通过connectProperties属性来打开mergeSql功能;慢SQL记录

2)分析导致mysql的sleep连接过多原因
在这里插入图片描述
我们这使用的是alibaba的数据库连接包,而我们的数据库配置是springBoot原始的配置,也就是说没生效。timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis 配置没生效,60s检测时间超过300s的无效连接,并且释放。

3)阿里巴巴数据库连接包的正确配置方式
在这里插入图片描述

三、总结及处理结果

mysql执行速度降低是因为我们的无效连接过多,占用了mysql资源。造成的原因是因为我们的数据库配置没有生效,错误的配置导致了太多无效的数据库连接。解决的办法就是把数据库无效连接清除掉,重启mysql服务或者设置连接最大时长set global wait_timeout=500。然后将项目的数据库连接配置正确,主要是timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis 。

原网站

版权声明
本文为[惊天神猿]所创,转载请带上原文链接,感谢
https://blog.csdn.net/wohaipagui/article/details/116299323