我想通过测量进程数量增加时所需的时间来衡量性能。目的是绘制一个性能与进程数之后的图,任何人都有一个想法是如何的?我在elrlang初学者请HELO生成许多进程erlang
1
A
回答
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
2
相关问题
- 1. Erlang生成随机二进制
- 2. Erlang和进程
- 3. 许多Postgres.exe进程
- 4. Erlang完成或终止进程
- 5. Eclipse生成许多JFormattedTextField
- 6. Erlang:在一个主管下产生多个进程
- 7. 从父进程派生/产生许多node.js进程的最高性能方式
- 8. 倾听进程Erlang
- 9. 许多WMQ amqrmppa进程
- 10. Java进程生成器生成命令
- 11. 使用来自Java的进程生成器产生多个进程
- 12. 停止Erlang守护进程
- 13. Erlang进程事件错误
- 14. Erlang进程发送消息
- 15. Erlang进程卡住了
- 16. erl_nif_thread和erlang进程通信
- 17. 在Erlang中断进程
- 18. Erlang gen_server进程超时
- 19. 在Erlang货币编程中运行的多进程程序
- 20. Graphite&statsd生成许多节点
- 21. 如何为许多标题生成.pch?
- 22. SignInManager.PasswordSignInAsync生成许多数据库访问
- 23. Java:生成许多类副本
- 24. JPA许多方面的密钥生成
- 25. Python多处理。与许多进程池
- 26. 斯卡拉进程生成
- 27. Fortran中的生成进程
- 28. Erlang - 将每个“erlang进程”映射到新的内核线程
- 29. Erlang数据库模式生成器
- 30. 用Erlang生成一个RSA密钥对?
好的,谢谢你的回应,我会研究代码,看看我能管理,会后反馈 – Onty 2012-03-22 08:24:41
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
检查更新,对不起! – 2012-03-22 11:11:48