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

ant*_*tfx 6 .net c# ubuntu mono

我知道有很多这些问题,但我看不出任何符合我具体情况的东西.

我在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服务器上运行,有更多的连接,他们从来没有这个问题.

知道什么可能导致这个错误?

pal*_*min 6

Windows上不发生错误的原因可能与垃圾收集完成时有关.如果未明确关闭套接字连接,则在收集套接字时将关闭套接字.

这有些推测,但如果Mono没有启动垃圾收集,直到它看到你的内存不足并且它永远不会耗尽内存套接字永远不会关闭.Windows .NET框架可能会定期运行垃圾收集,或者当它看到文件描述符用尽时,这可能会导致差异.

作为测试,您可以定期强制手动垃圾收集(GB.Collect),如果这可以解决您的错误,那么正确的解决方案是不依赖垃圾收集来关闭套接字,确保在您的代码中手动关闭它们.强制手动垃圾收集会带来一系列问题.


Chr*_*ain 0

在 Linux 中,TCP 连接被分配了一个文件句柄,这可能就是它显示太多打开文件句柄的原因。完成 TCP 连接后是否要关闭它们?显示问题的代码示例会有所帮助。