如何解决AWS ECS/Fargate 托管的 Asp.NET Web 服务中一致的定期第一次机会 SocketException
我有一个托管在 AWS ECS/Fargate 中的 Asp.NET Core 5 Web 服务 (.NET 5)。它使用应用程序负载均衡器 (ALB) 并启用健康检查,指向使用标准 health checks library 的 children
。
我正在使用 Datadog 并打开 dotnet runtime metrics 来监控服务。通过这种监控,我们看到每分钟大约有 30 次第一次机会的 SocketException。即使闲置且不处理任何真实请求。服务的唯一请求是运行状况检查请求。
我远程执行 ECS 任务并使用 /health
从内存转储堆中获取异常。这是我发现的:
dotnet-dump
我们有一个不太规律的第一次 ObjectDisposedException(每分钟约 1 个),它也可能是相关的(或另一个的竞争条件工件)。我在内存转储分析中发现的:
Exception type: System.Net.Sockets.SocketException
Message: Operation canceled
InnerException: <none>
StackTrace (generated):
Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll!Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketAwaitableEventArgs.<GetResult>g__ThrowSocketException|7_0(System.Net.Sockets.SocketError)+0x2a
Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll!Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketAwaitableEventArgs.GetResult()+0x29
Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll!Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketConnection+<ProcessReceives>d__28.MoveNext()+0x1b5
System.Private.CoreLib.dll!System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()+0x1c
System.Private.CoreLib.dll!System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task)+0xcc
System.Private.CoreLib.dll!System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)+0x46
Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll!Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketConnection+<DoReceive>d__27.MoveNext()+0xfb
我在本地机器上运行时没有看到这个问题。而且我没有看到任何表明任何请求被取消的日志。
我怀疑 ALB 没有读取响应正文并在仅读取状态代码后取消每个请求。因此,我更改了运行状况检查 Exception type: System.ObjectDisposedException
Message: Cannot access a disposed object.
InnerException: <none>
StackTrace (generated):
System.Net.Sockets.dll!System.Net.Sockets.Socket.ThrowObjectDisposedException()+0x6a
System.Net.Sockets.dll!System.Net.Sockets.Socket.ReceiveAsync(System.Net.Sockets.SocketAsyncEventArgs,System.Threading.CancellationToken)+0x67
Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll!Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketConnection+<ProcessReceives>d__28.MoveNext()+0x219
System.Private.CoreLib.dll!System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()+0x1c
System.Private.CoreLib.dll!System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task)+0xcc
System.Private.CoreLib.dll!System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)+0x46
Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll!Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketConnection+<DoReceive>d__27.MoveNext()+0xfb
以返回没有响应正文的 204-NoContent,但这根本没有帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。