我想通过衡量随着进程数量的增加而做某事所花费的时间来衡量我的数据库的性能。目的是绘制性能与进程数量的关系图,有人知道怎么做吗?我是elrlang的初学者请helo
3 回答
假设您的数据库是mnesia
,这应该不难。一种方法是具有写入功能和读取功能。但是,请注意,有几个Activity access contexts
与 mnesia 相关。要进行测试write times
,您不应该使用 的上下文,transaction
因为它会立即返回到调用进程,即使在磁盘写入发生之前也是如此。但是,对于磁盘写入,重要的是查看名为: 的上下文sync_transaction
。这是一个例子:
写(记录)-> Fun = fun(R)-> mnesia:write(R) end, mnesia:activity(sync_transaction,Fun,[Record],mnesia_frag)。
只有当 mnesia 表的所有活动副本都已将记录提交到数据磁盘文件时,上述函数才会返回。因此,要随着进程的增加测试速度,您需要有 a record generator
、a a process spawner
、 thewrite function
和最后 a timing mechanism
。对于计时,我们有一个名为:的内置函数timer:tc/1, timer:tc/2 and timer:tc/3
,它返回执行(完全)给定函数所花费的确切时间。简而言之,这就是我将如何做到这一点:
-模块(压力测试)。 -编译(export_all)。
-定义(限制,10000)。
-记录本,{ 伊斯本, 标题, 价格, 版本})。
%% 确保这个表是 {type,bag}
-记录(写时间,{ 伊斯本, 进程数, 写时间 })。
%% 假设表(书)已经存在 %% 假设 mnesia 已经运行
开始()-> 确保_gproc(), 电视:开始(), spawn_many(?LIMIT)。
spawn_many(0)-> 好的; spawn_many(N)-> 产卵(?模块,进程,[]), spawn_many(N - 1)。
进程()-> gproc:reg({n, l,guid()},忽略), timer:apply_interval(timer:seconds(2),?MODULE,write,[]), 收到 <<“停止”>> -> 退出(正常) 结尾。
total_processes()-> proplists:get_value(size,ets:info(gproc)) div 3.
确保_gproc()-> 案例列表:keymember(gproc,1,application:which_applications()) of 真->好; 假 -> 应用程序:开始(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)。
生成记录()-> #book{isbn = guid(),title = guid(),price = 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 = Record#book.isbn, num_of_processes = total_processes(), write_time = 时间 }, mnesia:activity(transaction,Fun,[NoteTime],mnesia_frag)。
现在这里有依赖项,特别是:gproc下载并将其构建到您的 erlang lib 路径中,从这里下载 Gproc。
要运行它,只需调用:stress_test:start().
该表write_time
将帮助您绘制进程数与写入时间的关系图。?LIMIT
随着进程数从 0 增加到上限(
更新
f(S)-> f(S,[])。 f(S,Args) -> 列表:flatten(io_lib:format(S,Args))。那就是缺少的功能。抱歉....
记得研究表格
write_time
,使用应用程序tv
,打开一个窗口,您可以在其中检查记忆表。使用此表可以查看随着进程数量不时增加而增加的写入时间/或降低的性能。我遗漏的一个元素是注意写入操作的实际时间,
time()
这可能是重要的参数。您可以将其添加到表的表定义中write_time
。
你可以看看tsung http://tsung.erlang-projects.org/