我一直在玩玩具網絡服務器,我把它放在沉重的負載下。我發現它表現非常好,除了少數幾個異常值。下面是相關的代碼: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,如果有幫助。
這樣做了,謝謝! –