基于 mmap 相比于 fwrite 写日志,是否有性能优势?

2021-07-25 16:02:11 +08:00
 lzjamao

看到一些日志库和文章说,声称基于 mmap 可以增强性能,如腾讯 xloglog4a

微信 mars 的高性能日志模块 xlog

log4a readme

《高性能日志记录方式 - mmap 》

不过在 stackoverflow 上看到了相反说法(这里),有人认为 mmap 和 fwrite 在顺序写性能上差别不太( 微信 mars 的高性能日志模块 xlog文章里的测试结果也是说相差无几),有人认为不恰当的使用 mmap 会使性能差别。

4399 次点击
所在节点    程序员
27 条回复
ryd994
2021-07-25 21:55:34 +08:00
@ipwx write 只保证写入 page cache 。vfs 还有 IO scheduler 都可以对操作进行重排或者合并。所以你就算随机写,只要范围不大而且最终结果是连续的,那操作系统就能够合并操作,结果还是连续的
平时 write 会 block 是因为有缓存限制。但是这是可以调整的。
而且还可以用 non blocking write 。缓存满了就失败,你自己再想办法处理。
again,这些都是 page cache,由操作系统管理。

如果你认真了解过 mmap 的实现机制,就会知道,mmap 实际上就是把 page cache map 给你了。既然 write 也是写入 page cache,那写入之后的事情就没有区别了。
nuk
2021-07-25 22:52:46 +08:00
@ryd994 老哥别揪着我不放了,我承认你说的都对
swulling
2021-07-25 22:59:51 +08:00
日志顺序写场景的话,mmap 的优势只不过是比内核少了一次拷贝,所以只有在极大数据量的情况下才有优势。
Brentwans
2021-07-25 23:23:27 +08:00
其它场景不太清楚,但是在数据处理的领域。如果单论写入性能,结论是 mmap 不会直接明显提升写入性能。因为不管什么写法瓶颈在 IO,只要写入速度到了磁盘 IO 上限,就再也无法提升。看了好多上面测试结论都有不准的可能,IO 性能的 benchmark 是不太容易的,需要用一定的技巧才行,因为系统数据缓存的原因,很容易最终测出的不是磁盘 IO 速度而是内存的速度。
ryd994
2021-07-25 23:47:06 +08:00
其实你仔细看文一文二,说的都是安卓系统或者移动平台,也就是说,没有 root 权限,不一定能修改 page cache 回写的时机。那这种情况下用 mmap 就是不是办法的办法。因为 mmap 必定不阻塞,所以可以突破系统的限制。
但是这说白了是没有权限的情况下的投机取巧。而且这种情况下对 mmap 也是有限制的。反复 map unmap 还有 page fault 的开销也不小。所以实际效果如何还有待商榷。
julyclyde
2021-07-26 11:27:58 +08:00
腾讯的问题在于:
1 热爱 mmap
2 立场高于实际
codehz
2021-07-26 21:06:54 +08:00
@ryd994 谁说 mmap 不阻塞的。只是内存足够给你浪而已。。。
是可以卡在缺页中断那很久的,然后特定条件下可以影响业务稳定运行(你甚至没有任何办法打断一个处在在缺页状态的线程)。。
无阻塞的文件读写接口只有 io uring 那里有,但是显然不够安全,进程炸了就没了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/791638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX