大家好,我在纯写入调用中看到磁盘读取 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 要从磁盘读取,但是没有涉及文件系统,所以我认为这与不同的块大小有关。