将 vm.dirty_ratio 设置为 0 是否有任何长期副作用?

将 vm.dirty_ratio 设置为 0 是否有任何长期副作用?

当我通过拇指驱动器复制数据时,即使拇指驱动器的写入速度不能超过 2 MiB/s,Linux 首先会在一秒钟内将 600 MB 数据复制到其中 - 它只是写入 RAM作为缓存,然后它会在 300 秒内慢慢刷新数据。在这种情况下,缓存实际上并不会提高复制速度。

为了避免这种行为,我设置vm.dirty_ratio0.

这确保了我写的内容是实时写入的,没有缓存。


目前遇到的问题

  • 现在,写入 SSD 的速度为 20 - 30 MiB/s(将 2 GB 数据从 ramdisk 复制到 $HOME 时)!更改前为 300 MiB/s。

但这对我来说不是一个主要问题,因为我现在至少可以确认我复制的内容已写入,并且内存中没有任何剩余内容,因此我可以在复制后立即处理该文件,而不必担心损坏数据!


在这里我只是想知道禁用 dirty_ratio 是否有任何长期副作用?我的系统上使用 SSD、HDD 和拇指驱动器。

IO 调度程序(使用 udev 规则设置)只是所有非旋转磁盘的 MQ-Deadline,以及旋转磁盘的 BFQ。


系统详情

核心:

Linux 版本 5.8.12-xanmod1-1 (makepkg@archlinux) (gcc (GCC) 10.2.0、GNU ld (GNU Binutils) 2.35) #1 SMP PREEMPT 2020 年 9 月 30 日星期三 14:19:49 +0000


编辑:

基准:

我在 ramdisk 中创建了一个新文件:

$ >/tmp/x ; xfs_io -c 'pwrite -S 0xa 0 1G' /tmp/x 
wrote 1073741824/1073741824 bytes at offset 0
1 GiB, 262144 ops; 0.2277 sec (4.392 GiB/sec and 1151213.5997 ops/sec)

该文件仅包含0xa,它仅转换为 10 或 ASCII 中的“\n”。

然后我安装并将其复制到我的硬盘上:

  • 当 dirty_ratio 为 20(默认)时:
$ sudo mount /dev/sdb3 /mnt/ ; time sudo cp /tmp/x /mnt/ ; time sudo umount /mnt/ 

real    0m5.879s
user    0m0.013s
sys     0m0.392s

real    0m3.566s
user    0m0.002s
sys     0m0.060s
  • 当 dirty_ratio 为 0 时:
$ sudo mount /dev/sdb3 /mnt/ ; time sudo cp /tmp/x /mnt/ ; time sudo umount /mnt/ 

real    0m29.983s
user    0m0.006s
sys     0m0.600s

real    0m0.163s
user    0m0.000s
sys     0m0.052s
  • 当 dirty_ratio 为 100 时(仅用于基准):
$ sudo mount /dev/sdb3 /mnt/ ; time sudo cp /tmp/x /mnt/ ; time sudo umount /mnt/ 

real    0m0.408s
user    0m0.006s
sys     0m0.370s

real    0m9.050s
user    0m0.004s
sys     0m0.077s

基准测试表明将 vm.dirty_ratio 设置为 0 实际上要慢得多...

答案1

如果没有该缓存,HDD 就无法重新组织写入,从而导致大量碎片和更多磨损。

您可以使用选项安装棒,而不是关闭缓存sync

答案2

正如 Barafu Albino 所说,根本没有缓冲区意味着内核没有机会将小写入分组为单个较大写入。我认为这实际上不会导致磁盘碎片,但如果 SSD 本身没有采取任何操作将较小的写入分组为一个较大的写入,则会导致 SSD 上的写入磨损更高。它还可能导致写出临时文件,即使它们只使用百分之一秒(如果文件在写入磁盘之前创建、使用和删除,系统不会浪费资源将其写入磁盘)根本没有磁盘。)

在某些时候,当他们发现大内存系统(或 RAM 较少但存储速度非常慢的系统,如 USB 记忆棒所示)时,1% 仍然太高,因此添加了 dirty_bytes 和 dirty_background_bytes 选项。一旦设置了 dirty_bytes,dirty_ratio 就会被清零并且不会被使用;一旦设置了(非零)dirty_ratio,dirty_bytes就会被清零并且不会被使用(dirty_background_ratio/bytes也是如此)。我建议将 dirty_bytes 设置为较低但非零值..例如,dirty_bytes=33554432 (32MB) 或使用“公制”MB 并设置为 30000000(如果您愿意),好吧,写入最多需要 16 秒到你的棍子上。即使是 8MB(8388608 或 8000000)也会将其缩短为 4 秒,但我敢打赌您会发现您的 SSD 写入随后会恢复到全速或非常接近。

相关内容