【问题标题】:Erlang TCP sockets get closedErlang TCP 套接字关闭
【发布时间】:2015-12-07 07:39:15
【问题描述】:

为了学习 Erlang,我正在尝试实现一个基于 gen_tcp 的小型 Web 服务器。不幸的是,我的代码似乎触发了一些有线行为。为了演示这个问题,我附上了我的实现的最小化版本,它足以重现问题。不管 HTTP 请求是什么,它只是传递一个静态的 200 OK。

当我尝试对我的 Web 服务器(使用环回接口)运行 ab(Apache HTTP 服务器基准测试)时,问题就出现了。没有任何并发​​请求 (-c) 一切都运行得很好。但是,如果我使用 -c 8-c 16,对 gen_tcp:accept/1 的调用似乎在某些套接字上失败,因为我在 shell 中看到许多 request: closed 行。

让整个故事更奇怪的是,我在不同的操作系统上看到了不同的行为:

  • OS X+Erlang/OTP 18:ab 在启动后几乎立即报告“对等方重置连接”。
  • Debian+Erlang R15B01:除了两个 HTTP 请求之外的所有请求似乎都通过了。但是,当我使用-n 5000 运行ab 时,ab 挂起几秒钟并报告“指定的超时已过期,总共完成了 4998 个请求”。同样,当我运行 15000 次测试时报告 14998。

This one 似乎不是问题所在。老实说,我很迷茫,因此感谢任何帮助! :) 谢谢!

server(Port) ->
    Opt = [list, {active, false}, {reuseaddr, true}],
    case gen_tcp:listen(Port, Opt) of
        {ok, Listen} ->
            handler(Listen),
            gen_tcp:close(Listen),
            ok;
        {error, Error} ->
            io:format("init: ~w~n", [Error])
    end.

handler(Listen) ->
    case gen_tcp:accept(Listen) of
        {ok, Client} ->
            request(Client),
            handler(Listen);
        {error, Error} ->
            io:format("request: ~w~n", [Error])
    end.

request(Client) ->
    Recv = gen_tcp:recv(Client, 0),
    case Recv of
        {ok, _} ->
            Response = reply(),
            gen_tcp:send(Client, Response);
        {error, Error} ->
            io:format("request: ~w~n", [Error])
    end,
    gen_tcp:close(Client).


reply() ->
    "HTTP/1.0 200 OK\r\n" ++
    "Content-Length: 7\r\n\r\n"
    "static\n".

【问题讨论】:

  • 如果可以,请在其他平台上尝试此操作,例如 Linux。我过去发现 OS X 上的 ab 已经严重损坏了。我用ab -c 100 -n 5000 http://localhost:...在Linux上运行了你的代码,它运行得很好。
  • @SteveVinoski:感谢您的评论。我尝试了全新的 Ubuntu 安装。你是对的,它在那里工作得更稳定。通过下面给出的修复,它在 OS X 上也能流畅运行。

标签: erlang gen-tcp


【解决方案1】:

当您增加使用ab -c N 发送的并发请求数时,它将立即打开多个到服务器的 TCP 套接字。

默认情况下,使用 gen_tcp:listen/2 打开的套接字仅支持五个未完成的连接请求。使用 gen_tcp:listen/2 的 {backlog, N} 选项增加未完成的连接请求数。

我在 OS X 上使用 ab 测试了您的代码,发现这解决了“对等连接重置”的问题。

【讨论】:

  • 谢谢!在 N -c 256 ?就我而言,即使我设置ulimit -n 2048,使用+Q 2048 启动erlang 并积压2048 个端口,似乎也存在问题。
猜你喜欢
  • 2015-09-04
  • 2023-04-07
  • 2011-01-26
  • 2018-06-24
  • 2012-02-10
  • 2011-08-08
  • 2013-04-29
  • 2011-08-07
  • 2015-10-16
相关资源
最近更新 更多