긴 복사 중에 "du" 명령의 출력은 무엇입니까?

긴 복사 중에 "du" 명령의 출력은 무엇입니까?

cp최근에 대규모 디렉터리 백업을 생성하는 명령을 실행했습니다 . 그래서 다음과 같은 명령을 사용했습니다.

cp -rv big_directory new_location

파일이 크기 때문에 이 명령을 실행하는 데 시간이 오래 걸리고 복사 진행 상황도 확인하고 싶었습니다. 그래서 du다른 터미널에서도 다음과 같이 명령을 사용했습니다.

du -sh new_location/*

하지만 이 명령도 실행하는 데 시간이 오래 걸립니다. 특히 해당 디렉토리에 대용량 파일이 있는 경우에는 더욱 그렇습니다.

cp명령을 실행하는 데 10분이 걸린다고 가정합니다 . du명령을 시작한 지 1분 후에 시작 하고 실행하는 데 1분이 걸린다고 cp가정하면 ? 의 출력을 du신뢰할 수 있는지 알고 싶습니다 .du

시작 시(t=1분) 어떤 일이 발생하는지에 대한 신뢰할 수 있는 출력을 제공합니까, 아니면 실행 시간이 끝날 때(t=2분) 어떤 일이 발생하는지에 대한 출력을 du제공합니까 ? 분명히 복사로 인해 명령 시작과 끝 사이에 du디렉토리 크기가 변경되었습니다.new_locationdu

답변1

@derobert가 du작동 방식을 설명합니다.

그는 아주 큰 양의 작은 파일/디렉토리(따라서 메타데이터를 위한 많은 메모리)가 없는 한 du즉시 다시 실행하면 일반적으로 더 빠른 결과를 얻을 수 있다는 점을 언급하지 않았습니다.

파일이 크다고 해서 du속도가 느려지는 것은 아니지만 파일을 복사하면 디렉터리 캐시가 메모리에서 부족해질 가능성이 높습니다. (데스크톱 응답성이 향상될 수 있습니다.를 설정 vm.swappiness=10하고 sysctl 설정을 사용하여 데이터보다 메타데이터의 우선순위를 지정합니다 vm.vfs_cache_pressure=60(에 넣습니다 /etc/sysctl.d/99-local.)

여러 프로세스가 동시에 파일 시스템에 액세스하는 경우 각 시스템 호출은 런타임 상태 스냅샷에 대한 정보를 얻습니다. 예를 들어, 프로세스는 파일이 존재하는지 확인한 다음 파일을 열려고 시도했지만 더 이상 존재하지 않는다는 것을 발견할 수 있습니다. 다른 프로세스가 확인 사이의 시간 간격으로 이름을 바꾸거나 제거했기 때문입니다. (이로 인해 문제가 발생하거나 오류의 원인이 되는 경우 이를 경쟁 조건이라고 합니다.)

디렉터리 순회 순서가 du선택한 순서와 동일 하면 아직 수정 중인 디렉터리 cpdu실행이 거의 끝날 때까지 도달하지 않으므로 마지막에 너무 많은 시간을 놓치지 않습니다. OTOH, 새 파일 du이 있는 디렉터리를 먼저 합산 cp한 다음 잠시 시간을 내어 나머지를 합산하면 결과가 유효하지 않게 됩니다.

답변2

du디렉터리를 반복적으로 검색하여 모든 파일과 디렉터리의 크기를 계산하는 방식으로 작동합니다. 그것은 다음과 같습니다:

  1. 명령줄에 지정된 첫 번째 디렉터리에서 시작합니다.
  2. stat크기를 결정하고 전체에 추가하는 디렉토리
  3. 디렉터리에서 첫 번째 항목(파일 또는 하위 디렉터리 이름)을 읽습니다.
  4. 파일인 경우 stat전체에 추가하세요.
  5. 디렉터리인 경우( 물론 .가 아님 ..) 하위 디렉터리에 대해 2~7단계를 수행합니다.
  6. 다른 항목이 있으면 읽고 4로 돌아갑니다. [궁금할 수도 있습니다. cp단일 디렉터리를 스캔하는 동안 다른 항목이 추가되면 어떻게 될까요? du이것기준나타날 수도 있고 나타나지 않을 수도 있음 - 지정되지 않음. ]
  7. 디렉토리 크기 인쇄

귀하의 경우와 같이 디렉터리와 파일이 du모두 변경되는 경우 제공되는 크기는 처음부터 끝까지의 크기가 아니라 그 사이의 크기이지만 정확하지는 않습니다. 하지만 적어도 cp.

진행률 표시기를 얻으려면 @roaima의 제안 외에도 ( 빠른 검색으로 찾음) 및 와 같은 복잡한 항목이 rsync있습니다 .cp -vgcp(cd /src && tar c .) | pv -pterb -s $(du -sb /src) | (cd /dst && tar x)

답변3

이미 rsync설치한 경우 다음과 같이 복사 진행 상황을 볼 수 있습니다.

rsync -vP big_directory new_location

권한, 타임스탬프, 소유권 등을 보존하려면 -a에 플래그를 추가 rsync하거나 -p에 플래그를 추가하면 됩니다 cp.


du이 대답은 사용된 디스크 공간의 근사치를 확인하기보다는 실제로 복사 진행 상황을 보고 싶다는 가정을 사용하지 않습니다 .

관련 정보