我有一个程序非常重视文件系统,读取和写入一组工作文件。这些文件的大小为几千兆字节,但不大到不适合RAM磁盘。这个程序运行的机器通常是Ubuntu Linux机箱。
有没有办法将文件管理器配置为具有非常大的缓存,甚至可以缓存写入,以便它们稍后到达磁盘?
或者有没有办法创建一个可以直接写入真实磁盘的RAM磁盘?
答案 0 :(得分:23)
默认情况下,Linux将使用空闲RAM(几乎全部)来缓存磁盘访问,并会延迟写入。内核用来决定缓存策略的启发式方法并不完美,但在特定情况下击败它们并不容易。此外,在日志文件系统(即现在的所有默认文件系统)上,对磁盘的实际写入将以崩溃的弹性方式执行;这意味着一点开销。您可能想尝试摆弄文件系统选项。例如,对于ext3
,尝试使用data=writeback
或甚至async
进行挂载(这些选项可以提高文件系统性能,但会降低对崩溃的恢复能力)。另外,使用noatime
来减少文件系统活动。
以编程方式,您可能还希望通过内存映射(使用mmap
)执行磁盘访问。这有点实际,但它可以更好地控制数据管理和优化。
答案 1 :(得分:16)
您是否检查过您的磁盘是否正在使用其内置写入缓存?它可以产生相当大的差异。在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
现代默认设置是更频繁地写,以避免huge write spikes。您可以尝试调整这些以满足您的需求。以下是excellent discussion可用参数以及如何尝试调整它们。
答案 2 :(得分:12)
您可以使用物理分区创建ramdisk和RAID-1。看看--write-mostly和--write-behind选项。您可以使用它们将物理磁盘分别设置为不读取(仅写入),并分别设置未完成的写入操作数。
或者,查看pdflush的文档。这里有一个很好的页面:http://www.westnet.com/~gsmith/content/linux-pdflush.htm(也由ire_and_curses链接) 除了提到的内容之外,您可能希望将swappiness调整为100以支持磁盘缓存而不是交换。
但是要了解它是如何工作的,并将其调整到您的特定应用程序是值得的。 Linux已针对一般情况进行了调整,只有您了解具体情况的不同之处。 :)
答案 3 :(得分:1)
这里的问题是你需要多少耐久性?
正常情况下,Linux会愉快地使用尽可能多的ram来缓存文件一段时间,然后将更改写回来。这通常是您想要的,因此在发生崩溃时您将丢失一些但不会过多的数据。
应用程序当然可以强制回写(例如)fdatasync()和fsync()。
为了获得更好的性能,您可以减少频繁调用fdatasync,例如牺牲持久性。
答案 4 :(得分:-4)
可能你需要基于RAM的SSD磁盘吗?