Linux 通过RAM磁盘写入,还是对文件系统进行大规模缓存?

Linux 通过RAM磁盘写入,还是对文件系统进行大规模缓存?,linux,optimization,filesystems,ramdisk,Linux,Optimization,Filesystems,Ramdisk,我有一个程序,它对文件系统的影响非常大,读取和写入一组工作文件。这些文件的大小为几GB,但不会太大以至于无法放在RAM磁盘上。该程序运行的机器通常是Linux机器 有没有一种方法可以将文件管理器配置为具有非常大的缓存,甚至可以缓存写操作,以便它们稍后命中磁盘 或者有没有办法创建一个可写入真实磁盘的RAM磁盘?检查您的磁盘是否正在使用内置的写缓存。这会产生很大的不同。在Linux上,您可以使用hdparm切换行为: /sbin/hdparm -W 0 /dev/hda 0 Disable writ

我有一个程序,它对文件系统的影响非常大,读取和写入一组工作文件。这些文件的大小为几GB,但不会太大以至于无法放在RAM磁盘上。该程序运行的机器通常是Linux机器

有没有一种方法可以将文件管理器配置为具有非常大的缓存,甚至可以缓存写操作,以便它们稍后命中磁盘


或者有没有办法创建一个可写入真实磁盘的RAM磁盘?

检查您的磁盘是否正在使用内置的写缓存。这会产生很大的不同。在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

现代的默认设置是更频繁地写入,以避免。您可以尝试调整这些以满足您的需要。以下是可用参数的列表,以及您可以如何调整这些参数。

默认情况下,Linux将使用空闲RAM(几乎全部)来缓存磁盘访问,并将延迟写入。内核用来决定缓存策略的启发式算法并不完美,但在特定情况下击败它们并不容易。此外,在日志文件系统(即现在所有的默认文件系统)上,对磁盘的实际写入将以一种能够抵御崩溃的方式执行;这意味着有一点开销。您可能想尝试修改文件系统选项。例如,对于
ext3
,请尝试使用
data=writeback
甚至
async
装载(这些选项可能会提高文件系统性能,但会降低对崩溃的恢复能力)。另外,使用
noatime
减少文件系统活动


通过编程,您可能还希望通过内存映射执行磁盘访问(使用
mmap
)。这是一个简单的操作,但它提供了更多关于数据管理和优化的控制。

您可以创建一个RAM磁盘,并使用物理分区进行存储。看看--主要写和--写在后面选项。您可以使用它们分别使物理磁盘成为不可读取(仅可写入)的磁盘,以及设置未完成写入操作的数量

或者,看看。除此之外,您可能还希望将交换能力提高到100,以使磁盘缓存优于交换


但是,了解它是如何工作的,并根据您的特定应用程序调整它是值得的。Linux已经针对一般情况进行了调优,只有您知道您的具体情况有何不同。:)

这里真正的问题是你需要多少耐用性

通常Linux会很乐意使用尽可能多的RAM来缓存文件一段时间,然后写回更改。这通常是您想要的,因此在发生崩溃时,您将丢失一些但不会太多的数据

应用程序当然可以使用(例如)fdatasync()和fsync()强制回写


为了获得更好的性能,您可以少调用fdatasync,例如,牺牲耐用性。

最好向超级用户询问这个问题。保持简单:在/dev/shm中工作,并不时将副本复制到永久存储。对于这种情况,使用
noatime
装载相关文件系统绝对是一个很好的建议。
vmtouch
如果确实想强制内核保持缓存,也很有用(和我现在一样)哇,vmtouch很酷,感谢您的推荐DannySauer意味着
mdadm
--主要写
--隐藏写
选项考虑到Linux软件RAID-1不会在正常关机时等待所有数据在隐藏写设备上复制。它简单地标记了需要在写操作中同步的区域位图,并计划在系统再次打开时继续复制数据。但是,当系统重新打开时,主RAID设备将消失或替换为新的RAM磁盘。数据丢失。从内核3.6开始