我们的应用程序在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();