mmap的数据可靠性分析

UPS项目打算用mmap做增量数据管理,对数据可靠性有一定要求,简单做了些实验,结果与大家分享下。

1.      对mmap内存的写操作,会直接进入系统page-cache;msync调用负责把脏的page-cache持久化到硬盘。

2.      Page-cache操作系统自身也有管理策略:一个是定期把脏数据(有过更新的)刷回硬盘(默认30s);一个是脏数据达到一定比例,也会触发刷新(默认10%)。

具体可参考:http://www.westnet.com/~gsmith/content/linux-pdflush.htm

3.      通过mmap更新文件(PROT_WRITE和MAP_SHARED模式),文件的mtime和ctime没有发生更新,与man中对mmap的描述不一致。据说是kernel的一个bug,目前还没有修复。

可参考:http://forum.soft32.com/linux/mmap-mtime-updates-ftopict338320.html

https://lkml.org/lkml/2006/5/17/138

 

从上面实验结果可以判断:

1.      如果使用mmap的进程挂了,写到mmap的数据不会丢失,因为已经写到page-cache;page-cache里面的数据对所有进程都是可见的。

2.      如果是机器挂掉,比如掉电,page-cache里的数据会丢掉;mmap会最多丢失30s左右的数据。

由于机器挂掉概率较小,而且增量时可以自己做一些msync策略,比如更新1K次之后,主动调用一次msync,这样就可以减少数据丢失。

 

有理解不对的,还请大家补充。


你可能感兴趣的:(mmap的数据可靠性分析)