복사 속도가 cp보다 빠르나요?

복사 속도가 cp보다 빠르나요?

나는 현재 cp -r.

이 작업을 더 빨리 수행할 수 있는 방법이 있나요? 먼저 파일을 압축하는 것이 좋을까요, 아니면 를 사용하는 것이 좋을까요 rsync?

답변1

요즘 가끔 속도가 느려서 혼란스러워요 cp. 구체적으로 df = pandas.read_hdf('file1', 'df')(700ms가 소요되는 1.2GB 파일) 다음에 df.to_hdf('file2')(530ms) 가 cp file1 file2(8초)보다 훨씬 빠른 이유는 무엇입니까 ?

이에 대해 더 자세히 알아보세요.

  • cat file1 > file2별로 나아지지 않았습니다(8.1초).
  • dd bs=1500000000 if=file1 of=file2둘 다 아닙니다(8.3초).
  • rsync file1 file2더 나쁜 경우(11.4s)는 file2가 이미 존재하기 때문에 롤링 체크섬을 수행하고 업데이트 마법을 차단하려고 시도한다는 것입니다.

오,잠깐만요!file2존재하는 경우 먼저 연결을 해제(제거)하는 것은 어떻습니까?

이제 우리는 다음에 대해 이야기하고 있습니다.

  • rm -f file2:0.2초(아래 숫자에 추가).
  • cp file1 file2:1.0초.
  • cat file1 > file2:1.0초.
  • dd bs=1500000000 if=file1 of=file2:1.2초.
  • rsync file1 file2:4초.

그래서 거기에 있습니다. 대상 파일이 존재하지 않는지 확인하십시오(또는 pandas.to_hdf()존재할 수 있는 파일을 자르십시오).

편집하다: 명령을 실행하기 전에 캐시를 지우지는 않지만, 주석에서 언급했듯이 이렇게 하면 위의 모든 숫자에 약 3.8초만 추가됩니다.

또한 주목할 가치가 있습니다. 이는 다양한 Linux 버전(Centos w. 2.6.18-408.el5 커널 및 Ubuntu w. 3.13.0-77-generic 커널)과 ext4 및 ext3에서 시도되었습니다. 흥미롭게도 Darwin 10.12.6이 설치된 MacBook에서는 차이가 없으며 두 버전 모두 (대상 위치에 기존 파일이 있는지 여부에 관계없이) 빠릅니다.

답변2

똑같다분할-l(및 파일 시스템) 하드 링크를 구현하는 데 사용할 수 있습니다사본 대신. 하드 링크 생성은 콘텐츠를 복사하는 것보다 훨씬 빠릅니다(그러나 물론 다른 디스크 파티션에서는 작동하지 않습니다).

작은 예를 들어보세요:

$ time cp -r mydir mydira

real    0m1.999s
user    0m0.000s
sys     0m0.490s

$ time cp -rl mydir mydirb

real    0m0.072s
user    0m0.000s
sys     0m0.007s

이는 28배 향상된 것입니다. 하지만 이 테스트에서는 약 300개의(상당히 작은) 파일만 사용했습니다. 몇 개의 큰 파일은 더 빠르게 실행되어야 하고, 많은 작은 파일은 더 느리게 실행되어야 합니다.

답변3

로컬 디스크에 파일을 복사할 때 디스크에서 읽고 쓰는 데 99%의 시간이 소요됩니다. 데이터를 압축하려고 하면 CPU 부하가 증가하지만 읽기/쓰기 데이터는 줄어들지 않습니다. 실제로는천천히 해귀하의 사본.

rsync는 이미 데이터 사본이 있고 이를 "최신"으로 만드는 경우 도움이 됩니다.

그러나 완전히 새로운 트리 복사본을 만들고 싶다면 명령보다 더 나은 방법은 없습니다 cp.

답변4

많은 수의 디렉토리를 복사하려면할 수 있는cp실제로 복제본을 병렬화하고 복제 가속을 사용하는 것보다 더 좋습니다.

복사본을 병렬화하면 드라이브가 포화 상태가 됩니다. 최신 SSD(및 어느 정도 HDD)는 많은 I/O 요청을 받을 때 더 나은 성능을 발휘합니다. 최적의 성능을 위해 이러한 요청을 재정렬/일괄 처리/캐시할 수 있기 때문입니다. 복사되는 파일이 크고 운영 체제가 프리패치를 수행하지 않는 한 단일 스레드 복사본이 SSD를 포화시킬 가능성은 거의 없습니다. 반면에 다중 스레드 복제는 많은 파일 읽기 및 쓰기가 동시에 발생하도록 보장합니다.

복사 가속화는 일부 파일 시스템에서만 사용할 수 있지만 실제로 복사를 수행하지 않기 때문에 다른 모든 시스템보다 낫습니다. 대신 원본 파일을 "COWed"로 표시하고 나중에 두 파일 중 하나에 기록되면 실제 복사본이 수행됩니다. 이로 인해 작업이 지연될 뿐이라고 말할 수도 있지만 "나중에" 부분은 추가 정보를 제공합니다. 예를 들어 특정 디스크 블록만 변경된 경우 파일 시스템은 해당 새 블록만 복사/생성하고 원본 파일의 다른 블록에 대한 포인터를 유지할 수 있습니다. 또는 파일 시스템이 블록 수준 복제 세분성을 지원하지 않을 수 있지만 변경 사항이 일부 디스크 블록을 완전히 덮어쓰므로 더 이상 복제할 필요가 없습니다. 내 요점은 복제 가속화가 단순히 "작업 연기"가 아니라 미래를 내다볼 수 있게 해준다는 것입니다.

io_uring은 아직 복사 가속화를 지원하지 않지만 일단 지원되면 이를 사용하면 최소한의 오버헤드로 복사에 필요한 다양한 작업을 병렬로 수행하여 효율성이 더욱 향상됩니다.


cp나는 파일을 복사하는 가장 빠른 방법이라는 유일한 목적으로 다중 스레드 대안을 만들었습니다 . 현재는 중첩 없이 단일 디렉터리를 복사할 때 눈에 띄지 않지만 Linux가 io_uring에서 복사 가속을 지원하면 변경될 것으로 예상됩니다.

도구:https://github.com/SUPERCILEX/fuc/tree/master/cpz
기준:https://github.com/SUPERCILEX/fuc/tree/master/comparisons#copy

관련 정보