新辰:共享是SEO的思维 用户是SEO的核心

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

新辰:共享是SEO的思维 用户是SEO的核心,布布扣,bubuko.com

时间: 2024-10-25 06:44:41

新辰:共享是SEO的思维 用户是SEO的核心的相关文章

新辰:传统行业进军互联网 怎样颠覆网络获得新生?

今天新辰来谈谈传统行业应该怎么在互联网的思维下"活"起来,不知道你对美容美发有没有了解,新辰了解到.这一行业国内有7000亿的市场规模,单就美发而言.也有至少3000亿的规模,看看各个小区门口的理发门店就知道了. 那么,在互联网下,到底传统行业应该如何的产业定位.市场定位?如何去创造互联网新思维? 当然,还有非常多问题须要我们来思考啊,比方:跨界之后的理发店是什么样的形态?理发店的有可能成为什么样的平台?针对哪一类消费人群?提供哪几种产品组合?如何打造极致的用户体验?理发店的产品组合如

新辰:传统行业进军互联网 如何颠覆网络获得新生?

今天新辰来谈谈传统行业应该怎么在互联网的思维下"活"起来,不知道你对美容美发有没有了解,新辰了解到,这一行业国内有7000亿的市场规模,单就美发而言,也有至少3000亿的规模,看看各个小区门口的理发门店就知道了.那么,在互联网下,究竟传统行业应该怎样的产业定位.市场定位?怎样去创造互联网新思维? 当然,还有很多问题需要我们来思考啊,比如:跨界之后的理发店是什么样的形态?理发店的有可能成为什么样的平台?针对哪一类消费人群?提供哪几种产品组合?怎样打造极致的用户体验?理发店的产品组合怎样优

新辰:SEOer必知守则 排名与转化率的关系

有人说:为什么每天付出那么多,整天都是在写文章.发外链.做SEO,可是为什么还是没有排名?又有人说:为什么排名已经前三了,可是带来的流量却微乎其微呢?还有人说:为什么有了排名,为什么转化率却还是很低呢?新辰相信这些问题困扰着一大批的站长及SEOer,那么为什么,应该怎么办?请往下看,新辰告诉你. SEO究竟是做什么的,或许你觉得老生常谈了,有人该说,不就是写个文章,发个外链,看看排名的嘛,有什么技术含量呢,谁不会啊?是啊,新辰也知道,做SEO的入门工作就是这些,很简单,简单易上手:对,新辰说的是

新辰:4G时代如何利用手机进行移动APP营销?

未来的时代是4G时代,新辰手机用户的搜索量不在电脑端之下.那么,我们要如何用手机进行营销呢?手机网站的竞价文章,要如何去写比较好?手机网站要做专题吗?手机网站的优化思路在哪里?手机的系统不同,在不同的手机上,用户体验度也是不一样的.我们如何做到完美?针对这些问题,新辰为你一一解答: 新辰问你:你平时喜欢玩手机吗?你对手机哪方面感兴趣呢?不同的手机会影响人的阅读习惯,所以个人认为手机搜索优化停留在seo角度还只是一层?苹果,黑莓,不同手机用户有不同人群分布!所以手机优化不能做到完美的. 新辰认为,

新辰:关于个人网站安全问题的分析及对策探讨

新辰从实践出发,依靠自己建网站的经验以及对个人站长(尤其是论坛,博客等)的研究,并参考各大网站的各种建站教程以及网站SEO过程.依次举多个个人论坛网站实例,并加入自己的见解进行分析.对于个人论坛网站的安全问题,是一个个人站长必须勇敢去面对并进行对抗的过程.在此,新辰特提出对待其的方法. 经过新辰市场调查,目前市场上有50%的网站使用的都是互联网公开模版网站,从而导致有近45%的网站成为别人的赚钱工具,公开源码是非常不安全,从中找取漏洞,利用站点进行谋取暴利. 以上数据分别表明了: 1,现在的个人

新辰:4G时代怎样利用手机进行移动APP营销?

未来的时代是4G时代,新辰手机用户的搜索量不在电脑端之下.那么,我们要怎样用手机进行营销呢?手机站点的竞价文章,要怎样去写比較好?手机站点要做专题吗?手机站点的优化思路在哪里?手机的系统不同,在不同的手机上,用户体验度也是不一样的.我们怎样做到完美?针对这些问题,新辰为你一一解答: 新辰问你:你平时喜欢玩手机吗?你对手机哪方面感兴趣呢?不同的手机会影响人的阅读习惯,所以个人觉得手机搜索优化停留在seo角度还仅仅是一层?苹果,黑莓,不同手机用户有不同人群分布!所以手机优化不能做到完美的. 新辰觉得

新辰:网站排名浮动不前 相比竞争者到底缺少了什么?

这几天有很多朋友问新辰,为什么网站排名掉了?为什么被人家逆袭反超了?当然,这无疑与你网站的内容.外链和用户体验有很大关系,不过,新辰在此认为,还需要多研究一下竞争对手的网站,做到:人无我有,人有我优,只有这样,才能将你的网站真正做起来:所以对比一下你的竞争者,你的网站缺少了什么? 一,查看域名年龄和建站历史-外部因素 有时候,域名的权重很多程度上决定了网站的排名能力.比如,有个朋友的网站建站2年了,每天坚持原创更新,但是排名总是浮动在5.6名左右,从来没有上过前三名:这是为什么?他的网站不好吗,

新辰:十种外链终极方法 让SEOer外链之路不再孤独!

大家都知道,外链就是指从别的网站导入到自己网站的链接,导入链接对于新辰网站优化来说是非常重要的一个过程.因此,新辰认为,对于中小型网站来说,外链可是优化的重中之重!因为也有了"外链专员"一说,新辰觉得这只是SEO得最基础的阶段,不是都说SEO的最高境界就是脱离SEO吗?不过,这次还行要说一下外链. 新辰认为,外链不是想象的那样简单,不是简单的在论坛上发个回复,留给签名,因为这基本上算是垃圾外链,也就是行业中所说的:外链工厂.那么我们究竟要怎么去发外链?发外链有没有什么方法?且跟着新辰往

新辰:关于“网络推广不能仅仅依靠网络”的详解

新辰上一篇文章<新辰:网络推广不能仅仅依靠网络!>收到了非常多朋友的评论,有些朋友对此感到非常是不解:你都说是做网络推广了,怎么还说不能依靠网络?你不利用网络还叫做网络推广吗?你写的文章有点乱.看不懂--呵呵,对于这些朋友的问题,新辰也是感到非常抱歉,所以特发此文来解释各位朋友们的疑问. 问题一:既然是网络推广.为什么还叫做不能仅仅依靠网络? 新辰答:首先,我们应该知道啊,推广的方法有非常多,网络推广仅仅是这些推广中的一种而已.只是也是如今最为流行的方法:既然我们做网络推广,当然首选的就是网络