今天我读了很多关于“回写”机制的文章,想尝试一个实验。
编辑:从互联网下载的文件显示在Dirty
统计信息中
根据评论,我尝试从互联网下载一个文件,看看这是否是dd
.
事实上,似乎通过下载的文件wget
更改Dirty
了/proc/meminfo
.
Dirty
文件下载后,大小从几百 KB 变为 5 MB。它保持这种状态至少10秒(有时 20 秒以上)这仍然很有趣,因为我预计该间隔小于 5 秒(基于vm.dirty_writeback_centisecs
)。
Writeback
(据我所知)保持 0 kB。
运行手表:
Every 1.0s: grep -e Dirty -e Writeback /proc/meminfo ubuntu-18: Tue Apr 20 13:32:31 2021
Dirty: 5044 kB
Writeback: 0 kB
WritebackTmp: 0 kB
下载文件:
root@ubuntu-18:~# wget https://www.stats.govt.nz/assets/Uploads/Annual-enterprise-survey/Annual-enterprise-survey-2019-financial-year-provisional/Download-data/annual-enterprise-survey-2019-financial-year-provisional-csv.csv
...
2021-04-20 13:27:11 (2.03 MB/s) - ‘annual-enterprise-survey-2019-financial-year-provisional-csv.csv’ saved [5134576/5134576]
生成的文件dd
- 对统计数据没有影响Dirty
,除非文件真的很大
我使用 生成了 10MB 和 100MB 文件dd
并观看了/proc/meminfo
.但我没有注意到Dirty
内存有任何显着增加:
dd if=/dev/zero of=file.txt count=100 bs=1M
# watching /proc/meminfo while before, during, and after `dd` is executed
Every 1.0s: grep -e Dirty -e Writeback /proc/meminfo ubuntu-18: Tue Apr 20 08:06:35 2021
Dirty: 280 kB
Writeback: 0 kB
WritebackTmp: 0 kB
这种行为有什么原因吗?我认为,根据这些设置(vm.dirty_writeback_centisecs
),脏内存被写回磁盘之前应该需要最多 5 秒的时间:
sysctl -a | grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200
现在,当我尝试生成 1GB 文件时,我发现Dirty
内存大小有所增加,但仅限于dd
运行时。dd
完成其工作后,它会立即下降到非常小的值。
我多次尝试使用较小和较大的文件大小。
我在带有 Ubuntu 的 Hetzner Cloud VM 机器上运行所有这些:
root@ubuntu-18:~# uname -a
Linux ubuntu-18 5.4.0-40-generic #44-Ubuntu SMP Tue Jun 23 00:01:04 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
root@ubuntu-18:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
资源
我简要检查过的资源(也许其中一些有我错过或不理解的解释):
- https://www.thomas-krenn.com/en/wiki/Linux_Page_Cache_Basics
- https://ncona.com/2018/05/linux-page-cache/
- https://www.kernel.org/doc/html/latest/admin-guide/sysctl/vm.html
- 回写缓存(“dirty”)似乎被限制为甚至小于 dirty_background_ratio。它受到什么限制?这个限制是如何计算的?
- 我可以查看“同步”操作的进度吗?
- https://superuser.com/questions/479379/how-long-can-file-system-writes-be-cached-with-ext4