c# - 打开的文件太多(Ubuntu 上的 Mono .NET)

标签 c# .net ubuntu mono

我知道 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/

相关文章:

.net - 在 Silverlight 单元测试中等待事件触发

c# - 使用C#下载多个网页的最快方法

ubuntu - 如何使终端打开带有焦点的gui应用程序?

c# - TextTransform 无效转换错误

c# - 使用默认值初始化队列或堆栈?

c# - 为 WPF DateTimePicker 验证设置区域性

.net - 为什么强制我的域对象实现 INotifyPropertyChanged 的​​缺点是?

ubuntu - 如何将一个命令设置为另一个命令?

linux - Ubuntu中监控远程登录机器的流量(通过ssh本地端口转发)

c# - 将按钮命令绑定(bind)到不同的 ViewModel