人类科技的发展为什么会是加速度的(TRIZ方法再推荐)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了。这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies 、disc_copies都可能会发生。

如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2

mnesia过载分析

1、抛出警告是在mnesia 增加dump worker的时候

mnesia_controller.erl

抛出警告是当Worker的#dump_log.opt_reply_to 未定义,仔细看这里的代码,这一步先检查了dumper_queue里的worker

所以,mnesia抛出过载警告有2个条件:

1)当worker的#dump_log.opt_reply_to 未定义

2)dumper_queue有相同操作(InitBy)的worker

2、那什么样的worker的#dump_log.opt_reply_to 未定义?

代码也在mnesia_controller.erl,这里add的worker的dump_log.opt_reply_to 未定义,而{async_dump_log, InitBy} 就是 mnesia:dirty_write/2的过程中调用mnesia_controller:async_dump_log(write_threshold) 产生的。

就是说,mnesia:dirty_write/2会触发异步dump操作,而只有异步的dump会导致mnesia抛出过载警告

3、看一下,mnesia什么时候会修正worker?

代码也在mnesia_controller.erl,在dump完成时,mnesia会修改worker的dump_log.opt_reply_to,然后移出dumper_queue

从上面可以得到结论,mnesia:dirty_write/2的操作是会触发异步dump操作,每次dump操作mnesia都会加到dumper_queue队列,mnesia通过检查dumper_queue是否存有相同操作的worker来检查是否过载

mnesia dump分析

mnesia数据存储实际上使用的是ets和dets,对于ram_copies类型的表使用ets;disc_copies表也使用ets,通过dump将数据保存到*.DCD(disc copy data)文件来持久化,中间可能会用*.DCL(disc copy log)转储;而disc_only_copies表使用的是dets,保存的文件为*.DAT。

表类型不同,mnesia记录数据的过程也不同,这里先讨论mnesia 记录disc_copies数据的过程。

1、mnesia 记录disc_copies数据有2个过程:

1)操作先记录到日志文件LATEST.LOG,然后再dump到*.DCD文件,同时清除LATEST.LOG

2)把修改同步到ets表中

2、mnesia disc_copies表数据dump过程

1)将日志文件LATEST.LOG重命名为PREVIOUS.LOG,然后再新建一个空的日志文件LATEST.LOG

2)分析PREVIOUS.LOG文件中的内容,将disc_copies的表实际修改写到*.DCL文件

3)比较*.DCL和*.DCD的大小,当filesize(*.DCL) > filesize(*.DCD) / dc_dump_limit,把*.DCL的记录存储到*.DCD文件中。dc_dump_limit默认为4,可以通过-mnesia dc_dump_limit Number设置

3、mnesia什么时候会dump

1)定时触发

mnesia启动后,mnesia_controller进程设置定时器,触发dump

mnesia_controller.erl:

默认值为180000,可以通过 -mnesia dump_log_time_threshold 300000 设置。

2)一定次数的操作后触发

每次数据操作,mnesia都会调用mnesia_log:log/1或者mnesia_log:slog/1进行日志记录,记录一次日志就将trans_log_writes_left的值减1,当这个值为0时,触发dump

mnesia_log.erl:

mnesia_dumper.erl :

默认值为1000,可以通过 -mnesia dump_log_write_threshold 50000 设置。

3)手动dump

手动调用 mnesia:dump_log/0  可以强制mnesia 完成dump,而这个dump是同步的

mnesia.erl:

mnesia_controller.erl:

解决mnesia过载

结合上面的分析再谈谈mnesia过载问题,dict_copies表写数据的时候,mnesia会写记录到ets表和日志文件LATEST.LOG,然后定时或定量dump做持久化。通过dump_log_write_threshold /dump_log_time_threshold 可以控制持久化的频率。mnesia在dump数据的时候,如果上一个worker进程dump没完成,就抛出过载警告。对此,dump_log_write_threshold的值表示mnesia经历过多少数据操作做一次持久化,dump_log_time_threshold的值表示mnesia多长时间做一次持久化。

这里再谈谈,为何同一时间只能有一个dumper?

