RDS for MySQL 连接数满有 2 种情况。
1. 空闲连接过多
1.1 原因
应用使用长连接模式 - 对于长连接模式(比如 Java 应用),应用侧应该配置连接池。连接池的初始连接数设置过高,应用启动后建立多个到 RDS 实例空闲连接。如果出现连接数满(too many connections)不能连接的问题,请检查连接池是否启用了复用连接功能。
应用使用短连接模式 - 对于短连接模式(比如 PHP 应用),出现大量的空闲连接说明应用没有在查询执行完毕后显式的关闭连接。用户应该检查应用是否在页面查询结束后调用连接关闭方法主动显式关闭了到 RDS 实例的连接。
1.2 解决
通过 DMS 或者 Kill 命令来终止当前空闲会话,详细步骤请参考: RDS MySQL 如何终止连接
修改应用,长连接模式需要启用连接池的复用功能(建议也启用连接检测功能),具体设置请参考连接池配置文档。
修改应用,短连接模式需要在代码中查询结束后调用关闭连接的方法。
对于非交互模式连接,控制台 设置 interactive_timeout 参数为较小值。interactive_timeout 参数控制交互模式连接的超时时间(单位秒,默认值为 2 小时 - 7200 秒),当交互式连接空闲时间超过 interactive_timeout 指定的时间后,RDS 实例会主动关闭(断开)连接。
建议与说明:
在 RDS MySQL 实例连接数完全打满的情况下,通过 DMS 或者其他方式是无法连接实例的;因此对于长连接模式,建议连接池的最大连接数要略小于实例规格的连接数限制,比如保留 10 个连接给DMS或其他管理操作使用。当发生无法连接的情况时,建议先在控制台修改 wait_timeout 参数为较小值,促使 RDS 实例主动关闭空闲时间超过阈值的连接。
通常情况下,应用到 RDS 实例会采用非交互模式;具体采用哪个模式需要查看应用的连接方式配置,比如 PHP 通过传递 MYSQL_CLIENT_INTERACTIVE 常量给 mysql_connect() 函数即可开启连接的交互模式。
RDS MySQL 作为服务器,被动的接收来自应用或客户端的连接,处理应用或客户端提交的查询或命令并返回结果。RDS 实例自身是不会主动发起连接的。
注:
- 在出现大量空闲连接之前,有可能会出现瞬间连接数过多的情况,由于 RDS 作为服务器被动接收连接,通常情况下是应用 SQL 未优化(或应用引起的锁等待)导致的问题,因此需要从 SQL 优化(应用优化)入手来根本解决这个问题。
- wait_timeout 和 interactive_timeout 这两个参数的修改,修改前已经存在的会话保持修改前的设置,修改后新创建的会话使用新的参数设置。
2. 活动连接过多
[url=http://img01.taobaocdn.com/tfscom/TB1mlwIKpXXXXbRXpXXXXXXXXXX.png]
2.1 原因
锁等待导致活动连接数增加(包括 InnoDB 锁等待、MyISAM 表级锁等待、表元数据锁等待)
CPU 使用率高导致活动连接数增加
IOPS 使用率高导致活动连接数增加
2.2 解决