我很难理解这个问题。
我的测试设置有一个 shell 脚本,它在 1G 文件上连续调用 'ls -la' 并打印出自上次运行以来的时间。然后我运行一个程序来修改文件的某些部分并将其同步到磁盘。
无论我是调用 fsync,还是系统进行同步,或者即使我使用 pwrite 编写不同的部分(仍在测试该位),当同步发生时,“ls -la”将冻结整个同步时间 - 7-40 秒之间(取决于修改的稀疏性)。
如果我使用 msync 一次同步块,或者在我写入时尝试更频繁地 fsync,持续时间会变得更大(可能是原来的 10 倍,但甚至更长,具体取决于我这样做的频率)。上面的 msync 仅以 16KB/Transaction 写入,即使页面是顺序的。
我在某处读到 OpenBSD 实现了“部分文件写入”或其他内容。我现在记不太清了。
无论如何,我可以做一些与 fsync 的效率类似的事情,而不会一直锁定文件吗?
实际上,“A”问题(我认为此“B”是解决方案)是简单地处理大文件并“鼓励”它们写入磁盘,以便在需要时可以快速释放内存是。简单地省略 NO_SYNC 是没有好处的,因为更改几乎同时发生,导致这种情况。其他 madvise 选项似乎也没有帮助。也就是说,如果我不同步,那么页面似乎会一直存在,直到内存不足,它们会突然开始交换(尽管只有 16KB/事务和非常低的 MB/s)。
你到底是如何在 FreeBSD 上处理大文件的?
解决方案:
我发现通过调整我的 msync 块并在 msync 调用中使用 MS_ASYNC 而不是 MS_SYNC,我可以获得我想要的性能,同时仍然允许其他进程打开和 mmap/读取文件。
小智 1
与其他 UNIX 一样,freeBSD 将使用可用内存来缓存磁盘 I/O。在具有大量可用内存和很少用户的系统上,非常大的文件可以完全停放在内存中。这样看起来就好像使用了更多内存。
close()( fclose()) 和fsync(fflush() ) 是唯一强制操作系统写入缓存的系统调用。仅当没有其他进程打开该文件时才会出现这种情况。freeBSD 不具备fdatasync仅将缓存数据写入,但不将元数据写入物理磁盘的功能。
从 BSD 4.4 开始,您可以使用mincore()系统调用跟踪分页和文件缓存。
因此,每隔几次写入后就必须刷新。
使用磁盘缓存参数:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/configtuning-disk.html
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
806 次 |
| 最近记录: |