我的工作负载在短时间内具有极高的写入突发率。目标磁盘相当慢,但我有足够的 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 至少有两个关键选项:fs
和wb
:写入后文件同步和通过备份覆盖。
在 ext2 上,在 vim 中设置就足够了nofs
。在 ext4(默认延迟分配)上,noauto_da_alloc
还需要安装选项来防止立即同步,这次是由文件系统进行。
(dd
您可以选择仅(覆盖)写入文件的一部分,与cp
或不同vim
)