【问题标题】:Write-through RAM disk, or massive caching of file system? [closed]直写式 RAM 盘,还是文件系统的海量缓存? [关闭]
【发布时间】:2011-01-17 22:40:15
【问题描述】:

我有一个程序对文件系统的影响很大,读取和写入一组工作文件。这些文件有几 GB 大小,但不会大到无法放入 RAM 磁盘。运行这个程序的机器通常是Ubuntu Linux 机器。

有没有办法将文件管理器配置为具有非常大的缓存,甚至缓存写入以便稍后访问磁盘?

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

【问题讨论】:

  • 最好在超级用户上问这个。
  • 保持简单:在 /dev/shm 中工作并不时将副本复制到永久存储。

标签: linux optimization filesystems ramdisk


【解决方案1】:

检查您的磁盘是否正在使用其内置的写入缓存。它可以产生很大的不同。在 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。您可以尝试调整这些以满足您的需求。以下是an excellent discussion 的可用参数以及如何尝试调整它们。

【讨论】:

    【解决方案2】:

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

    以编程方式,您可能还希望通过内存映射(使用mmap)执行磁盘访问。这有点动手,但它可以更好地控制数据管理和优化。

    【讨论】:

    • 使用noatime 挂载相关文件系统对于这种情况绝对是个好建议。
    • vmtouch 如果您确实想强制内核保持缓存的内容(就像我目前所做的那样),这也很有用
    • 哇,vmtouch 很酷,谢谢推荐
    【解决方案3】:

    您可以创建一个 RAM 磁盘并 RAID 1 它带有一个物理分区。查看 --write-mostly--write-behind 选项。您可以使用它们来使物理磁盘成为不可读取(仅写入)的物理磁盘,并分别设置未完成的写入操作数。

    或者,查看the documentation for pdflush。除了 ire_and_curses mentioned 之外,您可能还希望将 swappiness 提高到 100,以支持磁盘缓存而不是交换。

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

    【讨论】:

    • Dannysauer 表示mdadm--write-mostly--write-behind 选项
    • 请考虑 Linux 软件 RAID-1 在正常关机时不会等待所有数据都复制到后写设备上。它简单地在写入位图中标记需要同步的区域,并计划在系统再次启动时继续复制数据。但是,当它重新打开时,主 RAID 设备将消失或替换为新的 RAM 磁盘。数据丢失。
    • pdflush is gone 从内核 3.6 开始
    【解决方案4】:

    这里的问题实际上是您需要多少耐用性?

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

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

    为了获得更好的性能,您可以减少调用 fdatasync 的频率,例如牺牲持久性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 2013-04-28
      • 2011-10-16
      • 2011-11-14
      • 2014-02-11
      • 2019-04-16
      • 2010-10-17
      • 1970-01-01
      相关资源
      最近更新 更多