dump的过程是先将日志文件重命名为PREVIOUS.LOG,然后分析PREVIOUS.LOG的数据做持久化,如果同时有第二个dump,将会替换掉第一个dump的PREVIOUS.LOG,影响第一个dump的持久化。那么,聪明的你就会这么想,为何不重命名为XXX.LOG,每次重命名都不同?事实上,如果同时有两个dumper,mnesia仅保证第二个dump能正常进行,放弃掉第一个dump的数据。所以,mnesia出现过载警告的时候,数据有可能会丢失。

这里,我做过了一项测试,修改mnesia的代码,将所有异步dump去掉,改用定时手动dump。还是原来的例子,发现第一个dump还没完成日志文件的分析和持久化,而新的日志文件已经增长到快2G。

dump的过程在文件io层面上其实是,一边在没有控制的追加数据,一边又在分析文件和有序写入,这个过程是在挑战磁盘io的读写极限啊。所以,就算现在有多个dumper,结果只会让cpu和硬盘更加抓狂。

另外,别太过依赖dump_log_write_threshold/dump_log_time_threshold这两个参数,改大了就有用吗?

这两个参数改大了,就是说,dump的频率就会降低,那么等待dump的数据就会更多,dump花的时间将会越长,到头来还是不能解决到问题。这两个参数的意义在于平缓写入速度,避免一时间大量数据写入造成数据丢失。但是,如果每时每刻都是高密度写入,硬盘也承受不了,一般到了这个局面,问题应该从数据缓冲和持久化的设计上去解决,而不是想着换一个数据库去解决。

这里有一点经验可以分享一下:

1、在mnesia没报过载错误的时候,不建议去改动,调节这些参数会影响持久化

2、可以多个进程读mnesia的数据,但写数据的过程只交给少数几个进程去完成

参考:

http://blog.csdn.net/mycwq/article/details/28660813

http://my.oschina.net/hncscwc/blog/161763

人类科技的发展为什么会是加速度的(TRIZ方法再推荐),布布扣,bubuko.com

时间: 2024-10-24 20:02:26

人类科技的发展为什么会是加速度的(TRIZ方法再推荐)的相关文章

辛东方:科技的发展将导致更多人失业?

科技发展的速度超过人的想象力,以前所未有的速度加速传统产业的不断变革和更新.创新力度大的企业在科技革命的浪潮中有能够生存下来的一线希望,而创新力度不大的传统企业则可能面临着企业关闭破产的风险. 文/辛东方,80后作家.专栏作者.专注互联网科技领域 科学技术是第一生产力,是促进社会生产力发展的第一要素.人类各种文明的发展和进步,都离不开科技的带动.开始于十六七世纪的工业革命,让人类彻底走进了工业时代,此后更加快了世界各地的工业化进程的脚步.工业革命中受益的西方国家,看到了科学技术的优越性,不断加速

科技的发展(1) - 中文输入法

关于科技的发展系列,我想谈谈的第一个话题便是中文输入法. 回想起二十年前,刚接触计算机时,第一个让人困扰的事便是学习五笔.那时还没有用户痛点的说法,可以熟练使用五笔输入法还是看起来颇为高大上的感觉.不能免俗,记忆里的我还是费了一些劲的,虽然最终也没有能够练就这门"上乘"武功.如今想来也只依稀记得"烟"字的五笔编码是old,还是靠这个编码的巧合. 于是乎,我有一个念头,当下是否还有人在使用五笔输入法?我查阅了一下百度指数:五笔输入法 vs 搜狗输入法. 可以看到五笔输

从变啦发展历程看减脂科技的发展

变啦是一个专注于"健康减脂""科学抗衰"两大领域的专业品牌.变啦凭借强大的专家团队及大数据平台,为客户制定全面而个性的解决方案,提供科学专业的服务.产品和技术.目前,已在63多个国家赢得超过500万用户的认可和信赖.从变啦的发展历程中减脂科技的发展依稀可见:早在2016年12月份,华尔街归国博士林伟华先生主导国内领先的智能健康服务平台-变啦APP 正式上线.在发展的几年时间里,变啦做到了从不言弃,不管外界的压力多大,致力于为客户提供更好的服务,这几年之中变啦积极与世

从宜人贷财报看金融科技四大发展风向标

