대규모 디렉토리 트리에서 rm -rf를 수행하는 데 몇 시간이 걸립니다.


20

백업에 rsnapshot을 사용하고 있습니다. 백업 된 파일의 많은 스냅 샷을 유지하지만 오래된 파일은 삭제합니다. 이거 좋다 그러나 rm -rf거대한 디렉토리 트리에서 작업하는 데 약 7 시간이 걸립니다 . 파일 시스템은 XFS입니다. 나는 얼마나 많은 파일이 있는지 확실하지 않지만 아마도 수백만에 달합니다.

어쨌든 속도를 높일 수 있습니까? rm -rf시간과 시간이 같지 않고 같은 명령이 있습니까?


1
나는 사용 find . -delete -name directory했고 그것은 훨씬 빠르다 rm -rf.
Paolo

답변:


38

아니.

rm -rfunlink()모든 파일을 호출하여 파일 시스템의 재귀 깊이 우선 순회를 수행합니다 . 프로세스가 느리게 진행되는 두 가지 작업은 opendir()/ readdir()unlink()입니다. opendir()그리고 readdir()디렉토리에있는 파일의 수에 따라 달라집니다. unlink()삭제되는 파일의 크기에 따라 다릅니다. 더 빨리 진행할 수있는 유일한 방법은 파일의 크기와 수를 줄이거 나 (아마도 의심스럽지 않은) 파일 시스템을 해당 작업에 더 좋은 특성을 가진 파일 시스템으로 변경하는 것입니다. XFS는 큰 파일의 unlink ()에는 좋지만 큰 디렉토리 구조에는 좋지 않다고 생각합니다. ext3 + dirindex 또는 reiserfs가 더 빠를 수 있습니다. 나는 JFS가 얼마나 잘 운임을 확신하지 못하지만 다른 파일 시스템 성능에 대한 벤치 마크가 많이 있다고 확신합니다.

편집 : XFS는 나무를 삭제하는 데 끔찍한 것 같아 파일 시스템을 확실히 변경하십시오.


1
몇 년 전 비슷한 사용 사례에서 reiserfs를 사용하여 끔찍한 성능을 발견했습니다.
knweiss

1
놀라운 포스트!
wzzrd

2
그것은 거의 "아니오"라고 말했다 :)
David Pashley

2
링크 해제 속도가 파일 크기에 의존한다는 귀하의 진술 외에는 여기의 모든 내용에 동의합니다. unlink는 파일에 대한 링크를 제거하고 실제 내용에는 아무런 영향을 미치지 않습니다. 크기가 다른 파일간에 식별 가능한 차이가 없어야합니다 (이를 직접 테스트 할 수 있음).
Kamil Kisiel

@KamilKisiel 당신은 올바른 unlink내용을 말하지만 unlink시스템 호출 을 수행하기 위해 올바른 말 을하고 있지만 , 파일 시스템 코드는 제거 된 링크가 파일에 대한 마지막 링크이고 현재 열려 있지 않은 경우 더 많은 작업을해야합니다. 이것은 물론 파일 시스템에 따라 다르지만 제거 된 파일이 크면 매우 뚜렷한 차이가있을 수 있습니다.
jlliagre

22

대안으로, 디렉토리를 한쪽으로 이동하고 동일한 이름, 권한 및 소유권으로 다시 작성하고 해당 디렉토리에 관심이있는 앱 / 서비스를 다시 시작하십시오.

그런 다음 확장 된 중단에 대해 걱정할 필요없이 백그라운드에서 원래 디렉토리를 "nice rm"할 수 있습니다.


mv는 매우 빠르기 때문에 작동 할 수 있습니다.
Rory

예-잘 작동합니다. 이 기술을 여러 번 사용하여 전자 메일 클라이언트가 두뇌를 잃어 버리고 디스크에 혼란을 일으키는 maildir 기반 사서함을 "수정"했습니다. 이 방식으로 수정 한 가장 큰 (단일) 디렉토리에는 약 150 만 또는 2 백만 개의 파일 IIRC가있었습니다. 최종 사용자의 총 가동 중지 시간은 ~ 3 분으로 대부분 메일 클라이언트와 imap 프로세스가 종료되기를 기다리고있었습니다.
Greg Work

