gpt4 book ai didi

c# - "Too many open files"和请求缓冲

转载 作者:行者123 更新时间:2023-12-04 13:26:36 27 4
gpt4 key购买 nike

我们有一个 ASP.NET Core 5 应用程序在 AWS 的 Docker 容器中运行。
当它收到一连串的 HTTP POST 请求时,我在日志中收到此错误:

System.IO.IOException: Too many open files
at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String path, OpenFlags flags, Int32 mode)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.CreateTempFile()
at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.ReadAsync(Memory`1 buffer, CancellationToken cancellationToken)
at System.Text.Json.JsonSerializer.ReadAsync[TValue](Stream utf8Json, Type returnType, JsonSerializerOptions options, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.BindModelAsync(ModelBindingContext bindingContext)
at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, Object value, Object container)
at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c_DisplayClass0_0.<<CreateBinderDelegate>g_Bind|0>d.MoveNext()
通过上面的异常跟踪,我们可以看到:
  • 这发生在 MVC 中间件中(这是在它到达我们自己的 Controller 代码之前)
  • FileBufferingReadStream 发生这种情况时正在尝试在读取输入流时将新文件创建到磁盘(请参阅源代码 here)。当您 enable buffering 时会调用此方法在您的解决方案中。

  • 到目前为止,我们所拥有的是:在解决方案中启用了缓冲,这会导致我们每次收到具有较长主体的请求时(大多数情况下都会发生)写入磁盘。但是,我已经删除了所有调用 EnableBuffering 的代码。从我的解决方案。库/框架中是否有任何代码可以从我们这里启用缓冲?这是由一些环境变量控制的,这些环境变量可能是运行环境的一部分?
    编辑:
    这是我的 Program.cs类(为了隐私我省略了一些东西):
    public static async Task Main(string[] args)
    {
    var webHost = CreateHostBuilder(args).Build();
    await webHost.RunAsync();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
    return Host.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
    logging.ClearProviders();
    logging.AddConsole();
    logging.AddDebug();
    logging.SetMinimumLevel(LogLevel.Information);
    })
    .ConfigureWebHostDefaults(webBuilder =>
    {
    webBuilder.UseStartup<Startup>();
    webBuilder.CaptureStartupErrors(false);
    webBuilder.UseSentry();
    })
    .ConfigureServices(services => { });
    }
    这是我的 Startup.cs类(class):
    public class Startup
    {
    public Startup(IConfiguration configuration)
    {
    Configuration = configuration;
    }

    private IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
    services.Configure<Config>(Configuration.GetSection("AppSettings"));

    services.AddApiVersioning(version =>
    {
    version.DefaultApiVersion = new ApiVersion(1, 0);
    version.AssumeDefaultVersionWhenUnspecified = true;
    version.ReportApiVersions = true;
    });

    services.AddLogging();

    //... DI config here

    services.AddControllers();
    services.AddHealthChecks();

    services.AddSwaggerGen(c =>
    {
    c.SwaggerDoc("v1", new OpenApiInfo {Title = "MyApp", Version = "v1"});
    });
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IMainIndexer elastic)
    {
    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
    endpoints.MapControllers();
    endpoints.MapHealthChecks("/healthcheck", new HealthCheckOptions
    {
    Predicate = _ => true,
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
    });
    endpoints.MapGet("/",
    async context =>
    {
    await context.Response.WriteAsync(
    "<html><body>Welcome to MyApp</body></html>");
    });
    });
    }
    }
    我们尝试了一些变通方法,例如使用不同的 Docker 基础镜像和使用 Newtonsoft 代替 System.Text我们仍然遇到同样的问题。我错过了什么吗?

    最佳答案

    如问题中所述,该问题是由启用请求缓冲的中间件中的某些内容引起的。
    我们发现这是由 Sentry 引起的.
    你可以看到here哨兵调用 EnableBuffering() .
    当我们从 Program.cs 中删除这一行时

    WebBuilder.UseSentry();
    并再次运行相同的负载,错误消失了。

    关于c# - "Too many open files"和请求缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68096157/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com