하드링크를 사용하는 백업을 얇게 만드는 가장 효율적인 방법

하드링크를 사용하는 백업을 얇게 만드는 가장 효율적인 방법

동일한 머신에 대해 서로 다른 날짜의 수백 개의 백업이 포함된 백업 디스크가 있습니다. 백업은 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

나는 당신이 어떻게 사용하는지 볼 수 없습니다xargs이런 식으로는 전혀 느리지 않습니다. 내 맨페이지에는 -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, 을 병렬로 삭제하는 것보다 , , 을 병렬로 삭제한 다음 , , 등 으로 이동하는 topdir3것이 더 빠른 것 같습니다 . (이에 대한 내 이론은 "동일한" 파일의 다중 병렬 연결 해제가 inode 링크 참조 수에 대한 경합을 유발한다는 것입니다. 그러나 이를 하드 데이터로 확인하지 않았다는 점을 강조합니다.)a1b1c1a2b2c2

for topdir in *
do
    echo "Removing $topdir..."
    for sub in "$topdir"/*; do rm -rf "$sub" & done
    wait
    rm -rf "$topdir"
done

관련 정보