asp.net - 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,但这根本没有帮助。
解决方案
推荐阅读
- postgresql - postgresql第一个密码?
- javascript - 用两位小数后的数字替换字符串的重复
- mysql - Mysql Json列中的增量JSON字段导致浮点数不是整数
- rust - 如何填充具有预定义容量的向量?
- node.js - 用 gatsby 调用 Restful api
- jmeter - 无法通过 Jmeter 中的 beanshell 断言采样器附加到文件中的下一行
- javascript - 与 javascript 中的变量相比,我应该更喜欢函数吗?
- ionic-framework - Ionic 3:如何显示数组数组?
- python - 使用 np.digitize 按 bin 对数据进行分组
- android - android代码我想尝试计算但是当我在itemselection listener case0中初始化cal1()方法时它崩溃了请告诉我解决方案