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

代码如下:

-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).

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

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

而在测试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

mnesia的脏写和事物写的测试的更多相关文章

  1. SSD 为什么顺序写比随机写性能更好?

    SSD以Page为单位做读写,以Block为单位做垃圾回收,Page一般有16KB大小,Block一般有几十MB大小,SSD写数据的逻辑是: 1)将该块数据所在的Page读出 2)修改该Page中该块 ...

  2. 象写程序一样写博客:搭建基于github的博客

    象写程序一样写博客:搭建基于github的博客   前言 github 真是无所不能.其 Pages 功能 支持上传 html,并且在页面中显示.于是有好事者做了一个基于 github 的博客管理工具 ...

  3. 《自己动手写CPU》写书评获赠书活动结果

    <自己动手写CPU>写书评获赠图书的读者有: 京东:8***2.16号哨兵.magicyu.kk6803.jddickyd.杰出的胡兵 亚马逊:徐贺.马先童.jaychen.farmfar ...

  4. C#做一个写txt文件流的测试,为什么配置低的机器写入的还快

    测试机:笔记本i7 8G 固态硬盘 由于采取读码写入txt方式, 读码频率挺高,文件名为日期格式,当前采用每次读码打开文件写入的方式, 为什么没用sb,因为怕断电情况的数据丢失.所以采取每条存入的方式 ...

  5. 通过hive向写elasticsearch的写如数据

    通过hive向写elasticsearch的写如数据 hive 和 elasticsearch 的整合可以参考官方的文档: ES-hadoop的hive整合 : https://www.elastic ...

  6. 如果使用引用方式引用了js后 则不能再本地写js 因为写了后不会有效果

    如果使用引用方式引用了js后 则不能再本地写js 因为写了后不会有效果

  7. TensorFlow------单层(全连接层)实现手写数字识别训练及测试实例

    TensorFlow之单层(全连接层)实现手写数字识别训练及测试实例: import tensorflow as tf from tensorflow.examples.tutorials.mnist ...

  8. OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)

    一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...

  9. Qt侠:像写诗一样写代码,玩游戏一样的开心心情,还能领工资!

    [软]上海-Qt侠 2017/7/12 16:11:20我完全是兴趣主导,老板不给我钱,我也要写好代码!白天干,晚上干,周一周五干,周末继续干!编程已经深入我的基因,深入我的骨髓,深入我的灵魂!当我解 ...

随机推荐

  1. quartz的配置

    Quartz.Net中的概念:计划者(IScheduler).工作(IJob).触发器(Trigger).给计划者一个工作,让他在Trigger(什么条件下做这件事)触发的条件下执行这个工作 将要定时 ...

  2. C++学习(一):现代C++尝试

    C++是一门与时俱进的语言. 早期的C++关注的主要问题是通用性,却没有太多关注易用性的问题,使得C++成为了一门多范式语言,但是使用门槛较高. 从2011开始,C++的标准进行了较大的更新,开始更多 ...

  3. SpringBoot 分包方式多数据源

    1.引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  4. Codeforces 732F. Tourist Reform (Tarjan缩点)

    题目链接:http://codeforces.com/problemset/problem/732/F 题意: 给出一个有n个点m条边的无向图,保证联通,现在要求将所有边给定一个方向使其变成有向图,设 ...

  5. spring配置文件中配置sessionFactory失败

    配置失败主要原因有两个: <bean id="studentDaoImp" class="com.gxwuz.maven.dao.StudentDaoImp&quo ...

  6. 洛谷2085最小函数值(minval) + 洛谷1631序列合并

    题目描述 有n个函数,分别为F1,F2,-,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...

  7. Fatal error: Call to a member function read() on a non-object in

    是你的路径出问题了系统 > 系统基本参数 > 站点设置 里面的<站点根网址:和 网页主页链接:>系统 > 系统基本参数 > 核心设置 <DedeCMS安装目录 ...

  8. 由内省引出JavaBean的应用

    IntroSpector-->javaBean-->特殊的java类 get和set方法 ReflectPoint pt1 = new ReflectPoint(3,5); String ...

  9. DesignSurface简介

    The Perfect Host: Create And Host Custom Designers With The .NET Framework 2.0 Dinesh Chandnani - 三月 ...

  10. HTML5 Canvas 绘制佛教万字

    代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Ty ...