【问题标题】:Spawn many processes erlang产生许多进程erlang
【发布时间】:2012-04-06 12:51:30
【问题描述】:

我想通过随着进程数量的增加来衡量做某事所花费的时间来衡量我的数据库的性能。目的是在之后绘制性能与进程数的关系图,有人知道怎么做吗?我是elrlang的初学者请helo

【问题讨论】:

    标签: erlang process mnesia spawn


    【解决方案1】:

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

    写(记录)-> Fun = fun(R)-> mnesia:write(R) end, mnesia:activity(sync_transaction,Fun,[Record],mnesia_frag)。

    只有当 mnesia 表的所有活动副本都将记录提交到数据磁盘文件时,上述函数才会返回。因此,要随着进程的增加测试速度,您需要有一个 record generator、一个 a process spawnerwrite function 和最后一个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 生成记录()-> #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 库路径中 Download Gproc

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


    更新
    f(S)-> f(S,[])。
    f(S,Args) -> 列表:flatten(io_lib:format(S,Args))。
    
    那就是缺少的功能。抱歉....
    记得研究表write_time,使用应用程序tv,打开一个窗口,您可以在其中检查记忆表。使用此表可以查看随着进程数量不时增加而增加的写入时间/或降低的性能。

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

    【讨论】:

    • 好的,谢谢您的回复,我会研究代码,看看我是否可以管理,将发布反馈
    • guid()-> random:seed(now()), 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]) end, L = [F(N) | | N f("~2.16.0B", [N]) 结束,它一直抱怨它未定义,请帮忙。我可以以某种方式导出函数 f/2
    • 该解决方案假定您将创建表write_timebook,在运行压力测试之前启动mnesia 并加载它们。
    • 我一直在尝试运行此代码,但不知何故,我从 proc 中得到了一个错误,我已经下载并解压了它。我已经将它包含在我的代码中,但我可以让它工作,这是唯一给我一个错误的东西,有没有在不使用 proc 的情况下做到这一点?谢谢
    【解决方案2】:
    【解决方案3】:

    你可以看看tsung http://tsung.erlang-projects.org/

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 2015-08-22
      • 2010-10-08
      • 1970-01-01
      • 2019-02-20
      • 2012-10-13
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多