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

本文探讨了在UPS项目中使用mmap进行增量数据管理时的数据可靠性。mmap内存写操作会进入page-cache,msync用于将脏数据持久化。操作系统自带的page-cache管理策略包括定时刷新和脏数据比例触发。然而,通过mmap更新文件时不更新mtime和ctime,可能是kernel的已知bug。实验表明,进程崩溃时数据不会丢失,但机器掉电可能导致page-cache数据丢失,建议通过msync策略减少数据丢失。
最低0.47元/天 解锁文章
3445

被折叠的 条评论
为什么被折叠?



