Linux 시스템의 rm -rf가 느립니다.

Linux 시스템의 rm -rf가 느립니다.

많은 파일이 포함된 디렉터리에서 실행하면 rm -rf /some/folder/*서버 성능이 크게 저하됩니다 . 드라이브는 프리미엄 SSD입니다.

파일을 삭제하는 다양한 방법을 시도했습니다: find --delete, rsync(설명여기). 도움이 안돼.

내 경험에 따르면 이는 Azure 문제입니다.

"느리다"는 것은 2분 30초 안에 116,000개의 파일이 처리된다는 의미입니다. 로컬에서는 1초가 걸립니다. 다른 서버 제공업체도 1~3초 정도 소요됩니다.

서버의 전반적인 성능에 영향을 주지 않고 많은 파일을 빠르게 삭제할 수 있는 방법이 있습니까?

답변1

서버의 전반적인 성능에 영향을 주지 않고 많은 파일을 빠르게 삭제할 수 있는 방법이 있습니까?

당신은 속일 수 있습니다. 불행하게도 그것은 문제를 해결하지 못하고 단지 밀어낼 뿐입니다. 반면에 이는 유용한 해결 방법이 될 수 있습니다.

바꾸다

rm -rf /some/folder/*

사용

items=(/some/folder/*)                      # List of items to delete
prefix=".DELETE_ME.$$"

for item in "${items[@]}"
do
    x="$${item%/*}/.$prefix.${item##*/}"    # New temporary path for item to delete
    mv -f "$item" "$x" || rm -rf "$item"    # Rename or delete
done

for item in "${items[@]}"
do
    x="$${item%/*}/.$prefix.${item##*/}"
    rm -rf "$x"                             # Delete whatever is left
done >/dev/null 2>&1 &                      # Run sequentially in background

이를 스크립트(파싱된 매개변수 사용 for item in "$@") 또는 쉘 함수로 래핑할 수 있습니다.

나는 여러 번의 삭제를 동시에 수행하여 서버 성능을 저하시키지 않도록 더 분명한 "백그라운드에서 이름 바꾸기 및 삭제" 대신 두 개의 루프를 사용했습니다. 효과를 예방할 수는 없지만 제거 속도를 높이는 데 도움이 될 수 있습니다.

답변2

내 생각에 당신이 가질 수 있는 문제는 디렉토리에서 116000개의 파일을 삭제하려고 한다는 것입니다. 디렉터리에서 n개의 파일을 삭제하려면 n번이 필요합니다. 그리고 그것은 매우 느릴 것입니다. 심지어 곤경에 ls -l빠지기 도 합니다 find. 직선은 /bin/ls모든 파일에 액세스할 필요가 없기 때문에 여전히 매우 빠릅니다.

비결은 애초에 한 디렉토리에 그렇게 많은 파일을 저장하지 않는다는 것입니다. 대신 여러 디렉터리 수준을 만듭니다.

실패하면 삭제될 때까지 잠시 기다려야 합니다.

답변3

당신은 그것을 사용할 수 있습니다 -exec rm -rf {} \;:

find /some/dir/ -type f -exec rm -rf {} \;

이 명령은 디렉토리의 모든 파일을 삭제합니다/some/dir

관련 정보