红豆杉 - socket_closed_remotely

Yaws - socket_closed_remotely

大家好 Erlangers :)

这里只是另一位 Erlang 爱好者。我有一个非常简单的 YAWS 应用程序模块,在单个客户端访问时可以正常工作。但是,当我尝试生成多个并发客户端时,其中一些客户端开始收到错误(即使这些客户端的数量非常少,比如 10 个)。知道是什么原因造成的吗?

说明代码:

应用模块

out(Arg) ->
  io:format("got something!\n"),
  Method = extract_method(Arg),
  handle(Method, Arg).

客户端

client(SenderPID) ->
case httpc:request(
  put,
  {
    "http://localhost:8080/storageunit",
    [],
    "application/x-www-form-urlencoded",
    ""
  }, [], []) of
    { error, Reason } -> io:format("Server responded with an error: ~p.\n", [Reason]);
    { ok, _ } -> ok
  end,
  SenderPID ! 'FINISHED'.

client_spawner(_SenderPID, 0) -> io:format("Done.\n");
client_spawner(SenderPID, Times) ->
  spawn(concurrent, client, [SenderPID]),
  client_spawner(SenderPID, Times - 1).

我遇到的错误:

Server responded with an error: socket_closed_remotely.

最后一条信息是:

我认为我的处理代码导致了它,但在客户端收到 httpc 错误的情况下,服务器甚至没有对 "got something!" 做出反应。

我确定我遗漏了一些微不足道的东西,你能帮忙吗?

此致, 彼得

我的初始代码肯定有问题。我从头开始重写了模块,它给了我预期的结果。这是代码:

-module(annoying_client).
-export([annoy/0, client/1, client_spawner/2]).

client(SenderPID) ->
  case httpc:request("http://www.google.com") of
    { error, Reason } -> io:format("Error. Reason: ~p\n", [Reason]);
    { ok, _ } -> io:format("ok\n")
  end,
  SenderPID ! 'FINISHED'.

client_spawner(_SenderPID, 0) -> io:format("Done.\n");
client_spawner(SenderPID, Times) ->
  spawn(?MODULE, client, [SenderPID]),
  client_spawner(SenderPID, Times - 1).

annoy() ->
  inets:start(),

  spawn(?MODULE, client_spawner, [self(), 100]),
  wait_for_all_jobs(1),

  inets:stop(),
  init:stop().

wait_for_all_jobs(NumberOfFinishedJobs) ->
  receive 'FINISHED' ->
    if
      NumberOfFinishedJobs < 100 ->
        wait_for_all_jobs(NumberOfFinishedJobs + 1);
      true ->
        io:format("All jobs finished.\n")
    end
  end.

它与两者都非常有效:

  • google
  • 本地香草雅司病

GET 和 PUT。当我超过 2000 个并发请求的阈值时,问题就开始了,但我猜从本地和远程获得的数字来看这是可以预料的。在 2000 个请求的情况下,我大致得到:

  • 请求时出现 6 个错误 google.com
  • 请求本地偏航时出现 500 次错误

我遇到的错误:

Error. Reason: socket_closed_remotely

Error. Reason: {failed_connect,[{to_address,{"www.google.com",80}}, {inet,[inet],system_limit}]}

DoS 防护?配置不正确?不管怎样,我对我现在的成绩很满意。可能会尝试使用其他 Erlang Web 服务器来获得一些性能数据。

谢谢大家