7

XFS에 올바른 마운트 옵션이 설정되어 있는지 확인하십시오.

XFS와 함께 -ologbufs = 8, logbsize = 256k를 사용하면 삭제 성능이 세 배가됩니다.


2
이 팁에 +1 ... 또 다른 성능 향상을 위해 게으른 카운터를 활성화해야합니다.
hurikhan77

1
이 설정에 대한 설명은 향후 독자에게 도움이 될 것입니다.
Aron Rotteveel

5

파일 수준에서 rm을 효과적으로 수행하는 경우 시간이 오래 걸립니다. 이것이 블록 기반 스냅 샷이 좋은 이유입니다.)

rm을 별도의 영역으로 나누고 병렬로 시도해 볼 수는 있지만 개선을 기대할 수는 없습니다. XFS는 파일을 삭제하는 데 문제가있는 것으로 알려져 있으며, 이것이 수행하는 작업의 많은 부분 인 경우 다른 파일 시스템 일 수 있습니다.


이 경우 블록 기반 스냅 샷은 고유하지 않습니다. WAFL 및 ZFS와 같은 여러 파일 시스템은 스냅 샷 삭제 성능을 향상시킵니다. 스냅 샷을 일급 파일 시스템 객체로 취급합니다. 따라서 해제 할 블록을 결정하기 위해 수백만 개의 파일을 (천천히) 반복하는 대신 스냅 샷과 관련된 차단 목록 만 살펴 봐야합니다.
Keith Smith

흠. 나는 아마도 위와 반대되는 것으로 나왔다. 원래 포스터는 Linux를 사용하고 있어야하며 btrfs와 nilf는 미래에는 흥미로워 보이지만 실제로 스냅 샷을 수행하는 입증 된 Linux 파일 시스템은 없습니다. 실제적으로는 블록 기반 스냅 샷을 사용하는 것이 더 좋습니다.
Keith Smith

팁이 워크로드를 분할하고 병렬화하려면 +1 : xfs는 병렬 워크로드에서 강력합니다.
hurikhan77

5

사용 된 파일 시스템에 관계없이 IO를 많이 사용하는 작업에는 ionice를 사용하는 것이 좋습니다.
나는이 명령을 제안한다 :

ionice -n7 좋은 rm -fr dir_name

IO로드가 많은 서버에서 백그라운드 작업에 적합합니다.


2

나는 이것이 오래되었다는 것을 알고 있지만 제안에서 id toss를 생각했습니다. 병렬 rm 작업을 실행하면 작업 속도가 빨라질 수 있습니다.

http://savannah.nongnu.org/projects/parallel/ 병렬은 일반적으로 xargs 대신 사용할 수 있습니다

deltedir에서 모든 파일을 삭제하면

find -t f deletedir | parallel -j 10 rm

빈 디렉토리 구조를 삭제하면됩니다.

참고 : 위에서 언급 한 것처럼 여전히 파일 시스템 제한에 부딪 칠 수 있습니다.


xargs보다 병렬을 사용하면 어떤 이점이 있습니까?
Rory

1

rm을 수행하는 대신 실제 파일 시스템을 정크 및 재구성 할 수있는 방식으로 데이터를 분리하는 대안 옵션이 있습니까?


3
rsnapshot은 여러 스냅 샷을 효율적으로 유지 관리하는 기능의 일부로 하드 링크를 사용한다고 생각합니다. 따라서 질문자가 별도의 파일 시스템을 사용하여 해당 기능을 사용하는 경우 (파일 시스템 경계를 통해 하드 링크 할 수 없으므로) 작동하지 않습니다.
David Spillett

0

명령의 훌륭함을 줄이는 것은 어떻습니까? 처럼:

nice -20 rm -rf /path/to/dir/

5
병목 현상은 스케줄러가 아니라 파일 시스템입니다.
Manuel Faux

스케쥴러에 병목 현상이 발생하는 경우 I / O 하위 시스템을 두드리기 만하면 rm 동안 서버를 더 적게 사용할 수있게됩니다.
David Mackintosh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.