日前,宜人贷发布了今年第一季度的财务业绩报告,其中清一色的红色增长和翻倍的高百分比数据成为行业焦点,在P2P网贷平台普遍未盈利的现状下,宜人贷取得的漂亮业绩着实引人注目.众所周知,网贷平台在如今的政策约束下逐渐走向规范,比如与银行的资金存管系统对接,使平台在资产规模.风控能力.健康持续发展等方面受到更高指标的要求,整个P2P行业已经进入了激烈的淘汰赛. 所谓适者生存,宜人贷不仅站稳了脚跟,还能够在众多的互联网金融平台中脱颖而出,并非偶然,本次的财报中就能寻出其烈火燎原的端倪. 1.用户流量增加,

够快科技的发展历程

上海够快科技网络公司在2014年12月18日发布企业级云存储服务--"够快云库".作为一个成立仅一年半时间的新兴公司,够快科技的成就是有目共睹的,至今够快科技共积累企业用户超10万家.个人用户160多万. "够快云库"是基于企业软件互联网/移动互联网化.轻量级应用等新兴云存储需求研发推出,具备文件索引.智能同步等功能,为每个用户默认提供20G的存储空间,当使用量超过50%时,用户可以申请空间加倍,以此类推. 够快科技于2012年4月18日在上海成立,三个月后获得戈壁

人类信息技术的前生、今世和未来 | 邬贺铨推荐

文 | 吕廷杰 灯泡不是爱迪生发明的?电话不是贝尔发明的?无线电不是马可尼发明的?第一位上天飞行的不是莱特兄弟的?时间晶体存在记忆?区块链之父是何方神圣?未来人类将半人半机器? 人是自然的存在物,社会是人们相互交往的产物,作为人类文明的重要组成部分,通信一直是人们进行社会交往的重要手段.我们的祖先在没有发明文字和使用交通工具之前,就已经能够互相通信了.从击鼓传音.烽火台.消息树,到鸿雁传书.邮驿制度,再到灯塔乃至信号旗等.与此同时,人们通过岩刻.竹签.结绳.算盘等计算工具或方法进行收获与分配的计

android黑科技系列——获取加固后应用App的所有方法信息

一.前言 在逆向应用的时候,我们有时候希望能够快速定位到应用的关键方法,在之前我已经详细介绍了一个自己研发的代码动态注入工具icodetools,来进行动态注入日志信息到应用中,不了解的同学可以查看这里:icodetools动态注入代码解析,看完之后都会发现这个工具对于现在加固的应用是没有办法的,所以我们如何能够得到加固的应用的所有方法信息呢?再不用复杂的脱壳步骤也可以轻松的获取对应的方法信息.这个就是本文需要介绍的内容. 二.获取加固应用方法 在之前了解过加固应用原理的同学或者是弄过脱壳的同学

人的惯性思维

这次AlphaGo以4:1战胜李世石,结果不算意外,几年前,我也觉得围棋被机器干掉距离还很远,理由其实很简单,就是围棋的计算量非常大.持有这种观念的人大有人在,包括赫赫有名的围棋大师聂卫平.持这种观念其实属于正常人,因为我们一致认为计算机的特长在计算,对于人类这种抽象能力 ,计算机是没法学的.但我们都忽视了一个基本的东西:从原子的角度,计算机和人其实是没有什么区别的,人能学习,机器注定是可以学习的.从另外一个角度来说,人生小孩本质也是一种生产,人的后代可以通过学习达到很高的能力,本质上来说,机器

杂谈经验与未来

人必须依靠经验来生存.但经验又往往easy起反作用.人类在几十亿年中自然选择下形成的本能机制.要保持一种与时俱进事实上是非常困难的. 大部分的人事实上没有什么独立的思维可言,这是自然法则决定的.事实上不能怪人本身,由于这样的存在本身就是一种选择的结果.信息少的时候,人做推断不easy,但信息太多的时候,人做推断更不easy,特别是独立推断.经验事实上就是一把双刃剑,而要用好也是一种技术+体力活. 随着人类科技的发展,两级化会越来越严重,如今所谓的自由.不够都是在别人设好的背景里的一种游戏,道德是