Asp.Net Core - 已达到 inotify 实例数量的配置用户限制 (128)
Asp.Net Core - The configured user limit (128) on the number of inotify instances has been reached
asp.net 核心 MVC 在查询 mysql 数据库一定次数后报告错误(在 Ubuntu 14.04/16.04) 以及以下消息:
“已达到 inotify 实例数量的配置用户限制 (128)。”
可以确定是因为controller打开的文件太多,超出了iNotify设置的限制(在/proc/sys/fs/inotify/max_user_instances中),导致报错。但是当 ASP.NET 在每个 http 请求上打开文件时,我感到很困惑,为什么它没有正确关闭文件?有人也遇到过这个问题吗?
备注:我使用的是 Mysql.data.core 和 mysql.data.entityframeworkcore 提供商。
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 代码块中引发,而不是在调用操作后立即引发。
如果有人有解决此问题的线索,非常感谢。
发生错误的原因是 reloadOnChange
在访问 appSetting.json
文件时导致问题。
the configured user limit (128) on the number of inotify instances has been reached
将 reloadOnChange
设置为 false
:
.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: false);
注意:如果您还使用默认 WebHost.CreateDefaultBuilder
,请注意 inside it reloadOnChange
也设置为 true
。
所以只 configure your host from scratch 可能会更安全 - 这是一个如何做到这一点的例子(Microsoft
WebHost.CreateDefaultBuilder
的副本,但没有 FileWatcher
依赖和IISIntegration
因为 Ubuntu
上不需要 IIS
)。
目前我找到的最佳解决方案是通过 运行 这个命令增加 /etc/sysctl.conf
中的 fs.inotify.max_user_instances
:
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
对于容器化环境(其中配置在容器的生命周期内不会改变)或在构建服务器上,缓解该问题的方法是设置环境变量
DOTNET_HOSTBUILDER__RELOADCONFIGONCHANGE=false
这允许继续使用 Host.CreateDefaultBuilder
并防止服务创建不必要的 inotify 实例。
我最近在 dot.net 5.0 上看到了这个问题。在我的例子中,这是由于使用了在这里找到的 bundle 标签助手引起的: https://github.com/meziantou/Meziantou.AspNetCore.BundleTagHelpers 。
似乎已知使用 asp-append-version 的标签助手会导致此问题,请参阅此处 https://github.com/dotnet/runtime/issues/27272#issuecomment-525007303 .
我只需要关闭一些 visual studio 代码 windows,尤其是在 visual studio 代码编辑器中打开的文件。
@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>();
});
}
asp.net 核心 MVC 在查询 mysql 数据库一定次数后报告错误(在 Ubuntu 14.04/16.04) 以及以下消息: “已达到 inotify 实例数量的配置用户限制 (128)。” 可以确定是因为controller打开的文件太多,超出了iNotify设置的限制(在/proc/sys/fs/inotify/max_user_instances中),导致报错。但是当 ASP.NET 在每个 http 请求上打开文件时,我感到很困惑,为什么它没有正确关闭文件?有人也遇到过这个问题吗? 备注:我使用的是 Mysql.data.core 和 mysql.data.entityframeworkcore 提供商。
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 代码块中引发,而不是在调用操作后立即引发。
如果有人有解决此问题的线索,非常感谢。
发生错误的原因是 reloadOnChange
在访问 appSetting.json
文件时导致问题。
the configured user limit (128) on the number of inotify instances has been reached
将 reloadOnChange
设置为 false
:
.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: false);
注意:如果您还使用默认 WebHost.CreateDefaultBuilder
,请注意 inside it reloadOnChange
也设置为 true
。
所以只 configure your host from scratch 可能会更安全 - 这是一个如何做到这一点的例子(Microsoft
WebHost.CreateDefaultBuilder
的副本,但没有 FileWatcher
依赖和IISIntegration
因为 Ubuntu
上不需要 IIS
)。
目前我找到的最佳解决方案是通过 运行 这个命令增加 /etc/sysctl.conf
中的 fs.inotify.max_user_instances
:
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
对于容器化环境(其中配置在容器的生命周期内不会改变)或在构建服务器上,缓解该问题的方法是设置环境变量
DOTNET_HOSTBUILDER__RELOADCONFIGONCHANGE=false
这允许继续使用 Host.CreateDefaultBuilder
并防止服务创建不必要的 inotify 实例。
我最近在 dot.net 5.0 上看到了这个问题。在我的例子中,这是由于使用了在这里找到的 bundle 标签助手引起的: https://github.com/meziantou/Meziantou.AspNetCore.BundleTagHelpers 。 似乎已知使用 asp-append-version 的标签助手会导致此问题,请参阅此处 https://github.com/dotnet/runtime/issues/27272#issuecomment-525007303 .
我只需要关闭一些 visual studio 代码 windows,尤其是在 visual studio 代码编辑器中打开的文件。
@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>();
});
}