如何减少 Linux 对可移动设备的写入缓冲区?

1N4*_*001 9 buffer removable-storage

在 Linux 上将内容写入可移动设备(USB 记忆棒/HDD、SD 卡等)时,我经常在前几秒钟看到令人难以置信的写入速度,有时以 GB/s(写入缓冲区的填充)的顺序,然后是几秒钟几分钟的安静(缓冲区实际上正在写入设备)。

这是误导。很难判断实际的写入速度。这很烦人(在刷新缓冲区时不能中断程序)。它可能会导致 FS 损坏,并且至少会在设备正在写入的情况下拔掉插头时导致未写入的内容。

在我的情况下,写入缓冲区似乎超过了 GB。有没有办法控制它?我想将其降低到更合理的值。

注意:这与文件系统缓存无关,这种影响也会出现在原始设备上

注意:我不想完全禁用写缓冲区

谢谢!

1N4*_*001 5

我找到了答案。默认情况下,64 位 Linux 维护一个大写缓冲区(可用内存的 20%!)。(有趣的是,32 位 Linux 将自身限制为最多 180MB)要将脏缓冲区大小更改为 200MB,可以使用

echo 200000000 > /proc/sys/vm/dirty_bytes
Run Code Online (Sandbox Code Playgroud)

使用一定比例的 RAM,例如 1%:

echo 1 > /proc/sys/vm/dirty_ratio
Run Code Online (Sandbox Code Playgroud)

更多信息:https : //lwn.net/Articles/572911/

  • 32 位和 64 位 Linux 内核都使用默认的 `dirty_ratio` 为 20。但是,由于 32 位 x86 架构的限制,32 位内核的最大可用内核 RAM 限制为 1 GB。因此,32 位系统上的最大默认写入缓存大小约为 180-200 MB,具体取决于硬件(至少具有 DMA 访问的 PCI 设备会减少可用 RAM 限制)。 (2认同)
  • 不过,这不是您原始问题的完整答案。我想限制我的外部慢速存储,而不是我的内部快速存储... (2认同)
  • 将 write_buffer 大小减小到当前利用率以下可能会导致系统有些无响应,因为新的写入似乎会被阻止,直到缓存中有可用空间,而缓存现在已满。在这种状态下创建目录让我有足够的时间清理院子里的孩子玩具,切一片酸橙芝士蛋糕和一杯牛奶,并在我用手机写这篇文章的同时完成这两件事。 (2认同)
  • 在长时间使用低“dirty_bytes”设置(200 MB)后,我注意到使用单个全局限制非常糟糕,因为慢速设备仍然可以填充缓冲区,然后写入另一个快速 SSD 设备会因此受到影响。正确的解决方法是应用设备特定的限制,但似乎没有简单的方法可以做到这一点。我认为对于我的情况来说,最佳设置是每台设备 200 MB。 (2认同)