2011-11-18 72 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

這樣做了,謝謝! –