동일한 컴퓨터에 대해 서로 다른 날짜의 수백 개의 백업이 포함된 백업 디스크가 있습니다. 백업은 rsync 및 하드 링크를 사용하여 수행됩니다. 즉, 파일이 변경되지 않은 경우 백업 스크립트는 이전 백업의 파일에 대한 하드 링크를 생성합니다. 따라서 파일이 전혀 변경되지 않으면 기본적으로 백업 디스크에 복사본이 있지만 각 날짜의 백업을 나타내는 각 디렉터리에 해당 파일에 대한 100개의 하드 링크가 있습니다(예: back-1
, back-2
, ... back-n
). 합리화하고 싶다면 일부를 제거할 수 있지만 전부는 제거할 수 없습니다. back_5
, back_6
, ...을 제거하고 싶다고 가정해 보겠습니다 back_10
(예를 들어 실제 시나리오에는 더 많은 항목이 있습니다). 그런 다음 다음을 통해 병렬화하려고 합니다.
echo back_5 back_6 back_10 | xargs -n 1 -P 0 rm -rf
몇 시간이 걸립니다. 그러면 이 작업을 수행하는 더 빠른 방법이 있습니까?
답변1
어떻게 사용할 수 있는지 모르겠습니다.매개변수이것은 전혀 느리지 않습니다. 내 맨페이지에는 -P가 프로세스 수이고 -n이 인수 수라고 나와 있습니다. 특별한 값이 없으므로 -P0
무시될 수 있습니다(또는 운이 좋다면 프로세스가 0개이므로 24시간 동안 아무 것도 설명되지 않습니다!). 그리고 -n1
당신이구현하다(2) 각 파일 이름에 대해 이것은 대략 가장 느립니다.
이 작업을 병렬화하면 많은 이점을 얻을 수 있을 것으로 생각됩니다. 내 생각엔 그냥
$ echo filenames ... | xargs rm -rf
충분할 것입니다. -P4
원하는 경우 몇 가지 값을 시도해 볼 수 있습니다. 통과아니요명령줄 인수 수를 제한하면 호출이 최소화되고 /bin/rm
디스크 캐시를 통해 순차적으로 진행될 수 있습니다.
답변2
상대적으로 작은 디렉터리를 주로 삭제하기 때문에 df에서 보고하는 숫자는 더 작습니다. 또한 파일 시스템에 따라 디렉터리 변경 사항과 파일 링크 수 변경 사항이 즉시 기록되거나 디스크에 동기화됩니다. 이는 오류 복구에 중요하므로 속도가 느립니다.
이는 실제로 링크 효율성을 입증합니다!
답변3
내 경험에 따르면 rsync+하드링크 기반 백업 속도를 높이는 가장 좋은 방법은 보유한 파일 수를 줄이는 것입니다.
작은 파일이 많으면 rsync 속도가 느려집니다.많은.
대부분 작은 파일, 대부분 읽기 전용 디렉터리가 빨간색이 되도록 데이터를 구성할 수 있다면 tar
백업 스크립트 속도가 크게 향상되는 것을 볼 수 있습니다. (와 같은 도구를 사용하면 archivemount
압축을 풀지 않고도 이러한 아카이브에 액세스할 수 있습니다).
백업 스크립트를 병렬화하면 도움이 되지 않을 수 있으며 백업 스크립트 속도가 느려질 수도 있습니다(예측 가능한 디스크 액세스가 더 최적임).
답변4
이 역시 하드데이터에 근거한 답변이 아닌 경험에 근거한 답변입니다.
교차 링크가 많은 유사한 트리에서 많은 파일을 삭제할 때 고아 하위 트리를 병렬로 삭제하는 것이 더 빠른 것 같습니다. 다이어그램으로 설명해 보겠습니다.
topdir1
|-a1
|-b1
|-c1
topdir2
|-a2
|-b2
|-c2
topdir3
|-a3
|-b3
|-c3
내 생각에는 을 병렬로 삭제한 다음 계속 삭제하는 것이 병렬로 삭제하는 것보다 빠르다는 것 입니다 topdir1
. topdir2
(이에 대한 내 이론은 "동일한" 파일의 여러 병렬 연결 해제가 inode 링크 참조 수에 대한 경합을 유발한다는 것입니다. 그러나 이를 하드 데이터로 확인하지 않았다는 점을 강조합니다.)topdir3
a1
b1
c1
a2
b2
c2
for topdir in *
do
echo "Removing $topdir..."
for sub in "$topdir"/*; do rm -rf "$sub" & done
wait
rm -rf "$topdir"
done