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

  • 相关阅读:
    将CMD内的显示内容输出到txt文件
    上传项目到Github
    利用百度地图API,在浏览器中找到自己的位置
    操作系统相关知识
    字符串的全排列
    二维数组做函数参数、指向指针的指针做函数参数
    strstr函数与strcmp函数
    华为机试题——数组排序,且奇数存在奇数位置,偶数存在偶数位置
    单链表的建立,插入,显示,查找删除以及反转
    《深入了解 Linq to SQL》之对象的标识 —— 麦叔叔呕心呖血之作
  • 原文地址:https://www.cnblogs.com/unqiang/p/4543670.html
Copyright © 2011-2022 走看看