一次数据库超时排查

中台随着提供的服务不断增加,接口超时的现象越来越频繁,一文记录排查的过程

遇到相关问题首先查看最大连接和当前连接数:

1
2
SHOW VARIABLES LIKE '%max_connections%';
SHOW STATUS LIKE 'Threads_connected%';

如果两个数相当,则问题来自于数据,继续查看休眠连接数量:

1
2
SELECT COUNT(1) FROM information_schema.processlist WHERE Command = 'Sleep';
SHOW processlist;

如果有大量连接休眠,考虑缩短超时时间,MySQL5.6默认为一年,修改为8小时:

1
2
3
4
--服务器关闭非交互连接之前等待活动的秒数
SET global wait_timeout = 28800;
--服务器关闭交互式连接前等待活动的秒数
SET global interactive_timeout = 28800;

或直接修改my.cnf配置文件:

1
2
3
vim etc/mv.cnf
wait_timeout=28800
interactive_timeout=28800

如果大多数连接为非交互式且活跃状态,则需要向上调整数据库的最大连接:

1
SET global max_connections=4096

1
2
vim etc/mv.cnf
max_connections=4096

针对以上修改后,最后重启MySQL服务完成调整:

1
systemctl restart mysqld

PostgreSQL以及其他数据库同理。
如果当前数据库连接池空余较多且服务超时,则问题不来自于数据库,需要排查功能后台的服务连接池,而非数据库连接池。