我一直在玩玩具网络服务器,我把它放在沉重的负载下。我发现它表现非常好,除了少数几个异常值。下面是相关的代码:Erlang:接受连接时出现奇怪的延迟
init() ->
%Gets the listen socket ({active,false}), generates acceptor threads
case gen_tcp:listen(?LISTEN_PORT, ?TCP_OPTS) of
{ok, Listen} ->
?MODULE:gen_accepts(50,Listen)
end,
?MODULE:supervisor_loop(Listen).
supervisor_loop(LS) ->
receive
_ -> ok
after 60000 -> ok
end,
?MODULE:supervisor_loop(LS).
gen_accepts(0,_) -> ok;
gen_accepts(I,LS) ->
spawn(?MODULE,accept_loop,[LS]),
?MODULE:gen_accepts(I-1,LS).
accept_loop(Listen) ->
case gen_tcp:accept(Listen) of
{ok, Sock} ->
spawn(?MODULE,accept_loop,[Listen]),
?MODULE:process_sock(Sock);
{error,_} -> ?MODULE:accept_loop(Listen)
end.
眼下所有模块:process_sock(袜子)的作用是发送一些文字和关闭连接,没有任何IO或任何东西。当我在其上运行的Apache基准(AB),然而,约1 5倍我得到的结果是这样的:
Percentage of the requests served within a certain time (ms)
50% 3
66% 3
75% 4
80% 4
90% 271
95% 271
98% 271
99% 271
100% 271 (longest request)
这是用20条总的要求,用20并发级别所以基本上我做了20请求一次。正如你所看到的,大多数请求在很短的时间内完成,但是有一两个需要很长时间。当我加载时,最长的请求可以达到3秒,我见过的最高请求是9!
我做了一些调试,发现问题出在接受代码中。我计算了从process_sock开始到结束花费多少时间,并发现它从不变化,但是当我将定时器的启动移至gen_tcp之前:accept时,可以看到时间差异。出于某种原因接受不接受。我尝试增加最初生成的接受者数量,并尝试使用不同的设计模式来产生process_sock工作者,但没有任何变化。我应该注意到,现在我开始接受50个接受者,但在上面的ab输出中,只有20个请求,所以我不认为工人数量是答案。
我正在运行erlang R14B04,如果有帮助。
这样做了,谢谢! –