You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

77 regels
2.5 KiB

-module(ibrowse_load_test).
-export([go/3]).
-define(counters, ibrowse_load_test_counters).
go(URL, N_workers, N_reqs) ->
spawn(fun() ->
go_1(URL, N_workers, N_reqs)
end).
go_1(URL, N_workers, N_reqs) ->
ets:new(?counters, [named_table, public]),
try
ets:insert(?counters, [{success, 0},
{failed, 0},
{timeout, 0},
{retry_later, 0}]),
Start_time = now(),
Pids = spawn_workers(N_workers, N_reqs, URL, self(), []),
wait_for_pids(Pids),
End_time = now(),
Time_taken = trunc(round(timer:now_diff(End_time, Start_time) / 1000000)),
[{_, Success_reqs}] = ets:lookup(?counters, success),
Total_reqs = N_workers*N_reqs,
Req_rate = case Time_taken > 0 of
true ->
trunc(Success_reqs / Time_taken);
false when Success_reqs == Total_reqs ->
withabix;
false ->
without_a_bix
end,
io:format("Stats : ~p~n", [ets:tab2list(?counters)]),
io:format("Total reqs : ~p~n", [Total_reqs]),
io:format("Time taken : ~p seconds~n", [Time_taken]),
io:format("Reqs / sec : ~p~n", [Req_rate])
catch Class:Reason ->
io:format("Load test crashed. Reason: ~p~n"
"Stacktrace : ~p~n",
[{Class, Reason}, erlang:get_stacktrace()])
after
ets:delete(?counters)
end.
spawn_workers(0, _, _, _, Acc) ->
Acc;
spawn_workers(N_workers, N_reqs, URL, Parent, Acc) ->
Pid = spawn(fun() ->
worker(N_reqs, URL, Parent)
end),
spawn_workers(N_workers - 1, N_reqs, URL, Parent, [Pid | Acc]).
wait_for_pids([Pid | T]) ->
receive
{done, Pid} ->
wait_for_pids(T);
{done, Some_pid} ->
wait_for_pids([Pid | (T -- [Some_pid])])
end;
wait_for_pids([]) ->
ok.
worker(0, _, Parent) ->
Parent ! {done, self()};
worker(N, URL, Parent) ->
case ibrowse:send_req(URL, [], get) of
{ok, "200", _, _} ->
ets:update_counter(?counters, success, 1);
{error, req_timedout} ->
ets:update_counter(?counters, timeout, 1);
{error, retry_later} ->
ets:update_counter(?counters, retry_later, 1);
_ ->
ets:update_counter(?counters, failed, 1)
end,
worker(N - 1, URL, Parent).