当前位置:网站首页>任何代码未动的情况下第二天项目访问速度明显下降,案例分析
任何代码未动的情况下第二天项目访问速度明显下降,案例分析
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:wallconnectionProperties:通过connectProperties属性来打开mergeSql功能;慢SQL记录
2)分析导致mysql的sleep连接过多原因
我们这使用的是alibaba的数据库连接包,而我们的数据库配置是springBoot原始的配置,也就是说没生效。timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis 配置没生效,60s检测时间超过300s的无效连接,并且释放。
3)阿里巴巴数据库连接包的正确配置方式
三、总结及处理结果
mysql执行速度降低是因为我们的无效连接过多,占用了mysql资源。造成的原因是因为我们的数据库配置没有生效,错误的配置导致了太多无效的数据库连接。解决的办法就是把数据库无效连接清除掉,重启mysql服务或者设置连接最大时长set global wait_timeout=500。然后将项目的数据库连接配置正确,主要是timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis 。
边栏推荐
- [MAE]Masked Autoencoders掩膜自编码器
- SQL injection vulnerability (principle)
- Error creating bean with name xxx Factory method ‘sqlSessionFactory‘ threw exception; nested excepti
- C. Add One--Divide by Zero 2021 and Codeforces Round #714 (Div. 2)
- Error creating bean with name xxx Factory method ‘sqlSessionFactory‘ threw exception; nested excepti
- Sorting out and summarizing the handling schemes for the three major exceptions of redis cache
- MySQL series: storage engine
- ABP框架之——数据访问基础架构(下)
- The team of China University of Mines developed an integrated multi-scale deep learning model for RNA methylation site prediction
- This year's cultural entertainers have turned their sidelines into their main business
猜你喜欢

30. concatenate substrings of all words

volatile~多线程下变量不可见

直播间源码在开发前期必须做的工作及开发步骤

SQL注入漏洞(原理篇)

MySQL create and manage tables

SQL窗口函数怎么使用

After nine years at the helm, the founding CEO of Allen Institute retired with honor! He predicted that Chinese AI would lead the world

Matlab| sparse auxiliary signal denoising and pattern recognition in time series data

Important knowledge of golang: timer timer
Redis缓存三大异常的处理方案梳理总结
随机推荐
Usestate vs useref and usereducer: similarities, differences and use cases
Nfnet: extension of NF RESNET without BN's 4096 super batch size training | 21 year paper
VIM backup history command
C. Product 1 Modulo N-Codeforces Round #716 (Div. 2)
General sequence representation learning in kdd'22 "Ali" recommendation system
Raspberry PI installing the wiring pi
js的slice()和splice()
C. Phoenix and Towers-Codeforces Global Round 14
xcbdfbs xcvb
2022年个人理财利率是多少?个人如何选择理财产品?
volatile~多线程下变量不可见
mysql 系列:总体架构概述
SFOD:无源域适配升级优化,让检测模型更容易适应新数据(附论文下载)
php 二维数组插入
力扣解法匯總513-找樹左下角的值
MySQL series: storage engine
Matlab| sparse auxiliary signal denoising and pattern recognition in time series data
【云驻共创】制造业企业如何建设“条码工厂”
FPGA 常用缩写及单词在工程领域内的意义
spdlog记录日志示例 - 使用sink创建logger