我知道 SO 上有很多这样的问题,但我看不到任何符合我具体情况的问题。
我在 Ubuntu 上通过 Mono 运行 .NET 控制台应用程序。该应用程序作为服务器运行并通过 TcpListener (TcpListener.AcceptTcpClient()) 接受连接。我遇到的问题是,一段时间后程序开始抛出“打开的文件太多”异常。
我在我知道的两个地方增加了 Ubuntu 中的最大文件限制:
- /etc/security/limits.conf
root soft nofile 240000
root hard nofile 320000
(有问题的进程以root身份运行)
- /etc/sysctl.conf
fs.file-max = 2000000
两者都设置为 ~200000。
如果检查系统上打开的文件描述的数量,即使它抛出错误也只有 996。
我在多台连接更多的 Windows 服务器上运行相同的程序,但它们从来没有出现过这个问题。
知道是什么导致了这个错误吗?
最佳答案
在 Windows 上没有发生错误的原因可能与垃圾收集完成的时间有关。如果您没有明确关闭套接字连接,套接字将在收集时关闭。
这有点推测性,但如果 Mono 直到它看到你用完内存才开始垃圾收集并且它永远不会用完内存套接字永远不会关闭。 Windows .NET Framework 可能会定期运行垃圾收集,或者当它发现您用完文件描述符时运行垃圾收集,这可能是造成差异的原因。
作为测试,您可以定期强制执行手动垃圾收集 (GB.Collect),如果这可以解决您的错误,正确的解决方案是不依赖垃圾收集来关闭套接字,确保在你的代码。强制手动垃圾收集会带来一系列问题。
关于c# - 打开的文件太多(Ubuntu 上的 Mono .NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8988766/