1

プロセス数の増加に伴って何かを実行するのにかかる時間を測定することにより、データベースのパフォーマンスを測定したいと思います。目的は、パフォーマンスとプロセス数のグラフをプロットすることです。誰かがどのように考えているのでしょうか。私はelrlangの初心者です。

4

3 に答える 3

5

データベースが であると仮定するとmnesia、これは難しいことではありません。1 つの方法は、書き込み機能と読み取り機能を持つことです。ただし、記憶喪失症のものがいくつかあることに注意してActivity access contextsください。をテストwrite timesするには、 のコンテキストを使用しないでくださいtransaction。これは、ディスクへの書き込みが発生する前であっても、呼び出しプロセスにすぐに戻るためです。ただし、ディスクの書き込みについては、次のコンテキストを確認することが重要ですsync_transaction。次に例を示します。

書き込み(記録)->
    Fun = fun(R)-> mnesia:write(R) end,
    mnesia:activity(sync_transaction,Fun,[記録],mnesia_frag).

上記の関数は、mnesia テーブルのすべてのアクティブなレプリカがレコードをデータ ディスク ファイルにコミットした場合にのみ返されます。したがって、プロセスの増加に伴う速度をテストするには、 a record generator、 a a process spawnerwrite functionおよび最後に aが必要timing mechanismです。タイミングのために、次の組み込み関数があります。timer:tc/1, timer:tc/2 and timer:tc/3これは、特定の関数を (完全に) 実行するのにかかった正確な時間を返します。話を短くするために、これは私がこれを行う方法です:

-module(stress_test)。
-compile(export_all)。
-define(LIMIT,10000)。
-記録簿、{ イズブン、 題名、 価格、 バージョン})。
%% このテーブルが {type,bag} であることを確認してください
-record(write_time,{ イズブン、 num_of_processes, 書き込み時間 })。
%% テーブル (ブック) が既に存在すると仮定 %% mnesia が既に実行されていると仮定
開始()-> ensure_gproc()、 テレビ:開始()、 spawn_many(?LIMIT)。
spawn_many(0)-> OK; spawn_many(N)-> spawn(?MODULE,プロセス,[]), spawn_many(N - 1)。
プロセス()-> gproc:reg({n, l,guid()},ignored), timer:apply_interval(timer:seconds(2),?MODULE,write,[]), 受け取る <<"停止">> -> 終了(通常) 終わり。
total_processes()-> proplists:get_value(size,ets:info(gproc)) div 3.
ensure_gproc()-> ケースリスト:keymember(gproc,1,application:which_applications()) of true -> OK; false -> アプリケーション: 開始 (gproc) 終わり。
ガイド()-> ランダム:シード(今())、 MD5 = erlang:md5(term_to_binary([random:uniform(152629977),{node(), now(), make_ref()}])), MD5List = リスト:nthtail(3, binary_to_list(MD5)), F = fun(N) -> f("~2.16.0B", [N]) 終わり、 L = [F(N) || N <- MD5List]、 リスト:フラット化(L)。
generate_record()-> #book{isbn = guid(),タイトル = guid(),価格 = guid()}.
書き込み()-> レコード = generate_record(), Fun = fun(R)-> ok = mnesia:write(R),ok end, %% これが実際の書き込みです。 {Time,ok} = timer:tc(mnesia,activity,[sync_transaction,Fun,[Record],mnesia_frag]), %% その時間、プロセスの数を節約します その瞬間 %% NoteTime = #write_time{ isbn = レコード#book.isbn, num_of_processes = total_processes(), write_time = 時間 }、 mnesia:activity(transaction,Fun,[NoteTime],mnesia_frag).

ここには特に依存関係があります: gprocをダウンロードして、ここから erlang lib パスにビルドしますDownload Gproc

これを実行するには、次のように呼び出します。stress_test:start(). この表write_timeは、書き込みにかかった時間に対するプロセス数のグラフを描くのに役立ちます。プロセス数が 0 から上限 ( ?LIMIT) まで増加するにつれて、特定の瞬間に特定のレコードを書き込むのにかかった時間と、その時点でのプロセス数も記録されます。


アップデート
f(S)-> f(S,[])。
f(S,Args) -> list:flatten(io_lib:format(S, Args))。
それが不足している機能です。申し訳ありません....アプリケーションを使用して
表を調べることを忘れないでください。記憶喪失表を調べることができるウィンドウが開きます。この表を使用して、プロセス数の増加に伴う書き込み時間の増加/パフォーマンスの低下を確認します。私が省略した要素は、重要なパラメーターである可能性がある書き込みアクションの実際の時間を記録することです。テーブルのテーブル定義に追加できます。write_timetv

time()write_time

于 2012-03-22T06:16:54.007 に答える
2

http://wiki.basho.com/Benchmarking.htmlもご覧ください。

于 2012-03-22T04:45:57.787 に答える
1

tsung http://tsung.erlang-projects.org/を見るかもしれません

于 2012-03-21T23:17:42.933 に答える