9

erlang TCP/IP 库是否有一些限制?我做了一些搜索,但找不到任何明确的答案。

我已将 ERL_MAX_PORTS 环境变量设置为 12000 并将 Yaws 配置为使用无限连接。

我编写了一个简单的客户端应用程序,它连接到我为 Yaws 编写的 appmod,并且正在通过同时启动 X 个客户端来测试同时连接的数量。

我发现当我到达大约 100 个客户端时,Yaws 服务器停止接受更多 TCP 连接并且客户端错误

进程出错,退出值:{{badmatch,{error,socket_closed_remotely}}

我知道同时打开的连接数必须有限制,但 100 似乎真的很低。我查看了所有的 yaws 文档并删除了对连接的任何限制。

这是在运行 Snow Leopard 的 2.16Ghz Intel Core 2 Duo iMac 上。

在 Vista 机器上的快速测试表明,我在大约 300 个连接时遇到了同样的问题。

我的测试不合理吗?即同时打开 100 多个连接来测试 Yaws 的并发性是不是很傻?

谢谢。

4

3 回答 3

6

您似乎遇到了系统限制,请尝试使用增加打开文件的最大数量

$ ulimit -n 500

Snow Leopard上的Python,如何打开> 255个套接字?

Erlang 本身有 1024 的限制:

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

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

编辑:

系统调用listen() 有一个参数backlog,它决定了可以排队多少个请求,请检查请求建立连接之间的延迟是否有帮助。这可能是你的问题。

于 2010-01-24T10:27:14.893 回答
3

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

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

开放端口部分读取:

同时打开的 Erlang 端口的最大数量默认为 1024。此限制在启动时最多可以提高到 268435456(请参阅 erlang(3) 中的环境变量 ERL_MAX_PORTS) 268435456 打开端口的最大限制将至少在 32-由于内存不足,无法达到位架构。

于 2010-01-28T10:35:41.617 回答
0

在尝试了每个人的建议并搜索了 Erlang 文档之后,我得出的结论是,我的问题在于 Yaws 无法跟上负载。

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

感谢你的帮助。我将继续使用其他基于 erlang 的 Web 服务器,例如 Mochiweb。

于 2010-02-08T22:20:03.080 回答