socket.io每个emit动作都会创建新的虚拟文件

时间:2013-08-22 10:01:13

标签: node.js socket.io emit

我正在使用node + socket.io应用程序。到目前为止一切都很顺利。最近我开始收到一些错误:

 Error: accept EMFILE

 warn error raised error listen eaddrinuse

搜索互联网让我看到了这个stackoverflow问题:Node.js SSL server frozen, high CPU, not crashed but no connections。回答Knskan3写道:

  

每个套接字都会创建一个新的虚拟文件。

我检查了一下,看起来每个套接字都会发出动作:

 io.sockets.in(roomName).emit('some_action', data);

创建新的虚拟文件。

现在,当我有非常动态的应用程序每秒发送数据时,将会在很短的时间内在服务器上创建很多新文件,最后服务器将达到最大文件的限制(默认为1024)。我可以增加限制,但我不认为它是解决方案,因为它真的可以发出很多。我做错了什么或发出真正的工作方式?你怎么建议解决这个问题?

修改 在得到一些答案后,我粘贴在控制台显示的位置下面:

xxxx:~# ls -l /proc/11124/fd | wc -l
20
xxxx:~# ls -l /proc/11124/fd | wc -l
21
xxxx:~# ls -l /proc/11124/fd | wc -l
22
xxxx:~# ls -l /proc/11124/fd

lrwx------ 1 root root 64 08-23 08:21 0 -> socket:[7352977]
lrwx------ 1 root root 64 08-23 08:21 1 -> socket:[7352980]
lrwx------ 1 root root 64 08-23 08:23 10 -> socket:[7444235]
lrwx------ 1 root root 64 08-23 08:23 11 -> socket:[7444237]
lrwx------ 1 root root 64 08-23 08:23 12 -> socket:[7444239]
lrwx------ 1 root root 64 08-23 08:23 13 -> socket:[7444245]
lrwx------ 1 root root 64 08-23 08:23 14 -> socket:[7444243]
lrwx------ 1 root root 64 08-23 08:23 15 -> socket:[7444252]
lrwx------ 1 root root 64 08-23 08:23 16 -> socket:[7444250]
lrwx------ 1 root root 64 08-23 08:23 17 -> socket:[7444254]
lrwx------ 1 root root 64 08-23 08:23 18 -> socket:[7445919]
lrwx------ 1 root root 64 08-23 08:23 19 -> socket:[7446836]
lrwx------ 1 root root 64 08-23 08:21 2 -> socket:[7352982]
lrwx------ 1 root root 64 08-23 08:23 20 -> socket:[7447275]
lrwx------ 1 root root 64 08-23 08:21 3 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 08-23 08:21 4 -> anon_inode:[eventfd]
lr-x------ 1 root root 64 08-23 08:21 5 -> pipe:[7352986]
l-wx------ 1 root root 64 08-23 08:21 6 -> pipe:[7352986]
lrwx------ 1 root root 64 08-23 08:21 7 -> socket:[7352987]
lrwx------ 1 root root 64 08-23 08:23 8 -> socket:[7444231]
lrwx------ 1 root root 64 08-23 08:23 9 -> socket:[7444233]

每次操作后我都运行命令:ls -l /proc/11124/fd | wc -l(就像在我粘贴链接的网站上告诉的那样)并且它增加了一个。对我来说,无论如何它看起来像创建文件。我在互联网上看到了许多类似的情况,并建议解决方案是增加ulimit,但这不是解决方案,而是临时修复。

EDIT2: 好的我发现了问题。我在app memcache中使用。当我不再需要它时,我没有关闭连接如此多的发出操作导致与memcache创建新连接而不关闭它。现在一切都好。

1 个答案:

答案 0 :(得分:0)

有一些先例可以增加预计会有大量流量的节点服务器的文件限制: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/