禁用写回缓存限制 - 调整 vm.dirty_ratio

禁用写回缓存限制 - 调整 vm.dirty_ratio

我的工作负载在短时间内具有极高的写入突发率。目标磁盘相当慢,但我有足够的 RAM,并且非常能容忍瞬时数据丢失。

我尝试调整 vm.dirty_ratio 以最大限度地利用用于脏页的可用 RAM 空间。

# free -g
              total        used        free      shared  buff/cache   available
Mem:            251           7         213           3          30         239
Swap:             0           0           0

# sysctl -a | grep -i dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 5
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 90000
vm.dirty_ratio = 90

但是,我似乎仍然遇到一些基于底层磁盘速度的写回限制。我怎样才能禁用这个功能?

# dd if=/dev/zero of=/home/me/foo.txt bs=4K count=100000 oflag=nonblock
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 10.2175 s, 40.1 MB/s

只要有空闲内存并且脏率尚未超过 - 我想全速写入页面缓存。

答案1

问题不在于脏节流,而在于立即同步。您可以通过- 我得到的bo专栏进行检查:vmstat 1

   -----io----
   bi    bo
    0     0
    0     0
    0  4000
    0     0
    ...

dd if=/dev/zero of=16/test bs=4k count=1000。 (vmstat 输出只有 1K-“单位” - /proc/diskstats 有 512B-单位)

添加conv=notrunc可以避免这种情况,就像rm之前的那样。请参阅sourcejedi 的评论。

ext4 挂载选项noauto_da_alloc确切的意思是:sync这些“重新写入文件”操作不需要额外的操作。man ext4有一些很好的例子。问题回到编辑器中“写入”或“保存”文件的含义,以及如何使该(电源)故障安全。


你还可以检查另一面:脏页不断增长:

]# grep nr_dirty /proc/vmstat      
nr_dirty 7886
nr_dirty_threshold 427666
nr_dirty_background_threshold 170815

阈值是应用于当前可用内存的比率。只是因为我完全禁用了定期写回,所以我才看到十多个脏页。


维姆

这确实是一个复杂的情况; vim 至少有两个关键选项:fswb:写入后文件同步和通过备份覆盖。

在 ext2 上,在 vim 中设置就足够了nofs。在 ext4(默认延迟分配)上,noauto_da_alloc还需要安装选项来防止立即同步,这次是由文件系统进行。

dd您可以选择仅(覆盖)写入文件的一部分,与cp或不同vim

相关内容