파일을 복사하는 데 다음 두 가지 시나리오 사이에 큰 차이가 있습니다.
두 작업을 완료하는 데 같은 시간이 걸릴 것으로 예상합니다. 그러나 첫 번째 시나리오는 실제로 훨씬 더 빠릅니다. 나는 두 개의 다른 파일 시스템에서 이것을 시도하여 동일한 결과를 얻었습니다. 첫 번째 시나리오가 훨씬 빠른 이유를 아십니까?
Linux의 예 :
$ dd bs=1024 count=1000000 if=/dev/zero of=dummyfile.txt
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 7.45639 s, 137 MB/s
$ while [ "1" == "1" ]; do time cp dummyfile.txt dummyfile2.txt ; rm dummyfile2.txt ; done
real 0m0.850s
user 0m0.003s
sys 0m0.847s
real 0m0.778s
user 0m0.000s
sys 0m0.776s
real 0m0.775s
user 0m0.004s
sys 0m0.772s
real 0m0.775s
user 0m0.003s
sys 0m0.770s
real 0m0.776s
user 0m0.008s
sys 0m0.766s
^C
$ rm dummyfile2.txt -f
$ while [ "1" == "1" ]; do time cp dummyfile.txt dummyfile2.txt ; done
real 0m0.839s
user 0m0.003s
sys 0m0.834s
real 0m6.056s
user 0m0.005s
sys 0m1.683s
real 0m6.614s
user 0m0.002s
sys 0m1.405s
real 0m6.858s
user 0m0.003s
sys 0m1.436s
편집 : SSD 디스크에서 테스트가 수행됩니다. HDD에서도 같은 경향을 보였지만 그 차이는 SDD (2-3X)보다 낮습니다. 다음 페이지는 덮어 쓰기시 SSD가 HDD보다 훨씬 느린 이유를 설명합니다.
실제로 물리적 복사에는 같은 시간이 걸립니다. 그러나 ext4 파일 시스템 드라이버 close ()는 작업이 기존 i-node에서 수행 될 때 데이터가 실제로 기록되기 전에 대기하고 새 노드에서 수행되는 경우 쓰기 작업을 기다리지 않습니다. 몇 가지 실험을했고 그것이 ext4 기능이라는 것을 깨달았습니다. btrfs, zfs, ext3, ext에서 복사하는 것과 같은 차이를 보지 못했습니다.
마감이 시간이 많이 걸리는 작업이라고 어떻게 말할 수 있습니까? strace 는 다음 정보를 제공합니다.
$ strace -tt -T cp bigfile newfile
...
14:36:41.985437 open("bigfile", O_RDONLY) = 3 <0.000009>
14:36:41.985466 fstat(3, {st_mode=S_IFREG|0664, st_size=647608649, ...}) = 0 <0.000007>
14:36:41.985495 open("newfile", O_WRONLY|O_CREAT|O_EXCL, 0664) = 4 <0.000086>
14:36:41.985602 fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 <0.000007>
14:36:41.985633 fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0 <0.000008>
... a lot of reads and writes
14:36:43.584223 close(4) = 0 <0.000009>
14:36:43.584248 close(3) = 0 <0.000008>
...
$ strace -tt -T cp bigfile existingfile
...
14:36:52.393034 open("bigfile", O_RDONLY) = 3 <0.000010>
14:36:52.393071 fstat(3, {st_mode=S_IFREG|0664, st_size=647608649, ...}) = 0 <0.000009>
14:36:52.393104 open("existingfile", O_WRONLY|O_TRUNC) = 4 <0.097058>
14:36:52.490211 fstat(4, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 <0.000007>
14:36:52.490278 fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0 <0.000009>
... a lot of reads and writes
14:36:54.047408 close(4) = 0 <5.346015>
14:36:59.393466 close(3) = 0 <0.000011>
...
close (4)는 5 초 이상 걸리는 반면 기존 파일에 복사하는 경우 새 파일이 생성 될 때 즉시 수행됩니다.
시스템이 무엇을하는지 확인하기 위해 iostat 를 실행 합니다. 파일 시스템 캐시 효과를 피하기 위해 테스트 전에 bigfile 읽기가 실행되었습니다.
# iostat sda 1 100
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sda 0.00 0.00 0.00 0 0
--------------- copy to a new file starts here -----------------------
sda 24.00 0.00 8340.00 0 8340
sda 174.00 8.00 86596.00 8 86596
sda 170.00 0.00 86020.00 0 86020
--------------- copy to a new file finishes here ---------------------
sda 177.00 4.00 90112.00 4 90112
sda 176.00 4.00 89600.00 4 89600
sda 166.00 0.00 84992.00 0 84992
sda 161.00 4.00 81920.00 4 81920
sda 157.00 0.00 78888.00 0 78888
sda 52.00 0.00 26224.00 0 26224
sda 0.00 0.00 0.00 0 0
sda 0.00 0.00 0.00 0 0
sda 0.00 0.00 0.00 0 0
--------------- copy to the existing file starts here ----------------
sda 12.00 0.00 4128.00 0 4128
sda 172.00 4.00 87040.00 4 87040
sda 180.00 4.00 91648.00 4 91648
sda 175.00 0.00 89600.00 0 89600
sda 173.00 4.00 88064.00 4 88064
sda 168.00 4.00 83532.00 4 83532
sda 159.00 0.00 81408.00 0 81408
sda 181.00 4.00 92160.00 4 92160
sda 30.00 0.00 14960.00 0 14960
--------------- copy to the existing file finishes here --------------
sda 0.00 0.00 0.00 0 0
sda 3.00 0.00 28.00 0 28
새 파일로의 복사는 데이터가 기록되기 전에 완료되고 cp가 사용자 관점에서 수행되지만 쓰기 작업은 계속됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다