2011-11-18 38 views
4

我一直在玩玩具网络服务器,我把它放在沉重的负载下。我发现它表现非常好,除了少数几个异常值。下面是相关的代码: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,如果有帮助。

回答

3

{backlog,integer()}在您的中设置合理的数值?TCP_OPTS?默认为5,如果积压清理不够快,最终可能会丢失连接。

+0

这样做了,谢谢! –