[英]YAWS responds with errors under light load. “Unhandled reply fr. do_recv() {error,econnaborted}”
你好愛蘭格人:)
只是另一位Erlang發燒友在這里使用該語言。 我有一個非常簡單的YAWS應用程序模塊,當由單個客戶端訪問時,該模塊可以正常工作。 但是,如果我嘗試跨越多個客戶端以模擬輕量流量,則這些客戶端開始接收錯誤。 知道是什么原因引起的嗎?
代碼生成客戶端:
-module(concurrent).
-export([measure/0, get/0]).
get() ->
Result = httpc:request("http://localhost:8080/blah"),
io:format("Result: ~p.\n", [Result]).
get_spawner(0) -> io:format("Done.\n");
get_spawner(Times) ->
spawn(concurrent, get, []),
get_spawner(Times - 1).
measure() ->
io:fwrite("Starting inets...\n"),
inets:start(),
io:fwrite("Done\n"),
io:fwrite("Creating blah...\n"),
httpc:request(put, { "http://localhost:8080/blah", [], "", "" }, [], []),
io:fwrite("Done\n"),
get_spawner(9),
io:fwrite("Stopping inets...\n"),
inets:stop(),
io:fwrite("Done\n"),
init:stop().
我觀察到,這對於8個並發客戶端來說一切正常,但是當我跨越9個或更多客戶端時,它們開始從服務器接收以下消息:
=ERROR REPORT==== 24-Jan-2017::12:30:04 ===
** Generic server httpc_manager terminating
** Last message in was {request,
{request,undefined,<0.74.0>,0,http,
{"localhost",8080},
"/blah",[],get,
{http_request_h,undefined,"keep-alive",
undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,"localhost:8080",
undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,[],undefined,undefined,undefined,
undefined,"0",undefined,undefined,
undefined,undefined,undefined,undefined,[]},
{[],[]},
{http_options,"HTTP/1.1",infinity,true,
{essl,[]},
undefined,false,infinity,false},
"http://localhost:8080/blah",[],none,[],
1485261004189,undefined,undefined,false}}
** When Server state == {state,[],httpc_manager__handler_db,
{cookie_db,undefined,8209},
httpc_manager__session_db,httpc_manager,
{options,
{undefined,[]},
{undefined,[]},
0,2,5,120000,2,disabled,false,inet,default,
default,[]}}
** Reason for termination ==
** {'EXIT',
{shutdown,
{gen_server,call,
[httpc_handler_sup,
{start_child,
[<0.61.0>,
{request,#Ref<0.0.6.64>,<0.74.0>,0,http,
{"localhost",8080},
"/blah",[],get,
{http_request_h,undefined,"keep-alive",undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,"localhost:8080",undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,undefined,[],undefined,
undefined,undefined,undefined,"0",undefined,
undefined,undefined,undefined,undefined,
undefined,[]},
{[],[]},
{http_options,"HTTP/1.1",infinity,true,
{essl,[]},
undefined,false,infinity,false},
"http://localhost:8080/blah",[],none,[],
1485261004189,undefined,undefined,false},
{options,
{undefined,[]},
{undefined,[]},
0,2,5,120000,2,disabled,false,inet,default,default,
[]},
httpc_manager]},
infinity]}}}
=ERROR REPORT==== 24-Jan-2017::12:30:04 ===
Error in process <0.74.0> with exit value:
{{case_clause,
{undefined,
{error,
{'EXIT',
{shutdown,
{gen_server,call,
[httpc_handler_sup,
{start_child,
[<0.61.0>,
{request,#Ref<0.0.6.64>,<0.74.0>,0,http,
{"localhost",8080},
"/blah",[],get,
{http_request_h,undefined,"keep-alive",
undefined,undefined,undefined,
undefined,undefined,undefined,
undefined,undefined,undefined,
undefined,undefined,undefined,
undefined,undefined,"localhost:8080",
undefined,undefined,undefined,
undefined,undefined,undefined,
undefined,undefined,undefined,[],
undefined,undefined,undefined,
undefined,"0",undefined,undefined,
undefined,undefined,undefined,
undefined,[]},
{[],[]},
{http_options,"HTTP/1.1",infinity,true,
{essl,[]},
undefined,false,infinity,false},
"http://localhost:8080/blah",[],none,[],
1485261004189,undefined,undefined,false},
{options,
{undefined,[]},
{undefined,[]},
0,2,5,120000,2,disabled,false,inet,default,
default,[]},
httpc_manager]},
infinity]}}}}}},
[{httpc,handle_request,9,[{file,"httpc.erl"},{line,574}]},
{concurrent,get,0,
[{file,
"c:/Users/piotr_justyna/Documents/rets/performance_tests/concurrent.erl"},
{line,5}]}]}
在服務器端,我得到這個:
=ERROR REPORT==== 24-Jan-2017::12:28:55 ===
Unhandled reply fr. do_recv() {error,econnaborted}
我敢肯定這很簡單,只是無法弄清楚它是什么。 是引起並發連接的數量嗎? 您能幫忙進一步說明一下嗎?
問候,皮奧特
您的代碼產生了許多httpc:request/1
調用,但是隨后它立即停止了inets
:
...
get_spawner(9),
io:fwrite("Stopping inets...\n"),
inets:stop(),
...
由於inets
已關閉,因此仍在處理中的請求將過早關閉,如錯誤報告中所示:
** Reason for termination ==
** {'EXIT',
{shutdown,
{gen_server,call,
[httpc_handler_sup,
您需要讓所有產生的請求的父級在調用inets:stop/0
之前等待這些請求完成。 一種方法是將父pid傳遞給每個生成的子,一旦httpc:request/1
返回,則讓該子向父發送一條消息。 父級將生成所有N
inets:stop/0
,然后坐在一個循環中,等待從子級接收N
完成消息,只有在收到所有完成消息后,它才會調用inets:stop/0
。
它對8個請求有效,但對9個無效的原因是由於爭用條件導致在調用inets:stop/0
之前沒有等待。 請求處理接受器進程的Yaws池的默認大小恰好是8。當您的代碼發送8個請求時,該池將對其進行足夠快的處理,以勝過您的代碼對inets:stop/0
的調用,但是延遲9會稍微延遲因為一個接受者可以處理兩個請求,並且時間上的微小變化足以讓您的inets:stop/0
調用破壞您的一個或多個客戶端進程。 您可以通過acceptor_pool_size
配置變量來修改Yaws接受者池的大小。
如果您對負載測試很認真,則可以考慮使用像tsung這樣的行業實力解決方案,而不是自己動手做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.