Lin*_*ons 5 linux filesystems cache disk
我的工作负载在短时间内具有极高的写入突发率。目标磁盘相当慢,但我有足够的 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
Run Code Online (Sandbox Code Playgroud)
但是,我似乎仍然遇到一些基于底层磁盘速度的写回限制。我怎样才能禁用这个功能?
# 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
Run Code Online (Sandbox Code Playgroud)
只要有空闲内存并且脏率尚未超过 - 我想全速写入页面缓存。
小智 0
问题不在于脏节流,而在于立即同步。bo您可以通过 - 我得到的专栏进行检查vmstat 1:
-----io----
bi bo
0 0
0 0
0 4000
0 0
...
Run Code Online (Sandbox Code Playgroud)
后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
Run Code Online (Sandbox Code Playgroud)
阈值是应用于当前可用内存的比率。只是因为我完全禁用了定期写回,所以我才看到十多个脏页。
这确实是一个复杂的情况;vim 至少有两个关键选项:fs和wb:写入后文件同步和通过备份覆盖。
在 ext2 上,在 vim 中设置就足够了nofs。在 ext4(默认延迟分配)上,noauto_da_alloc还需要安装选项来防止立即同步,这次是由文件系统进行。
(dd您可以选择仅(覆盖)写入文件的一部分,与cp或不同vim)
| 归档时间: |
|
| 查看次数: |
1926 次 |
| 最近记录: |