1

我正在创建一个单声道聊天服务器,它应该能够打开许多套接字。在决定架构之前,我正在使用单声道进行负载测试。只是为了测试,我创建了一个小型单服务器和单服务器,可以打开 100,000 个套接字/连接,并且运行良好。

我试图达到极限,有时进程崩溃(当然)。但让我担心的是,如果我尝试重新启动进程,它会直接给出“未处理的异常:System.Net.Sockets.SocketException:打开的文件太多”。

所以我猜想文件描述(套接字)以某种方式保持打开,即使我的进程结束。即使几个小时后它仍然会出现此错误,我可以处理它的唯一方法是重新启动我的计算机。如果我们在生产中不知道如何处理它,我们就不会遇到这种问题。

我的问题: 无论启动哪个单声道应用程序,Mono 中是否有任何东西可以在全球范围内持续运行,一种我可以在不重新启动计算机的情况下重新启动的服务?或者这不是单声道问题而是 unix 问题,即使我们用 java/C++ 编程也会遇到这种问题?

我检查了以下内容,但没有单进程活着,没有打开套接字,也没有文件:

localhost:~ root# ps -ax | grep mono  
1536 ttys002    0:00.00 grep mono

-

localhost:~ root# lsof | grep mono  
(nothing)

-

localhost:~ root# netstat -a  
Active Internet connections (including servers)  
(no unusual ports are open)

对于开发,我在 OSX 10.7.5 下运行。对于生产,我们可以决定使用哪个平台。

4

1 回答 1

0

这听起来像您需要在套接字上设置(或取消设置)Linger 选项(使用Socket.SetSocketOption)。根据您使用的实际 API,可能会有更好的选择(例如,TcpClient 具有LingerState属性)。

于 2013-02-20T08:57:12.960 回答