AWS EC2环境下间歇性出现MySQL 2003连接错误无法定位根因求助
排查方向及解决方案
1. 网络层链路问题排查
- 先排查AWS EC2实例的网络抖动问题:两台EC2如果在同一VPC下,先持续跑
mtr双向检测丢包,建议至少跑24小时覆盖异常发生时段,重点看是否有随机丢包、路由跳数变更:# 应用服务器上执行,替换为数据库实例内网IP mtr --tcp --port 3306 -r -c 1000 <数据库内网IP> # 数据库服务器上反向执行,替换为应用服务器内网IP mtr --tcp --port <应用连接数据库的源端口段> -r -c 1000 <应用服务器内网IP> - 检查AWS安全组、网络ACL的临时规则是否有过期,或者是否触发了AWS隐性限流:EC2实例的网络性能和实例规格绑定,即使CPU内存使用率低,也可能达到实例的网络包转发/PPS上限,可在CloudWatch查看
NetworkPacketsIn、NetworkPacketsOut、NetworkIn、NetworkOut指标,确认是否触及规格上限。 - 排查TCP连接队列溢出问题:即使你已经调整了somaxconn和back_log参数,执行
ss -lnt看MySQL监听端口的Send-Q值,如果值持续大于0说明连接队列溢出,需确认参数是否真的生效:# 确认内核参数生效 sysctl net.core.somaxconn sysctl net.ipv4.tcp_max_syn_backlog # 确认MySQL启动的back_log参数生效 mysql -e "show variables like 'back_log';"
2. MySQL层问题排查
- 检查连接数是否真的充足:即使你调整了max_connections,需要确认异常发生时的实际连接数、是否有大量
Sleep状态的连接占满连接池:-- 查看当前连接数 show global status like 'Threads_connected'; -- 查看所有连接状态 show full processlist; - 排查是否有慢查询导致连接被占用:短时间大量查询卡住可能是触发了锁等待或者慢查询,开启慢查询日志,阈值设为1秒,捕获异常时段的慢查询,同时查看锁等待状态:
show engine innodb status\G show global status like '%lock%'; - 检查MySQL的DNS反解析设置:如果
skip_name_resolve参数未开启,MySQL会对每个连接的IP做反解析,DNS波动会导致连接超时,建议直接在my.cnf添加skip_name_resolve参数后重启。
3. 应用层问题排查
- 检查应用连接池配置:如果连接池的最大连接数超过MySQL的max_connections,或者连接池的超时时间设置不合理,会导致连接被复用时出现超时,建议确认连接池的
maxWait、validationQuery配置是否正常,是否开启了连接有效性检测。 - 排查应用端TCP参数:检查应用服务器的
net.ipv4.tcp_tw_reuse、net.ipv4.tcp_timestamps参数是否开启,大量TIME_WAIT状态的连接会导致新连接无法建立。
内容的提问来源于stack exchange,提问作者aecend
相关产品推荐
相关产品推荐

