在不减慢整个系统的情况下限制每个进程的脏字节

Mik*_*nen 5 linux performance scheduling io limit

假设一个繁忙的系统安装了一个非常快的块设备(高端 NVMe RAID,2 GB/s 写入,4 GB/s 读取)/data和一个非常慢的设备(USB HDD 与旋转 8 TB 磁盘,50 MB/s 写入, 60 MB/s 读取)安装在 上/backup,如何在/backup不牺牲 I/O 的情况下限制进程读取和写入/data

据我所知,问题是 linux 只有全局旋钮dirty_background_bytesdirty_bytes. 如果我将这些限制设置为 NVMe 的合理值(实际上大约为 2 GB 和 4 GB),则吞吐量很好,直到进程(例如rsync)开始向 USB 写入大量数据。在这种情况下dirty_background,填充了数据到 USB 设备并rsync停止污染更多页面。但是,这会导致写入快速设备的进程大幅减慢,因为这dirty_background是全局限制并在快速和慢速设备之间共享。我知道我可以根据连接到系统的最慢设备来限制脏字节,这将避免巨大的停顿,但会牺牲更快设备的一些吞吐量。

是否有等效dirty_background_bytes于单个块设备?减慢所有写入的进程真的是零意义的/data,以防/backup它很慢并且被其他进程访问。

我知道cgroup可以用来手动执行此操作(如何将每个进程 I/O 限制到最大限制?)。但是,我想对每个块设备进行调整,并且在降低整个系统的速度之前,应该限制访问所述设备的所有进程。如果进程同时写入快速和慢速设备,则只有在向慢速设备写入过多内容时,它才会变慢。