ASP.NET Core 6 Web API压测时出现504网关超时问题求助
排查ASP.NET Core 6 Web API并发下504网关超时问题
针对你遇到的并发请求下近50%出现504网关超时的问题,结合你的API逻辑和部署环境,可从以下几个方向排查:
1. 数据库连接池耗尽
- 核心原因:默认数据库连接池大小(如SQL Server默认100)不足以支撑1000并发请求,大量请求等待获取数据库连接,导致处理时间超过网关超时阈值。
- 排查方式:
- 查看数据库端的连接数监控(如SQL Server的
sys.dm_exec_connections视图),确认并发连接数是否达到上限。 - 检查API日志中是否存在
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool这类错误。
- 查看数据库端的连接数监控(如SQL Server的
- 解决建议:
在数据库连接字符串中调整Max Pool Size参数,根据数据库承载能力适当调高(例如设为200或更高):Server=xxx;Database=xxx;User Id=xxx;Password=xxx;Max Pool Size=200;
2. ASP.NET Core 主机并发限制
- 核心原因:Kestrel或反向代理(如IIS、ALB)的并发连接/请求队列限制不足,导致请求积压,最终触发网关超时。
- 排查方式:
- 查看Kestrel日志,确认是否存在请求排队的记录。
- 若使用AWS ALB,检查目标组的
RequestCount和TargetResponseTime指标,看是否有请求因排队超时。
- 解决建议:
调整Kestrel的并发配置,在Program.cs中增加:
同时检查ALB目标组的超时设置(默认60秒),若API处理确实需要更长时间,可适当调高,但优先解决底层性能瓶颈。builder.WebHost.ConfigureKestrel(options => { options.Limits.MaxConcurrentConnections = 2000; options.Limits.MaxConcurrentUpgradedConnections = 2000; options.Limits.RequestHeadersTimeout = TimeSpan.FromSeconds(30); });
3. 数据库写入性能瓶颈
- 核心原因:并发写入时数据库的IO、CPU资源不足,或表结构设计导致锁等待,拖慢单请求处理时间。
- 排查方式:
- 查看数据库实例的监控指标(如AWS RDS的
CPUUtilization、WriteIOPS),确认是否在并发测试时达到资源上限。 - 检查数据库慢查询日志,看插入GUID的语句执行时间是否过长。
- 查看数据库实例的监控指标(如AWS RDS的
- 解决建议:
- 若使用GUID作为主键,改用顺序GUID(随机GUID会导致索引碎片,可使用
SequentialGuid减少碎片)。 - 开启数据库的快照隔离(如SQL Server的
READ_COMMITTED_SNAPSHOT ON),减少读写锁冲突。 - 根据数据库负载情况,升级数据库实例配置。
- 若使用GUID作为主键,改用顺序GUID(随机GUID会导致索引碎片,可使用
4. 异步实现不规范
- 核心原因:DAL层的异步方法可能是“假异步”(同步操作包装成Task),导致线程池线程被阻塞,并发高时线程池耗尽,请求无法及时处理。
- 排查方式:
- 检查DAL的
GetGUID实现,确认是否使用了真正的异步数据库操作(如ExecuteScalarAsync、SaveChangesAsync),而非同步方法加Task.Run。 - 使用
dotnet-counters工具监控API的ThreadPool Queue Length,若队列持续增长,说明线程池被阻塞。
- 检查DAL的
- 解决建议:
确保全链路使用真正的异步操作,示例DAL实现:public async Task<string> GetGUID(GUIDModel model) { using var conn = new SqlConnection(yourConnectionString); await conn.OpenAsync(); using var cmd = new SqlCommand("INSERT INTO YourTable (Param1, GuidCol) OUTPUT inserted.GuidCol VALUES (@Param1, @Guid)", conn); cmd.Parameters.AddWithValue("@Param1", model.Param1); cmd.Parameters.AddWithValue("@Guid", Guid.NewGuid().ToString()); return await cmd.ExecuteScalarAsync() as string; }
5. EC2实例资源瓶颈
- 核心原因:并发请求下EC2实例的CPU或内存资源耗尽,导致API进程无法及时处理请求。
- 排查方式:
- 查看EC2的CloudWatch指标,确认
CPUUtilization是否在测试时接近100%,MemoryUtilization是否过高。 - 在EC2实例上使用
top或dotnet-dump工具,查看API进程的资源占用情况。
- 查看EC2的CloudWatch指标,确认
- 解决建议:
- 若CPU耗尽,可升级实例类型(如c6i.2xlarge),或优化API中不必要的CPU密集型操作。
- 若内存不足,检查是否存在内存泄漏(可使用
dotnet-diagnostic工具分析),或增加实例内存。
内容的提问来源于stack exchange,提问作者XamDev
相关产品推荐
相关产品推荐

