1

mmap我有一个程序(用 c 编写),它同时创建 200 多个文件,并通过将它们映射到程序地址空间来同时写入它们。一切正常,但是当我备份目录时,由同一个程序一次性创建和写入的文件从同一个磁盘复制出来的速度比那些在一次。我只能想象这是由于某种文件碎片造成的,尽管我认为这在 ufs 文件系统上是不可能的。

有没有人有任何想法:

1)尝试解决这个问题是否是一个好主意,在正常使用下,文件可能会以与写入时相同的顺序被读回?

2)如果有一个好的解决方案,该怎么办?

磁盘的文件系统是ufs

4

1 回答 1

1

最终我在 Free BSD 手册页中找到了

“警告!使用 ftruncate(2) 扩展文件,从而创建一个大洞,然后通过修改共享 mmap() 来填充这个洞可能会导致严重的文件碎片。为了避免这种碎片,您应该始终预先在通过 mmap() 修改区域之前,通过将零写入新扩展区域来分配文件的后备存储。碎片问题对 MAP_NOSYNC 页面特别敏感,因为页面可能以完全随机的顺序刷新到磁盘。 "

我得出的结论是,虽然 Linux 或 Solaris 手册页没有这样的警告,但问题一定同样存在。如何处理它是另一个问题 - 如果文件的最终大小在开始时未知,则在整个文件上写零不是一个好主意。可能强制使用大页面可能会有所帮助,但这种性质的任何解决方案都将是特定于平台的。

于 2014-05-03T21:40:43.873 回答