Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

77 Zeilen
2.5 KiB

  1. -module(ibrowse_load_test).
  2. -export([go/3]).
  3. -define(counters, ibrowse_load_test_counters).
  4. go(URL, N_workers, N_reqs) ->
  5. spawn(fun() ->
  6. go_1(URL, N_workers, N_reqs)
  7. end).
  8. go_1(URL, N_workers, N_reqs) ->
  9. ets:new(?counters, [named_table, public]),
  10. try
  11. ets:insert(?counters, [{success, 0},
  12. {failed, 0},
  13. {timeout, 0},
  14. {retry_later, 0}]),
  15. Start_time = now(),
  16. Pids = spawn_workers(N_workers, N_reqs, URL, self(), []),
  17. wait_for_pids(Pids),
  18. End_time = now(),
  19. Time_taken = trunc(round(timer:now_diff(End_time, Start_time) / 1000000)),
  20. [{_, Success_reqs}] = ets:lookup(?counters, success),
  21. Total_reqs = N_workers*N_reqs,
  22. Req_rate = case Time_taken > 0 of
  23. true ->
  24. trunc(Success_reqs / Time_taken);
  25. false when Success_reqs == Total_reqs ->
  26. withabix;
  27. false ->
  28. without_a_bix
  29. end,
  30. io:format("Stats : ~p~n", [ets:tab2list(?counters)]),
  31. io:format("Total reqs : ~p~n", [Total_reqs]),
  32. io:format("Time taken : ~p seconds~n", [Time_taken]),
  33. io:format("Reqs / sec : ~p~n", [Req_rate])
  34. catch Class:Reason ->
  35. io:format("Load test crashed. Reason: ~p~n"
  36. "Stacktrace : ~p~n",
  37. [{Class, Reason}, erlang:get_stacktrace()])
  38. after
  39. ets:delete(?counters)
  40. end.
  41. spawn_workers(0, _, _, _, Acc) ->
  42. Acc;
  43. spawn_workers(N_workers, N_reqs, URL, Parent, Acc) ->
  44. Pid = spawn(fun() ->
  45. worker(N_reqs, URL, Parent)
  46. end),
  47. spawn_workers(N_workers - 1, N_reqs, URL, Parent, [Pid | Acc]).
  48. wait_for_pids([Pid | T]) ->
  49. receive
  50. {done, Pid} ->
  51. wait_for_pids(T);
  52. {done, Some_pid} ->
  53. wait_for_pids([Pid | (T -- [Some_pid])])
  54. end;
  55. wait_for_pids([]) ->
  56. ok.
  57. worker(0, _, Parent) ->
  58. Parent ! {done, self()};
  59. worker(N, URL, Parent) ->
  60. case ibrowse:send_req(URL, [], get) of
  61. {ok, "200", _, _} ->
  62. ets:update_counter(?counters, success, 1);
  63. {error, req_timedout} ->
  64. ets:update_counter(?counters, timeout, 1);
  65. {error, retry_later} ->
  66. ets:update_counter(?counters, retry_later, 1);
  67. _ ->
  68. ets:update_counter(?counters, failed, 1)
  69. end,
  70. worker(N - 1, URL, Parent).