由于系统中打开的文件过多,ASP.NET Core 2.2崩溃

我们的应用程序在Cloud Foundry服务器上运行,几周后我们收到以下异常:

  

System.Net.Http.HttpRequestException:系统中打开文件过多--- System.Net.Sockets.SocketException:System.Net.Sockets.Socket..ctor(AddressFamily addressFamily,SocketType在系统中打开文件过多System.Net.Sockets.DualSocketMultipleConnectAsync..ctor(System.Net.Sockets.Socket.ConnectAsync(SocketType socketType,ProtocolType protocolType,SocketasyncEventArgs e)处的System.Net.Sockets.DualSocketMultipleConnectAsync..ctor(SocketType socketType,ProtocolType protocolType)在System.Net.Http。 ConnectHelper.ConnectAsync(字符串主机,Int32端口,CancellationToken cancelledToken)

如果我在容器中检查套接字,那么会有很多套接字转储,并且它们的数量增长非常快(请参见上图)

我在容器中的呼叫

lsof | grep 'sock'

更新:

现在我发现,应用程序的哪一部分导致了此问题,但我不知道为什么:

为了从客户端为地图层调用外部API,我在后端创建了一个代理:

    public static IApplicationBuilder UseMapLayerProxy(this IApplicationBuilder app)
    {
        app.Use(async (context,next) =>
        {
            var config = (app.ApplicationServices.GetService(typeof(IOptions<AppSettings>)) as IOptions<AppSettings>).Value.MapServer;
            if (IsMapLayerRequest(context,config))
            {
                var forwardedHost = context.Request.Headers["X-Forwarded-Host"].ToArray().FirstOrDefault();
                if (forwardedHost == null)
                {
                    context.Request.Headers.Add("X-Forwarded-Host",context.Request.Host.ToString());
                }

                var builder = app.New(); // branch app to lose all middlewares and prevent infinity recursion
                builder.RunProxy(new ProxyOptions
                {
                    Scheme = config.Scheme,Host = config.Host,});
                await builder.Build().Invoke(context);
            }
            else
            {
                await next.Invoke();
            }
        });

        return app;
    }

    private static bool IsMapLayerRequest(HttpContext httpContext,MapServerSettings config)
    {
        return Array.Exists(config.LayerPaths,path => httpContext.Request.Path.Value.StartsWith(path,StringComparison.OrdinalIgnoreCase));
    }

startup.cs:

app.UseMapLayerProxy();

由于系统中打开的文件过多,ASP.NET Core 2.2崩溃

tomtomtom3 回答:由于系统中打开的文件过多,ASP.NET Core 2.2崩溃

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2983025.html

大家都在问