我有一个程序对文件系统的影响很大,读取和写入一组工作文件。这些文件有几 GB 大小,但不会大到无法放入 RAM 磁盘。运行该程序的机器通常是Ubuntu Linux 机器。
有没有办法将文件管理器配置为具有非常大的缓存,甚至缓存写入以便它们稍后命中磁盘?
或者有没有办法创建一个可以直接写入真实磁盘的 RAM 磁盘?
我有一个程序对文件系统的影响很大,读取和写入一组工作文件。这些文件有几 GB 大小,但不会大到无法放入 RAM 磁盘。运行该程序的机器通常是Ubuntu Linux 机器。
有没有办法将文件管理器配置为具有非常大的缓存,甚至缓存写入以便它们稍后命中磁盘?
或者有没有办法创建一个可以直接写入真实磁盘的 RAM 磁盘?
默认情况下,Linux 将使用空闲 RAM(几乎全部)来缓存磁盘访问,并延迟写入。内核用来决定缓存策略的启发式方法并不完美,但在特定情况下击败它们并不容易。此外,在日志文件系统(即现在的所有默认文件系统)上,对磁盘的实际写入将以一种可恢复崩溃的方式执行;这意味着一些开销。您可能想尝试摆弄文件系统选项。例如,对于ext3
,尝试使用data=writeback
或什至挂载async
(这些选项可能会提高文件系统性能,但会降低对崩溃的恢复能力)。此外,用于noatime
减少文件系统活动。
以编程方式,您可能还希望通过内存映射(使用mmap
)执行磁盘访问。这有点动手,但它提供了对数据管理和优化的更多控制。
检查您的磁盘是否正在使用其内置的写入缓存。它可以产生很大的不同。在 Linux 上,您可以使用以下命令切换行为hdparm
:
/sbin/hdparm -W 0 /dev/hda 0 Disable write caching
/sbin/hdparm -W 1 /dev/hda 1 Enable write caching
显然,如果启用了写缓存,那么如果您的系统不干净地关闭(例如,断电),就有可能导致数据丢失或损坏。
在软件方面,Linux 内核使用两个主要数字来参数化写入行为。
/proc/sys/vm/dirty_ratio
/proc/sys/vm/dirty_background_ratio
现代默认设置是更频繁地写入,以避免出现巨大的写入峰值。您可以尝试调整这些以满足您的需求。这是对可用参数以及如何尝试调整它们的精彩讨论。
您可以使用物理分区创建 RAM 磁盘和RAID 1 。查看--write-mostly和--write-behind选项。您可以使用它们来制作一个不可读取(仅写入)的物理磁盘,并分别设置未完成的写入操作的数量。
或者,查看pdflush 的文档。除了ire_and_curses提到的内容之外,您可能希望将 swappiness 提高到 100 以支持磁盘缓存而不是交换。
但值得了解它是如何工作的,并将其调整到您的特定应用程序。Linux 已经针对一般情况进行了调整,只有您知道您的具体情况有何不同。:)
这里的问题实际上是您需要多少耐用性?
通常,Linux 会愉快地使用尽可能多的 RAM 来缓存文件一段时间,然后将更改写回。这通常是您想要的,因此在发生崩溃时您将丢失一些但不会太多的数据。
应用程序当然可以使用(例如)fdatasync() 和 fsync() 强制回写。
为了获得更好的性能,您可以减少调用 fdatasync 的频率,例如,牺牲耐用性。