- 实验环境:macbook 8C16G
- 工具dd
dd是 Unix/Linux/macOS 系统中用于数据复制的工具
| 部分 | 含义 |
|---|---|
dd | 命令本身(data duplicator 的缩写,核心功能是复制数据) |
if=/dev/zero | if = input file(输入文件),/dev/zero 是系统特殊设备文件:- 会持续输出「空字节(0x00)」(无限量);- 用它当输入,能快速生成纯 0 填充的文件(无需读取真实磁盘数据,效率高)。 |
of=testFile | of = output file(输出文件),指定将数据写入当前目录下名为 testFile 的文件(不存在则创建,存在则覆盖!)。 |
bs=1M | bs = block size(块大小),指定每次读写的数据块大小为 1M(1 兆字节,1MB = 1024KB = 1048576 字节)。- 块越大,单次读写的数据量越多,命令执行速度通常越快(减少 I/O 次数)。 |
count=1k | count = 块数量,指定只读写 1k 个「bs 大小的块」(1k = 1024 个)。 |
| 3.实验步骤 | |
| 3.1 执行dd前查看机器内存 | |
| 工具vm_stat | |
| 内存快照 |
解释一下由于OS内核的PC机制,数据会先写入File-backed pages,若写入速度快于内核刷盘速度,「Pages dirty」(脏页)会暴涨(1G=1024M=262144*4KB页),直到内核异步刷盘后,脏页数量下降,「File-backed pages」可能保留(作为缓存,方便后续读取);
3.2 执行dd命令写入1G文件
- PageCache:内核为加速文件 I/O 设计的内存缓存,默认情况下,文件写入时不会直接刷到磁盘,而是先写入页缓存(内存),后续由内核异步刷盘(或主动触发
sync) - 写回机制(Writeback):当页缓存中的脏页(已写入但未刷盘的数据)达到阈值(如内存占比、脏页数量),内核会自动触发刷盘,将脏页数据写入磁盘后,释放对应的页缓存空间,循环复用; 综上:预期执行完dd后,File-backed Pages会增长大概26万个数据页。
3.3 执行dd后查看机器内存
实际增长文件缓存页:55.9万-29.5万=26.4万,符合预期
4.收尾
清理内存脏页 purge
删除文件 rm testFile