Erlang的最大并发打开端口数量是多少?

9
erlang TCP/IP库是否有限制?我已经搜索了一些但是没有找到确切的答案。我将ERL_MAX_PORTS环境变量设置为12000,并配置Yaws使用无限连接。我编写了一个简单的客户端应用程序连接到我为Yaws编写的应用程序模块,通过同时启动X个客户端来测试并发连接数。当我达到约100个客户端时,Yaws服务器停止接受更多的TCP连接并且客户端会出现错误: "Error in process with exit value: {{badmatch,{error,socket_closed_remotely}}"。我知道同时打开的连接数必须有限制,但是100似乎很低。我查看了所有的Yaws文档,已经删除了任何关于连接数量的限制。这是在运行Snow Leopard的2.16Ghz Intel Core 2 Duo iMac上进行的测试。在Vista机器上进行快速测试显示,在约300个连接时会出现相同的问题。我的测试是否不合理?即同时打开100多个连接以测试Yaws并发性是否愚蠢?谢谢。

“socket_closed_remotely” 这个错误提示是不是意味着问题出在客户端? - Zed
在你的编辑之后更新了我的答案,可能是因为你同时打开了它们。 - stacker
Zed:错误信息来自客户端,因此Yaws正在关闭套接字。我在Yaws中没有看到任何日志记录。 - ckovacs
在创建客户端之间增加100ms的延迟,使我能够获得大约1000个连接请求中的900个。我将对Java Axis服务进行更多测试,以确定这是否是操作系统或Erlang相关限制。 - ckovacs
据我所知,ERL_MAX_PORTS 不是用于网络端口,而是用于 Erlang 端口(一种以 Erlang 客户端的方式启动程序)- 请参见 port_open() - ZeissS
如果我没记错的话,过去在OSX上有许多端口/套接字存在问题。这也可能影响到这个问题。 - I GIVE CRAP ANSWERS
3个回答

6

看起来你遇到了系统限制,请尝试使用以下方法增加最大打开文件数:

$ ulimit -n 500

如何在Snow Leopard上打开>255个套接字?

Erlang本身有一个1024的限制:

来自http://www.erlang.org/doc/man/erlang.html

默认情况下可以同时打开的端口最大数量为1024,但可以通过环境变量ERL_MAX_PORTS进行配置。

编辑:

系统调用listen()具有参数backlog,该参数确定可以排队多少请求,请检查是否延迟请求以建立连接有所帮助。这可能是您的问题。


1
如果最大端口已用尽,则错误将是“enfile”,而不是“socket_closed_remotely”。 - Zed
抱歉,我忘记提到我已经在OS X和Vista设置中将ERL_MAX_PORTS设置为12000。 - ckovacs

3

所有Erlang系统限制都在Erlang效率指南中报告:

http://erlang.org/doc/efficiency_guide/advanced.html#id2265856

打开端口部分阅读:

默认情况下,同时打开的Erlang端口的最大数量为1024。此限制可以在启动时提高到最多268435456(请参见erlang(3)中的环境变量ERL_MAX_PORTS)。由于内存短缺,至少在32位体系结构上,最大限制268435456个打开端口将无法达到。


0

在尝试了大家的建议并搜寻了Erlang文档后,我得出结论:我的问题在于Yaws无法跟上负载。

在同一台机器上,一个Apache Http Components Web服务器(非阻塞I/O)在相同的阈值下处理连接时没有同样的问题。

感谢大家的帮助。我将转向其他基于Erlang的Web服务器,如Mochiweb。


当然,你的回答并不是正确答案。 - Farshid Ashouri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接