한 번 낙하 위치 지정 후 dd 속도가 크게 떨어지는 이유는 무엇입니까?

한 번 낙하 위치 지정 후 dd 속도가 크게 떨어지는 이유는 무엇입니까?

fallocate -c -l1GiB 한 번두 번째 루프로 인해 dd 속도가 1.0GB에서 ~200MB/s로 떨어지나요?

xb@dnxb:~/Downloads/test$ fallocate -l 10.2GiB lala.mp4     
xb@dnxb:~/Downloads/test$ ls -larthiF --context --color
total 11G
41680908 drwxr-xr-x 121 xiaobai xiaobai ? 100K Dis   3 01:36 ../
53086804 drwxrwxr-x   2 xiaobai xiaobai ? 4.0K Dis   3 01:36 ./
53086805 -rw-rw-r--   1 xiaobai xiaobai ?  11G Dis   3 01:37 lala.mp4
xb@dnxb:~/Downloads/test$ f='lala.mp4'; n=0; while (( "$(stat --printf="%s" $f)" > 1073741824 )); do ((n++)); echo "[dd...$n]"; dd bs=1G skip=0 count=1 if=$f of="$f.$n"; fallocate -c -l1GiB $f; done; ((n++)); mv $f $f.$n; 
[dd...1]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.05744 s, 1.0 GB/s
[dd...2]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.24091 s, 331 MB/s
[dd...3]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.56858 s, 235 MB/s
[dd...4]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.02249 s, 267 MB/s
[dd...5]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.34307 s, 247 MB/s
[dd...6]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.27371 s, 251 MB/s
[dd...7]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.80721 s, 223 MB/s
[dd...8]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.17114 s, 257 MB/s
[dd...9]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.60627 s, 233 MB/s
[dd...10]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.13853 s, 259 MB/s
xb@dnxb:~/Downloads/test$ 
xb@dnxb:~/Downloads/test$ ls -larthiF --context --color
total 11G
41680908 drwxr-xr-x 121 xiaobai xiaobai ? 100K Dis   3 01:36 ../
53086806 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:37 lala.mp4.1
53086807 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:37 lala.mp4.2
53087049 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:37 lala.mp4.3
53087910 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:37 lala.mp4.4
53087911 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:37 lala.mp4.5
53087913 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:38 lala.mp4.6
53087914 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:38 lala.mp4.7
53087962 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:38 lala.mp4.8
53087963 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:38 lala.mp4.9
53087964 -rw-rw-r--   1 xiaobai xiaobai ? 1.0G Dis   3 01:39 lala.mp4.10
53086805 -rw-rw-r--   1 xiaobai xiaobai ? 200M Dis   3 01:39 lala.mp4.11
53086804 drwxrwxr-x   2 xiaobai xiaobai ? 4.0K Dis   3 01:39 ./
xb@dnxb:~/Downloads/test$ 

[고쳐 쓰다]

sync다음 항목 앞에 추가하면 dd다시 일관성이 유지되지만( sleep 120작동하지만 작동하지 않음 sleep 20) 전체 시간은 다음 항목 sync보다 오래 걸리므 로 느려 집니다.dd아니요sync:

xb@dnxb:~/Downloads/test$ f='lala.mp4'; n=0; while (( "$(stat --printf="%s" $f)" > 1073741824 )); do ((n++)); echo "[dd...$n]"; dd bs=1G skip=0 count=1 if=$f of="$f.$n"; fallocate -c -l1GiB $f; sync; done; ((n++)); mv $f $f.$n;
[dd...1]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.904357 s, 1.2 GB/s
[dd...2]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.902471 s, 1.2 GB/s
[dd...3]
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.896056 s, 1.2 GB/s
...

답변1

데이터는 디스크에 직접 기록되지 않습니다. 커널은은닉처. RAM은 디스크보다 훨씬 빠릅니다. 이 캐시의 첫 번째 dd이점은 캐시가 가득 차지 않는다는 것입니다. 그러나 dd나중에 캐시가 새로 고쳐질 때까지 기다려야 합니다.

sync모든 더티 페이지를 디스크로 플러시하도록 요청합니다. 그렇지 않으면 수십 초 후에 새로 고쳐집니다.

일반 디스크는 1.2GB/s에 도달할 수 없으며 SSD도 약 300MB/s에 도달할 수 있습니다.

관련 정보