AWS Lambda:IOException:打开文件太多

问题描述 投票:0回答:2

我部署了一个用 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://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution
如何在本地重现异常?

c# amazon-web-services aws-lambda file-descriptor
2个回答
0
投票
我不确定这是否会更有帮助,但 AWS 无服务器应用程序模型 (SAM) 将允许您针对 AWS 资源在本地运行 C# lambda 代码。它还有助于部署和其他基础设施,例如 S3 存储桶或 DyanmoDB 表。这个

博客是对该主题的很好的介绍。


0
投票
Windows 上的文件句柄限制与 Linux 上的 fd 限制的工作方式不同。尝试在本地 Linux 计算机或容器中运行 dotnet 代码,以在更具代表性的环境中重现问题。例如,您可以使用“ulimit -f 128”人为地设置下限。您可以在此处了解有关 Microsoft 官方 .NET 容器映像以及如何开始的更多信息:

https://hub.docker.com/_/microsoft-dotnet-samples/

也就是说,您确定正确关闭了所有文件句柄吗?任何实现 IDisposable 的内容都应该在“using”语句或块中使用,以避免泄漏文件句柄并逐渐接近该限制。

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/using

© www.soinside.com 2019 - 2024. All rights reserved.