为什么纯 dd 写入调用会出现读取块 IO?vmstat 跟踪已附加

为什么纯 dd 写入调用会出现读取块 IO?vmstat 跟踪已附加

大家好,我在纯写入调用中看到磁盘读取 IO,我想知道为什么。这是在嵌入式系统上,没有其他可能干扰的后台进程在运行。文件系统在 SSD 上,fstab 选项:

/dev/sda /mnt/storage0 ext4 rw,noatime,barrier=1,data=ordered,discard 0 0

实际IO数据:

# time dd if=/dev/zero of=/mnt/storage0/test bs=16k count=2048k & vmstat 3 10000
0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 2  0      0   4384   1008 501088    0    0  3900 11969 2826  833  0 42 54  3
 2  2      0   3232   1488 501312    0    0  8608 120048 1056 2188  1 96  0  3
 1  2      0   4912   1440 499312    0    0 13040 78411 1225 2971  2 64  0 34
 2  2      0   3184   1408 501456    0    0 13179 107317 1252 3032  2 71  0 27
 2  2      0   3168   1456 501456    0    0 10037 82240 1027 2409  1 59  0 40
 3  0      0   4544   1440 500224    0    0  6901 62811  755 1708  1 45  0 54
 1  3      0   2928   1424 501824    0    0  8608 91200  909 2156  1 58  0 41
 0  2      0   4944   1456 499008    0    0  9173 75200  901 2155  1 50  0 49
 1  1      0   4944   1456 499760    0    0  8795 70880  907 2061  1 50  0 49
 1  1      0   5184   1472 499328    0    0 11237 106267 1141 2682  1 69  0 30
 3  2      0   3216   1456 501296    0    0 10373 96485 1055 2499  2 63  0 35
 0  2      0   4368   1488 499632    0    0  7488 72459  809 1857  1 48  0 51
 0  2      0   4480   1504 499536    0    0 11717 71445 1082 2653  1 57  0 42

答案1

操作系统将读取磁盘以进行写入。它需要读取诸如文件头之类的内容来更新它,例如文件大小。它需要读取块分配表以了解在磁盘上写入的安全位置等。

写入磁盘不仅仅是向其中写入数据。

答案2

我在使用 dd 和 netcat 时也遇到过类似的经历

nc -l 1234 | dd of=/dev/sda bs=4M

令我惊讶的dd是,从中读取了(很多)内容sda,而这应该只写入。

事实证明,使用obs(输出块大小)而不是bs(设置输入和输出块大小)使得读取消失。

nc -l 1234 | dd of=/dev/sda obs=4M 

... 就像我预期的那样工作,不需要读取(而且速度快得多)。

我不完全知道为什么 dd 要从磁盘读取,但是没有涉及文件系统,所以我认为这与不同的块大小有关。

相关内容