새 파일에 쓰기와 덮어 쓰기 : 성능 문제

래쉬가

파일을 복사하는 데 다음 두 가지 시나리오 사이에 큰 차이가 있습니다.

  1. 파일을 새 파일로 복사합니다.
  2. 기존 파일의 파일을 복사하고 덮어 씁니다.

두 작업을 완료하는 데 같은 시간이 걸릴 것으로 예상합니다. 그러나 첫 번째 시나리오는 실제로 훨씬 더 빠릅니다. 나는 두 개의 다른 파일 시스템에서 이것을 시도하여 동일한 결과를 얻었습니다. 첫 번째 시나리오가 훨씬 빠른 이유를 아십니까?

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보다 훨씬 느린 이유를 설명합니다.

트림 (컴퓨팅) Wikipedia 페이지

Campula의 상자

실제로 물리적 복사에는 같은 시간이 걸립니다. 그러나 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

파일 덮어 쓰기와 삭제?

분류에서Dev

동일한 이름의 새 / 덮어 쓰기 파일 삭제 및 생성 c # .NET

분류에서Dev

새 개체 만들기와 기존 개체 덮어 쓰기 (성능)

분류에서Dev

이전 폴더에서 새 폴더로 파일 덮어 쓰기

분류에서Dev

Python csv 작성기 / 행 다시 쓰기 / 덮어 쓰기 또는 모든 행 삭제 및 새 행 추가

분류에서Dev

문자열의 속성 덮어 쓰기

분류에서Dev

Sphinx 문서화 중에 .rst 파일 덮어 쓰기

분류에서Dev

파일 작성기 파일 덮어 쓰기

분류에서Dev

덮어 쓰기 / 지우기없이 기존 파일에 쓰기

분류에서Dev

Visual Basic에서 파일 덮어 쓰기

분류에서Dev

Perl에서 파일 덮어 쓰기

분류에서Dev

C #에서 txt 파일 덮어 쓰기

분류에서Dev

C ++ 파일의 기존 정보 삭제 또는 덮어 쓰기

분류에서Dev

새 속성으로 최대 너비 덮어 쓰기

분류에서Dev

새 속성으로 최대 너비 덮어 쓰기

분류에서Dev

새 파일을 덮어 쓰지 않고 폴더 압축 해제

분류에서Dev

새 개체와 기존 개체 덮어 쓰기

분류에서Dev

jQuery 객체 덮어 쓰기 문제

분류에서Dev

Java-BufferedWriter 덮어 쓰기 줄 문제

분류에서Dev

Java-BufferedWriter 덮어 쓰기 줄 문제

분류에서Dev

Python : 인수를 사용하여 함수의 파일 / 새 파일 덮어 쓰기

분류에서Dev

NuGet 복원 강제 파일 덮어 쓰기

분류에서Dev

두 가지 질문 : 크론 탭과 파일 덮어 쓰기

분류에서Dev

cocoapod 번들 리소스의 문자열 파일 덮어 쓰기

분류에서Dev

내 CMS의 구성 파일 덮어 쓰기

분류에서Dev

CT 재부팅시 lxc 구성 파일 덮어 쓰기

분류에서Dev

csv 파일에 쓰기 / 덮어 쓰기 방법

분류에서Dev

파일 (.csv)에 데이터 쓰기 및 덮어 쓰기

분류에서Dev

Repast : 텍스트 싱크에서 새 파일을 자동 생성하는 대신 기존 파일을 덮어 쓰는 방법

Related 관련 기사

  1. 1

    파일 덮어 쓰기와 삭제?

  2. 2

    동일한 이름의 새 / 덮어 쓰기 파일 삭제 및 생성 c # .NET

  3. 3

    새 개체 만들기와 기존 개체 덮어 쓰기 (성능)

  4. 4

    이전 폴더에서 새 폴더로 파일 덮어 쓰기

  5. 5

    Python csv 작성기 / 행 다시 쓰기 / 덮어 쓰기 또는 모든 행 삭제 및 새 행 추가

  6. 6

    문자열의 속성 덮어 쓰기

  7. 7

    Sphinx 문서화 중에 .rst 파일 덮어 쓰기

  8. 8

    파일 작성기 파일 덮어 쓰기

  9. 9

    덮어 쓰기 / 지우기없이 기존 파일에 쓰기

  10. 10

    Visual Basic에서 파일 덮어 쓰기

  11. 11

    Perl에서 파일 덮어 쓰기

  12. 12

    C #에서 txt 파일 덮어 쓰기

  13. 13

    C ++ 파일의 기존 정보 삭제 또는 덮어 쓰기

  14. 14

    새 속성으로 최대 너비 덮어 쓰기

  15. 15

    새 속성으로 최대 너비 덮어 쓰기

  16. 16

    새 파일을 덮어 쓰지 않고 폴더 압축 해제

  17. 17

    새 개체와 기존 개체 덮어 쓰기

  18. 18

    jQuery 객체 덮어 쓰기 문제

  19. 19

    Java-BufferedWriter 덮어 쓰기 줄 문제

  20. 20

    Java-BufferedWriter 덮어 쓰기 줄 문제

  21. 21

    Python : 인수를 사용하여 함수의 파일 / 새 파일 덮어 쓰기

  22. 22

    NuGet 복원 강제 파일 덮어 쓰기

  23. 23

    두 가지 질문 : 크론 탭과 파일 덮어 쓰기

  24. 24

    cocoapod 번들 리소스의 문자열 파일 덮어 쓰기

  25. 25

    내 CMS의 구성 파일 덮어 쓰기

  26. 26

    CT 재부팅시 lxc 구성 파일 덮어 쓰기

  27. 27

    csv 파일에 쓰기 / 덮어 쓰기 방법

  28. 28

    파일 (.csv)에 데이터 쓰기 및 덮어 쓰기

  29. 29

    Repast : 텍스트 싱크에서 새 파일을 자동 생성하는 대신 기존 파일을 덮어 쓰는 방법

뜨겁다태그

보관