Asp.Net Core - 已达到inotify实例数量的已配置用户限制(128)

时间:2017-04-18 10:15:33

标签: ubuntu asp.net-core entity-framework-core inotify

asp.net核心MVC 在查询到mysql数据库(在 Ubuntu 14.04 / 16.04 上)的某些时间后报告错误,并显示以下消息: “已达到inotify实例数量的已配置用户限制(128)。” 可以确定错误是由于控制器打开了太多文件而超出了iNotify设置的限制(在 / proc / sys / fs / inotify / max_user_instances 中)。但是,当ASP.NET在每个http请求上打开文件以及为什么它没有正确关闭文件时,我感到很困惑?任何人都对这个问题有所了解吗? 备注:我使用的是Mysql.data.core和mysql.data.entityframeworkcore provider。

    private static string classiferstring = "sports,outdoor,startup,pets,child,adult,elderly";

    [AllowAnonymous]
    [HttpGet]
    public async Task<object> Classify([FromQuery] string classifyword)
    {
        string[] classifers = classiferstring.Split(',');
        if (!classifers.Contains(classifyword))
        {
            return new
            {
                status = 0,
                info = "WrongClassifier",
                Data = ""
            };
        }

        try
        {
            var predata = await (from d in _context.descriptor
                              join a in _context.combination on d.ID equals a.ID
                              select new ProductsVM
                              {
                                  CREATETIME = a.CREATETIME,
                                  ID = a.ID,
                                  COMPANY = a.COMPANY,
                                  NAME = a.NAME,
                                  PRICE = a.PRICE,
                                  TYPE = a.TYPE,
                                  HEADPHOTO = a.HEADPHOTO,
                                  REMARK = a.REMARK,

                                  Tags = d.Tags,
                                  Classifier = d.Classifier,
                                  OriginName = d.OriginName,
                                  Briefing = d.Briefing
                              }).ToListAsync();
            var data = (from x in predata
                          where x.Classifier.Contains(classifyword.ToLower())
                          select x).ToList();

            if(predata.Count<=0)
            {
                return new
                {
                    status = 2,
                    info = "NoResult",
                    Data = ""
                };
            }else
            {
                return new
                {
                    status = 1,
                    info = "Success",
                    Data = data
                };
            };
        }
        catch(Exception e)
        {
            return new
            {
                status = 0,
                info = "Error",
                Data = e.Message
            };
        }
    }

请注意,异常仅在try / catch代码块中引发,而不是在动作调用后立即引发。

非常感谢,如果有人有解决这个问题的线索。

6 个答案:

答案 0 :(得分:5)

到目前为止,我发现最好的解决方案是通过运行以下命令来增加fs.inotify.max_user_instances中的/etc/sysctl.conf

echo fs.inotify.max_user_instances=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

来源:https://github.com/dotnet/aspnetcore/issues/8449#issuecomment-512275929

答案 1 :(得分:4)

除了其他答案之外,另一种缓解容器化环境(其中配置不会在容器内更改)或构建服务器上的问题的方法是设置环境变量

DOTNET_HOSTBUILDER__RELOADCONFIGONCHANGE=false

这将允许继续使用 Host.CreateDefaultBuilder

答案 2 :(得分:1)

@dmitry-pavlov 是错误的,您可以使用默认构建器作为最后添加的构建器获胜 - 但这样做会使 appsettings.json 设置覆盖所有其他配置源、环境和命令行。请参阅 https://github.com/dotnet/AspNetCore.Docs/pull/22391,这将很快被正式记录。如果您不关心 appsettings.json 重新加载,请将其设置为 false

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddJsonFile("appsettings.json",
                optional: true,
                reloadOnChange: false);
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}

答案 3 :(得分:0)

发生错误的原因是reloadOnChange导致访问appSetting.json文件时出现问题。

  

已达到对inotify实例数量的配置用户限制(128)

reloadOnChange设置为false

.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: false);

注意:如果您还使用默认的WebHost.CreateDefaultBuilder,请注意inside it reloadOnChange也设置为true

因此,仅使用configure your host from scratch可能会更安全-这是一个示例(Microsoft WebHost.CreateDefaultBuilder的副本,但没有FileWatcher依赖项和{{ 1}},因为您不需要IISIntegration上的IIS)。

答案 4 :(得分:0)

我最近在 dot.net 5.0 上看到了这个问题。在我的情况下,它是由使用此处找到的捆绑标记助手引起的: https://github.com/meziantou/Meziantou.AspNetCore.BundleTagHelpers 。 似乎已知使用 asp-append-version 的标签助手会导致此问题,请参阅此处 https://github.com/dotnet/runtime/issues/27272#issuecomment-525007303

答案 5 :(得分:0)

我只需要关闭一些 Visual Studio 代码窗口,尤其是在 Visual Studio 代码编辑器中打开的文件。