红豆杉 - 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.
最后一条信息是:
- 10 个并发客户端 - 平均有 2 到 5 个错误
- 100-100000 个并发客户端 - 平均 50% 的错误
我认为我的处理代码导致了它,但在客户端收到 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 服务器来获得一些性能数据。
谢谢大家
大家好 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.
最后一条信息是:
- 10 个并发客户端 - 平均有 2 到 5 个错误
- 100-100000 个并发客户端 - 平均 50% 的错误
我认为我的处理代码导致了它,但在客户端收到 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.
它与两者都非常有效:
- 本地香草雅司病
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 服务器来获得一些性能数据。
谢谢大家