AWS RDS MySQL高并发请求下连接超时问题排查求助
问题描述
我正在开发一款基于AWS RDS(MySQL)的Web应用,当并发请求为10-20时运行正常,但将并发提升至100-200时,RDS无法及时响应,应用抛出如下错误:
MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings) at MySql.Data.MySqlClient.NativeDriver.Open() at MySql.Data.MySqlClient.NativeDriver.Open() at MySql.Data.MySqlClient.Driver.Open() at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection() at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() at MySql.Data.MySqlClient.MySqlPool.GetConnection() at MySql.Data.MySqlClient.MySqlConnection.Open() at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider._TrackEntities[TOut,TIn](IEnumerable`1 results, QueryContext queryContext, IList`1 entityTrackingInfos, IList`1 entityAccessors)+MoveNext() at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
同时查看RDS集群或数据库监控时,未发现CPU使用率飙升或连接异常情况。
【2022年10月31日12:30更新】在数据库性能洞察中发现关键图表:图表展示了连接数及连接等待时间,高并发场景下连接等待时间出现大幅飙升。
排查方向
连接池配置验证
检查应用侧的数据库连接池参数:- 确认
Maximum Pool Size(最大连接池大小)是否设置合理,默认值通常为100,当并发请求达200时,连接池可能无法及时提供足够连接,导致等待超时。 - 检查
Connection Timeout(连接超时时间)设置,若超时时间过短,高并发下获取连接的等待时间超过阈值就会抛出错误。 - 验证
Min Pool Size(最小连接池大小),是否在应用启动时就初始化了足够的连接,避免高并发时临时创建连接的开销。
- 确认
RDS连接限制与排队机制
- 查看RDS实例的
max_connections参数值,确认当前并发连接数是否接近或达到该上限。即使监控显示“连接异常”不明显,也可能存在连接排队等待的情况(对应性能洞察中连接等待时间飙升的现象)。 - 检查RDS的
connection_timeout和wait_timeout参数,确认是否有连接被过早回收,导致应用频繁重新建立连接,加剧连接竞争。
- 查看RDS实例的
网络层面排查
- 检查AWS VPC内的网络带宽、延迟情况,高并发下网络吞吐量是否达到瓶颈,可通过CloudWatch监控RDS的
NetworkReceiveThroughput和NetworkTransmitThroughput指标。 - 验证安全组、NACL规则是否存在限制,高并发下是否有数据包被丢弃的情况。
- 若应用与RDS不在同一VPC,检查专线或VPN的带宽是否足够,跨区域访问的延迟是否过高。
- 检查AWS VPC内的网络带宽、延迟情况,高并发下网络吞吐量是否达到瓶颈,可通过CloudWatch监控RDS的
查询性能与锁等待
- 虽然CPU未飙升,但可能存在慢查询或锁等待导致连接被占用,无法及时释放。通过
Performance Insights查看是否有高等待事件(如wait/io/table/sql/handler、lock/table/metadata等)。 - 开启MySQL的慢查询日志,捕获高并发下执行时间较长的SQL,分析是否存在未优化的查询(如缺少索引、全表扫描)。
- 检查是否有长事务,事务未及时提交会占用连接资源,导致连接池耗尽。
- 虽然CPU未飙升,但可能存在慢查询或锁等待导致连接被占用,无法及时释放。通过
RDS实例资源瓶颈
- 除CPU外,检查内存使用率(
FreeableMemory),若内存不足导致频繁换页,会影响数据库响应速度。 - 查看磁盘IO指标(
DiskQueueDepth、ReadLatency、WriteLatency),高并发下磁盘IO是否达到瓶颈,尤其是使用GP2磁盘的实例,IOPS可能不足。
- 除CPU外,检查内存使用率(
内容的提问来源于stack exchange,提问作者Hiren Desai
相关产品推荐
相关产品推荐

