当云服务器ECS上的数据库连接数在短时间内大幅上升时,可能会导致性能下降、响应变慢甚至服务不可用。以下是排查和应对该问题的完整处理思路:
一、初步判断与监控
-
确认连接数突增
- 登录数据库(如MySQL)执行:
SHOW STATUS LIKE 'Threads_connected'; - 或使用命令:
SHOW PROCESSLIST;查看当前活跃连接。
- 登录数据库(如MySQL)执行:
-
查看系统资源使用情况
- 使用
top、htop、iotop等工具检查 CPU、内存、磁盘 I/O 是否异常。 - 检查网络流量是否激增。
- 使用
-
查看ECS和数据库监控
- 登录阿里云控制台,查看:
- ECS 实例的 CPU、内存、网络使用率。
- RDS 或自建数据库的连接数、QPS、慢查询等指标。
- 登录阿里云控制台,查看:
二、定位原因
1. 应用层问题
- 连接未释放:应用代码中数据库连接打开后未正确关闭(如忘记调用
close())。 - 连接池配置不当:
- 最大连接数设置过大。
- 连接泄漏(Connection Leak),导致连接堆积。
- 突发流量:促销、爬虫、DDoS 攻击等导致请求量激增。
- 长事务或慢查询:某些 SQL 执行时间过长,占用连接不释放。
2. 数据库配置问题
max_connections设置过小或过大。wait_timeout和interactive_timeout设置不合理,导致空闲连接长时间不释放。
3. 外部攻击或扫描
- 被恶意IP频繁尝试连接数据库(如暴力破解)。
- 扫描器或爬虫访问接口导致大量请求。
三、应急处理措施
-
临时增加最大连接数(谨慎操作)
- 修改 MySQL 配置:
max_connections = 500 # 根据内存合理调整 - 重启或动态设置:
SET GLOBAL max_connections = 500;
- 修改 MySQL 配置:
-
杀掉非必要连接
- 查看并终止长时间空闲或异常连接:
KILL <connection_id>; - 可通过脚本批量处理:
SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user != 'system user' AND time > 60;
- 查看并终止长时间空闲或异常连接:
-
限制来源IP或启用防火墙
- 使用安全组策略,只允许可信IP访问数据库端口(如3306)。
- 启用云防火墙或WAF拦截异常请求。
-
重启应用服务
- 若怀疑是应用连接泄漏,可重启应用服务以释放所有数据库连接。
四、长期优化建议
-
优化应用代码
- 确保每次数据库操作后正确释放连接(使用 try-with-resources 或 finally 块)。
- 使用连接池(如 HikariCP、Druid),并合理配置:
- 最大连接数
- 超时时间(connectionTimeout、idleTimeout)
- 连接检测(testOnBorrow)
-
优化数据库配置
- 设置合理的超时时间:
wait_timeout = 300 interactive_timeout = 300 - 开启慢查询日志,分析耗时SQL:
slow_query_log = ON long_query_time = 1
- 设置合理的超时时间:
-
引入监控告警
- 使用云监控、Prometheus + Grafana 等工具监控数据库连接数。
- 设置告警规则:连接数超过阈值(如80% max_connections)时通知运维。
-
考虑使用RDS或数据库X_X
- 使用阿里云RDS代替自建数据库,具备连接数自动管理、审计、防护等功能。
- 使用数据库X_X(如PolarDB Proxy)实现连接池复用,减少后端压力。
-
定期压测与容量评估
- 对应用进行压力测试,评估数据库连接需求。
- 根据业务增长预估未来连接数,提前扩容。
五、示例:快速诊断脚本(MySQL)
# 查看当前连接数
mysql -e "SHOW STATUS LIKE 'Threads_connected';"
# 查看活跃连接详情
mysql -e "SELECT user, host, db, command, time, state FROM information_schema.processlist ORDER BY time DESC;"
# 统计各客户端IP的连接数
mysql -e "SELECT SUBSTRING_INDEX(host,':',1) AS ip, COUNT(*) AS cnt FROM information_schema.processlist GROUP BY ip ORDER BY cnt DESC;"
总结
| 步骤 | 措施 |
|---|---|
| 1. 监控 | 查看连接数、资源使用 |
| 2. 定位 | 分析是应用、配置还是攻击导致 |
| 3. 应急 | 杀连接、限流、重启 |
| 4. 优化 | 修复代码、调优配置、加监控 |
⚠️ 注意:不要盲目调高
max_connections,需结合服务器内存评估,避免OOM。
如问题持续发生,建议联系云厂商技术支持协助排查。
云小栈