首页 > 解决方案 > AWS ECS/Fargate 托管的 Asp.NET Web 服务中一致的定期首次机会 SocketException

问题描述

我有一个托管在 AWS ECS/Fargate 中的 Asp.NET Core 5 Web 服务 (.NET 5)。它使用启用了运行状况检查的应用程序负载均衡器 (ALB),指向/health使用标准运行状况检查库

我正在使用 Datadog 和dotnet 运行时指标监控服务。通过这种监控,我们可以看到每分钟持续约 30 个首次机会 SocketException(s)。即使处于闲置状态并且不处理任何实际请求。唯一被服务的请求是健康检查请求。

我远程执行到 ECS 任务中,并用于dotnet-dump从内存转储堆中获取异常。这是我发现的:

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

我们有一个不太常见的第一次机会 ObjectDisposedException(每分钟约 1 个),它也可能是相关的(或另一个的竞争条件工件)。我在内存转储分析中发现:

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

在我的本地机器上运行时,我没有看到这个问题。而且我没有看到任何日志表明任何请求已被取消。

我怀疑 ALB 没有读取响应正文并在仅读取状态码后取消每个请求。所以我更改了健康检查HealthCheckOptions.ResponseWriter以返回没有响应正文的 204-NoContent,但这根本没有帮助。

标签: asp.net.netamazon-web-servicesasp.net-coreamazon-ecs

解决方案


推荐阅读