我部署了一个用 C# 编写的 AWS Lambda,根据输入,我可以在控制台中看到以下错误消息(已截断):
{
"Cause": "{\n \"errorType\": \"IOException\",\n \"errorMessage\":
\"Too many open files : [...]at System.IO.FileSystem.RemoveDirectoryRecursive(String fullPath)
"Error": "IOException",
"ExecutionArn": [...]
我(在某种程度上?)很清楚错误所指的内容,但我想至少在本地重现它。
当我使用具有完全相同的输入(JSON)的AWS .NET Lambda 测试工具执行它时,我无法触发异常。所以我假设我的 Windows 10 系统对文件描述符的数量比 AWS 端的系统更宽容。因此在我的 Lambda 代码中添加了对 _setmaxstdio 的调用:
[DllImport("msvcrt.dll")]
public static extern int _setmaxstdio(int newMax);
然后在主代码中我调用:
int ret = _setmaxstdio(128);
我看到调试器中返回了 128
值,但我再次无法使用
AWS .NET Lambda test tool
在本地重现该问题。我选择了 128,因此它低于以下描述的 1024 值:
https://hub.docker.com/_/microsoft-dotnet-samples/
也就是说,您确定正确关闭了所有文件句柄吗?任何实现 IDisposable 的内容都应该在“using”语句或块中使用,以避免泄漏文件句柄并逐渐接近该限制。
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/using