zoukankan      html  css  js  c++  java
  • mnesia的脏写和事物写的测试

    在之前的文章中,测试了脏读和事物读之间性能差别,下面测试下脏写和事物写之间的性能差别:

    代码如下:

    -module(mnesia_text).
    
    -compile(export_all).
    
    -record(r_test, {id, name}).
     
    start(N) ->
        timer:tc(mnesia_text,dirty,[N]).
    
    start2(X) ->
        timer:tc(mnesia_text,t_w1,[X]).
    
    init() ->
        case mnesia:create_schema([node()]) of
            ok ->
                ok;
            _ ->
                mnesia:delete_schema([node()]),
                mnesia:create_schema([node()])
        end, 
        mnesia:start(),
     
        case mnesia:create_table(r_test, [{attributes, record_info(fields, r_test)},
                                          {record_name, r_test},{disc_copies, [node()]}]) of
                   {atomic, ok} ->
                                        ok;
                    _Any1 ->
                                mnesia:delete_table(r_test),
                                mnesia:create_table(r_test, [{attributes, record_info(fields, r_test)},
                                          {record_name, r_test},{disc_copies, [node()]}])
        end.
    
           
     t_w1(X) ->
            mnesia:transaction(fun() -> t_write(X) end).
    
    t_write(0) ->
                ok;
    t_write(N) ->
                Name = lists:append(["name_", N]),
                R = #r_test{id=N, name=Name},
                mnesia:write(R),
                t_write(N-1).
    
    
    dirty(0) ->
        ok;
    dirty(Num) ->
        Name = lists:append(["name_", Num]),
        R = #r_test{id=Num, name=Name},
        mnesia:dirty_write(R),
        dirty(Num-1).
     
    View Code

    测试十万次,测试结果如下:

    不难发现,脏写比事物写效率高出至少一个数量级,而且越频繁大量的写入,性能差距越明显。

    而在测试dirty_wirte的过程中,发现出现大量的waring,截图如下:

    原因查找:查看日志文件,发现有出现了几个这样的警告:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold}

    查阅了资料,出现这个问题的原因——频繁的异步写入

    有两种解决方案,一种是避免频繁的异步写入,另一个是把mnesia对应的配置文件权限放宽

    1、推荐用sync_transaction 或者 sync_dirty来进行写入操作,认为异步写入是导致出现这个错误的原因。

    2、对配置文件进行修改是在启动erlang时进行的:这哥推荐修改dc_dump_limit的设置由4改为40 

    修改dump_log_time_threshold 的设置由100改为50000,要想实现在启动erl时执行

    erl -mnesia dump_log_write_threshold 50000 -mnesia dc_dump_limit 40

    ok,下面说下这俩参数代表的意思:

    dc_dump_limit:磁盘备份表从内存中被抛弃的时间间隔

    dump_log_time_threshold:在新垃圾回收之前的最大的写入数。

    参考地址:How to Eliminate Mnesia Overload Events

  • 相关阅读:
    Max Sum Plus Plus HDU
    Monkey and Banana HDU
    Ignatius and the Princess IV HDU
    Extended Traffic LightOJ
    Tram POJ
    Common Subsequence HDU
    最大连续子序列 HDU
    Max Sum HDU
    畅通工程再续
    River Hopscotch POJ
  • 原文地址:https://www.cnblogs.com/unqiang/p/4543670.html
Copyright © 2011-2022 走看看