中台随着提供的服务不断增加,接口超时的现象越来越频繁,一文记录排查的过程
遇到相关问题首先查看最大连接和当前连接数:
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以及其他数据库同理。
如果当前数据库连接池空余较多且服务超时,则问题不来自于数据库,需要排查功能后台的服务连接池,而非数据库连接池。