2012-03-21 53 views
1

我想通过测量进程数量增加时所需的时间来衡量性能。目的是绘制一个性能与进程数之后的图,任何人都有一个想法是如何的?我在elrlang初学者请HELO生成许多进程erlang

回答

5

假设你的数据库是mnesia,这应该不难。一种方法是具有写入功能和读取功能。但是,请注意有几个Activity access contexts与mnesia。若要测试write times,则不应使用transaction的上下文,因为即使在发生光盘写入之前,它也会立即返回调用进程。但是,对于光盘写入,重要的是您可以查看名为sync_transaction的上下文。这里有一个例子:

 
write(Record)-> 
    Fun = fun(R)-> mnesia:write(R) end, 
    mnesia:activity(sync_transaction,Fun,[Record],mnesia_frag). 

以上函数将返回只有当Mnesia的表的所有活动副本犯了记录到数据光盘文件。因此,测试速度提高的过程,你需要有一个record generator,一个a process spawner,则write function终于timing mechanism。对于计时,我们有一个内置函数,称为:timer:tc/1, timer:tc/2 and timer:tc/3它返回执行(完全)给定函数所花费的确切时间。为了削减长话短说,这是我怎么会做这样的:

 
-module(stress_test). 
-compile(export_all).
-define(LIMIT,10000).
-record(book,{ isbn, title, price, version}).
%% ensure this table is {type,bag}
-record(write_time,{ isbn, num_of_processes, write_time }).
%% Assuming table (book) already exists %% Assuming mnesia running already
start()-> ensure_gproc(), tv:start(), spawn_many(?LIMIT).
spawn_many(0)-> ok; spawn_many(N)-> spawn(?MODULE,process,[]), spawn_many(N - 1).
process()-> gproc:reg({n, l,guid()},ignored), timer:apply_interval(timer:seconds(2),?MODULE,write,[]), receive <<"stop">> -> exit(normal) end.
total_processes()-> proplists:get_value(size,ets:info(gproc)) div 3.
ensure_gproc()-> case lists:keymember(gproc,1,application:which_applications()) of true -> ok; false -> application:start(gproc) end.
guid()-> random:seed(now()), MD5 = erlang:md5(term_to_binary([random:uniform(152629977),{node(), now(), make_ref()}])), MD5List = lists:nthtail(3, binary_to_list(MD5)), F = fun(N) -> f("~2.16.0B", [N]) end, L = [F(N) || N <- MD5List], lists:flatten(L).
generate_record()-> #book{isbn = guid(),title = guid(),price = guid()}.
write()-> Record = generate_record(), Fun = fun(R)-> ok = mnesia:write(R),ok end, %% Here is now the actual write we measure {Time,ok} = timer:tc(mnesia,activity,[sync_transaction,Fun,[Record],mnesia_frag]), %% The we save that time, the number of processes %% at that instant NoteTime = #write_time{ isbn = Record#book.isbn, num_of_processes = total_processes(), write_time = Time }, mnesia:activity(transaction,Fun,[NoteTime],mnesia_frag).

现在这里还有依赖性,尤其是:gproc下载,并将其建设成为你的二郎山库路径从这里Download Gproc

要运行此操作,只需调用:stress_test:start().write_time将帮助您绘制一个进程数量与写入时间的关系图。随着进程数量从0增加到上限(?LIMIT),我们注意到在给定时刻写入给定记录所用的时间,同时我们还记录了当时的进程数量。


UPDATE
 
f(S)-> f(S,[]). 
f(S,Args) -> lists:flatten(io_lib:format(S, Args)). 
这是缺少的功能。道歉...
记得研究表 write_time,使用应用程序 tv,打开一个窗口,您可以在其中检查mnesia表。随着进程数不断增加,使用此表可以看到写入次数增加/或性能下降。

我遗漏的一个元素是使用 time()来记录写操作的实际时间,这可能是重要的参数。您可以将其添加到 write_time表的表定义中。

+1

好的,谢谢你的回应,我会研究代码,看看我能管理,会后反馈 – Onty 2012-03-22 08:24:41

+1

GUID() - > 随机:种子(NOW()), MD5 =二郎:MD5(term_to_binary ([random:uniform(152629977)),{node(),now(),make_ref()}])), MD5List = lists:nthtail(3,binary_to_list(MD5)), F = fun(N) f(“〜2.16.0B”,[N])结束, L = [F(N)|| N <-MD5List], 列出:变平(L)。 我不断收到有关函数f/2未定义的错误,它的这一行F = fun(N) - > f(“〜2.16.0B”,[N])结束,它始终抱怨说它的未定义,请帮助。不知何故,我可以导出功能f/2 – Onty 2012-03-22 10:31:34

+0

检查更新,对不起! – 2012-03-22 11:11:48