msync性能是否取决于所提供范围的大小?



我正在对一个映射文件进行许多小的随机写入。我想确保一致性,所以我时不时地使用msync,但我不想跟踪我所做的每一个小的写入。在当前的Linux内核实现中,在整个文件上使用msync是否有性能损失?例如,如果文件是100GB,但我只做了10MB的更改?内核是否在为msync提供的范围内循环每个页面以找到要刷新的脏页面,或者这些页面是否保存在某种链表/其他结构上?

TL;DR:不,它不是,保存所需信息的内核结构是为了使操作高效而设计的,无论范围大小。

可映射对象的页面保存在基数树中,但是基数树的Linux内核实现有一个额外的特殊功能:条目可以用最多3个不同的标记来标记,并且可以更快地找到和迭代标记的条目。实际使用的数据结构称为"xarray",您可以在这篇LWN文章或cc4中找到有关它的更多信息。

脏页有一个特殊的标记,可以设置(PAGECACHE_TAG_DIRTY),允许在需要回写时快速找到它们(例如msync,fsync等)。此外,XArrays提供了一种0(1)机制来检查是否存在带有给定标记的条目,因此在页面的情况下,甚至在查找脏页面之前,就可以快速确定是否需要回写。

总而言之,在整个映射上调用msync不应该造成明显的性能损失,而只对一小部分实际修改过的页面调用CC_8。

最新更新