Concurrency Yaws-远程关闭插座

Concurrency Yaws-远程关闭插座,concurrency,erlang,yaws,Concurrency,Erlang,Yaws,你好,埃尔兰格斯的同胞们:) 这只是另一个玩Erlang语言的爱好者。我有一个非常简单的YAWS应用程序模块,当被单个客户端访问时,它可以正常工作。但是,当我尝试生成多个并发客户机时,其中一些客户机开始接收错误(即使这些客户机的数量非常少,比如10个)。知道是什么引起的吗 说明代码: 应用程序模块 out(Arg) -> io:format("got something!\n"), Method = extract_method(Arg), handle(Method, Arg

你好,埃尔兰格斯的同胞们:)

这只是另一个玩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).
我得到的错误是:

Error. Reason: socket_closed_remotely
服务器响应错误:套接字\u远程关闭

最后一条信息是:

  • 10个并发客户端-平均有2到5个错误
  • 100-100000个并发客户端-平均错误率为50%
我认为是我的处理代码造成的,但在客户端收到httpc错误的情况下,服务器甚至不会做出“got something!”的反应

我肯定我错过了一些小事,你能帮我吗

问候,,
Piotr

我的初始代码一定有问题。我从头重写了模块,它给了我预期的结果。代码如下:

-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.

DoS保护?配置不正确?不管怎样,我对我目前的成绩很满意。可能会使用其他ErlangWeb服务器进行试验,以获得一些性能数据


谢谢大家。

如果没有更多关于
handle/2
在服务器端所做工作的详细信息,很难回答这个问题。我建议检查Yaws日志,看看是否有任何相关信息。另外,确保您的Yaws-listen backlog设置得足够高,以满足您的需要,并确保客户端和服务器的文件描述符的最大数量都设置得适当。谢谢。看,问题是handle/2甚至没有被调用。我在github上的某个地方(某些回购协议中的一些旧问题)读到,这可能是由iNet使用的配置文件引起的。我打算再探讨一下。是的,刚刚确认。即使我完全排除了handle/2,我还是遇到了同样的问题。Yaws到底收到了什么,还是这只是一个客户端问题?看起来像是客户端问题。雅斯一点也没有得到。
Error. Reason: {failed_connect,[{to_address,{"www.google.com",80}}, {inet,[inet],system_limit}]}