os x 上的 node.js socket.io 服务器无法连接超过 120 个客户端
Posted
技术标签:
【中文标题】os x 上的 node.js socket.io 服务器无法连接超过 120 个客户端【英文标题】:node.js socket.io server on os x cannot connect more than 120 clients 【发布时间】:2015-06-29 23:41:40 【问题描述】:我正在编写 socket.io-client node.js 机器人应用程序,以测试我的基于 socket.io 的服务器应用程序的性能也在节点下运行。
服务器通常运行 ubuntu linux,但我也在本地开发机器上安装和配置了相同的服务器应用程序(node.js、nginx、socket.io)。
如果我启动我的机器人“脚本”并启动 200 个机器人来创建与服务器的单独连接,那么如果我对真正的服务器(即 linux 服务器)执行此操作,我将毫无问题。
但是,如果我连接到本地基于 os x 的“服务器”,我就无法真正获得超过 120 个连接。
我得到了断开连接、陈旧的套接字和断开/重新连接的无限循环,在 socket.io 的标准设置下,完成的时间越来越长(延迟重新连接尝试)。
在这样的测试中,我的本地开发机器的负载几乎为 0%,因此它与内存或处理器无关。
我已经在第二台本地机器上尝试了相同的机器人脚本,以确保问题与在与服务器相同的机器上运行的机器人无关。但我遇到了同样的问题。
只要我将机器人脚本指向真实服务器,我就没有任何问题。
当我处于问题发生的范围内时,即使用 120 多个客户端进行推送时,我尝试使用浏览器(真实的用户场景)访问我的本地开发服务器并多次刷新。有时我会得到一个“内部服务器 500”。
让我觉得这可能不是与 nginx 相关的 socket.io?或常规 os x(非服务器)机器上的其他一些基本套接字限制?
【问题讨论】:
【参考方案1】:在发布这个问题之前我所做的所有谷歌搜索..... 这样做 3 分钟后,我偶然发现了答案:
在终端中写入:
sysctl -a | grep somax
我得到了答案:
kern.ipc.somaxconn: 128
所以我猜这个案子已经结案了。
只需在终端中写入:
sudo sysctl -w kern.ipc.somaxconn=xyz
其中 xyz 是允许的连接数。
在这里找到答案: http://b.oldhu.com/2012/07/19/increase-tcp-max-connections-on-mac-os-x/
【讨论】:
干得好。保存以备将来参考,因为我知道有一天它也会咬我。 实际上只是改变我强调的那个值似乎并没有解决这个问题。但我至少能够得出结论,问题不在于我的代码、nginx 或节点。所以我让它休息了一段时间。一旦我真正解决了这个问题,我会确保在这里发帖。我有一个相当未经调整的 OS X 安装,所以我想很多人一定会偶然发现这个问题,尽管也许大多数人从未尝试用数千个连接来轰炸他们的 PC :)【参考方案2】:128 的 somaxconn 值似乎是一个可接受的解决方案。但在我的情况下,改变这个值并没有做到。
这篇文章解释了解决方案。 http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X
问题是最大进程限制和最大打开文件限制。 可以通过写来查看这些限制 ulimit -u(打开文档) ulimit -n (max procc)
更改它们的运行时对我来说效果不佳,但上面的链接说明了如何为许多流行的操作系统永久更改这些值。
进行此更改后,我没有超过以前的限制,并且我的 kern.ipc.somaxconn: 仍然是 128..
【讨论】:
以上是关于os x 上的 node.js socket.io 服务器无法连接超过 120 个客户端的主要内容,如果未能解决你的问题,请参考以下文章
STOMP 上的重复事件 Socket.io 和 Node.js
Flask socket.IO 服务器上的 Node.js Socket.io 客户端
node.js 上的 Socket.io-client 只工作一次