erlang TCP / IP库是否有一些限制?我做了一些搜索,但找不到任何确定的答案。
我已将ERL_MAX_PORTS环境变量设置为12000,并将Yaws配置为使用无限连接。
我编写了一个简单的客户端应用程序,它连接到我为Yaws编写的appmod,并且正在通过同时启动X个客户端来测试同时连接的数量。
我发现当我到达大约100个客户端时,Yaws服务器停止接受更多TCP连接并且客户端错误出现
Error in process with exit value: {{badmatch,{error,socket_closed_remotely}}
我知道打开的同时连接数必须有限制,但100似乎非常低。我查看了所有的雅司文档并删除了对连接的任何限制。
这是运行Snow Leopard的2.16Ghz Intel Core 2 Duo iMac。
对Vista计算机的快速测试表明,我在大约300个连接处遇到了同样的问题。
我的测试不合理吗?即同时打开100多个连接来测试Yaws的并发性是不是很傻?
感谢。
答案 0 :(得分:6)
您似乎遇到系统限制,尝试使用
增加打开文件的最大数量$ ulimit -n 500
Python on Snow Leopard, how to open >255 sockets?
Erlang本身的限制为1024:
来自http://www.erlang.org/doc/man/erlang.html
默认情况下,可以同时打开的最大端口数为1024,但可以通过环境变量ERL_MAX_PORTS进行配置。
编辑:
系统调用listen() 有一个参数积压,用于确定可以排队的请求数,请检查建立连接的请求之间的延迟是否有帮助。这可能是你的问题。
答案 1 :(得分:3)
Erlang效率指南中报告了所有Erlang系统限制:
http://erlang.org/doc/efficiency_guide/advanced.html#id2265856
从开放端口部分阅读:
最大同时数 打开Erlang端口默认为1024。 这个限制最多可以提高 268435456在启动时(参见环境 erlang中的变量ERL_MAX_PORTS(3)) 最高限额为268435456 端口至少在32位上 建筑是不可能达到的 由于内存不足。
答案 2 :(得分:0)
在尝试了所有人的建议并搜索Erlang文档之后,我得出结论,我的问题是Yaws无法跟上负载。
在同一台机器上,Apache Http Components Web服务器(非阻塞I / O)在处理相同阈值的连接时没有相同的问题。
感谢您的帮助。我将转向其他基于erlang的Web服务器,如Mochiweb。