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

 

转载于:https://www.cnblogs.com/unqiang/p/4543670.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值