![限制给定设备的写入缓存大小?](https://linux22.com/image/129040/%E9%99%90%E5%88%B6%E7%BB%99%E5%AE%9A%E8%AE%BE%E5%A4%87%E7%9A%84%E5%86%99%E5%85%A5%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
在开始将数据刷新到磁盘之前,有没有一种方法可以限制 Linux 在给定块设备的写入缓存中缓存多少数据?
我的服务器有大量 RAM(64GB 左右)。我发现每当我将大文件写入旋转介质(即慢速介质)或慢速 USB 闪存驱动器时,Linux 都会缓存千兆字节RAM 中可写数据的数量。对于许多只写入少量数据的操作来说,这很好,Linux 最终会将缓存刷新到磁盘。
然而,当我对大文件进行大操作时,写入缓存和随后的刷新使用户界面看起来非常不稳定。举一个简单的例子,用于pv
将大文件从 RAM 磁盘传输到写入速度较慢的 USB 闪存驱动器上的稳定存储。它将以疯狂的速度读取超过 1GB 的数据,然后减慢到正常的磁盘写入速度,但一旦写入完成,将需要一分多钟的时间来刷新缓存。
其他应用程序似乎几乎立即进行大量写入,然后完全停止一分钟,然后似乎立即进行另一堆写入,然后停止。由于旋转磁盘非常慢,有时刷新缓存的延迟足以引发内核 OOPS,进程挂起超过 120 秒。使用 ffmpeg 重新混合文件、传输 VMware 磁盘映像以及对大型连续文件进行类似的“批量”写入操作等操作往往会导致这种影响。
我希望能够告诉 Linux“在设备 /dev/sdX 上,在开始刷新缓存之前最多仅缓存 64MB 的数据”。这意味着,在上面的pv
示例中,在 UI 指示写入完成后,最多只能写入 64MB 的数据。输入sync
命令应该只需要刷新 64MB。 (现在,执行 apv
后跟 async
可能会挂起sync
两分钟以上,因为 Linux 缓存了千兆字节的数据,并且现在将其刷新到只有个位数或每秒数十兆字节写入速度的设备。)
我不一定想限制系统范围内的写入缓存,因为例如我位于 SSD 上的启动驱动器肯定会从缓存中受益,并且涉及非常小的写入的典型操作也能从中受益匪浅。只有大文件在可见的地方或多或少按顺序写入的情况。
编辑:我最喜欢的发行版是 Arch Linux,但我非常擅长调整其他发行版的说明以适应我的设置。