ext3 / linux에서`rm`을 빠르게 만드는 방법은 무엇입니까?


32

기본 옵션으로 ext3 파일 시스템을 마운트했습니다. 그것에 ~ 100GB 파일이 있습니다.

이러한 파일을 제거하면 시간이 오래 걸리고 (8 분) 많은 io 트래픽이 발생하여 서버의로드가 증가합니다.

rm을 파괴적이지 않게 만드는 방법이 있습니까?


4
기본적으로 여기에서 방법이 작동하지 않아서 자체 개발했습니다. 여기에 설명되어 있습니다 : depesz.com/index.php/2010/04/04/how-to-remove-backups

답변:


14

가장 흥미로운 답변은 원래 질문에 대한 의견에 묻혔습니다. 여기에 더 눈에 잘 띄는 첫 번째 답변이 있습니다.

기본적으로 여기에서 방법이 작동하지 않아서 자체 개발했습니다. 여기에 설명되어 있습니다 : http://www.depesz.com/index.php/2010/04/04/how-to-remove-backups/ – depesz 4 월 6 일 10시 15 분 15 초

이 링크는 실행 가능한 솔루션의 탐색과 발견에 대한 엄청나게 철저한 분석입니다.

참고 사항 :

기사는 말합니다 :

보시다시피, 나는 -c2 -n7이온화 하는 옵션을 사용했습니다 .

사실이지만 TafT 사용자는 중단을 원하지 않으면 -c3'유휴'가 -c2'최선의 노력' 보다 더 나은 선택 이라고 말합니다 . 그는 -c3백그라운드에서 빌드 하는 데 사용 했으며 빌드가 기다릴 필요없이 잘 작동한다는 것을 알았습니다. 실제로 100 % io 사용률을 가진 경우 -c3삭제가 완료되지는 않지만 실제로 테스트 한 결과를 기대하지는 않습니다.


18

익스텐트를 사용하는 ext4 또는 다른 최신 파일 시스템으로 업그레이드하십시오. ext3은 익스텐트 대신 간접 블록 체계를 사용하기 때문에 대용량 파일을 삭제하면 많은 작업이 필요합니다.



4

효율성 측면에서 파일 당 하나의 rm을 사용하는 것은 각 rm에 대해 포크와 exec가 필요하므로 최적이 아닙니다.

제거하려는 파일이 들어있는 list.txt가 있다고 가정하면 더 효율적이지만 여전히 느릴 것입니다.

xargs -i rm {} < list.txt

또 다른 접근법은 다음과 같습니다. nice -20 xargs -i rm {} < list.txt
(시간이 덜 걸리지 만 시스템에 큰 영향을 미칩니다.)

또는

이것이 얼마나 빠를 지 모르겠지만 :

mv <file-name> /dev/null 

또는

루프 파일?을 사용하여 빠른 파일 시스템으로 특수 마운트 포인트를 작성하고이를 사용하여 거대한 파일을 저장하고 삭제하십시오.
(파일을 삭제하기 전에 파일을 이동하거나, 더 빠르거나 파일을 원치 않을 때 마운트 해제 할 수 있음)

또는

cat /dev/null > /file/to/be/deleted(지금은 크기가 0입니다.) rm -rf <file>지금 사라지고 싶다면

또는 더 나은

고양이를 버리고 그냥 # > /file/to/be/emptied


글쎄, 1 파일을 제거 하고 있으므로 오버 헤드가 없습니다.

stackoverflow.com/questions/1795370/…- 이것도 확인하십시오

1

합리적인 속도로 디렉토리를 삭제하는 데 문제가 있었고 프로세스가 디스크를 잠그고 디스크에 액세스하려고하는 프로세스 더미를 생성하는 것으로 나타났습니다. ionice가 작동하지 않았기 때문에 디스크 IO의 99 %를 계속 사용하고 다른 모든 프로세스를 잠갔습니다.

나를 위해 일한 파이썬 코드는 다음과 같습니다. 한 번에 500 개의 파일을 삭제 한 후 다른 프로세스가 작업을 수행 할 수 있도록 2 초의 휴식이 필요합니다. 잘 작동합니다.

import os, os.path
import time

for root, dirs, files in os.walk('/dir/to/delete/files'):
    file_num = 0
    for f in files:
        fullpath = os.path.join(root, f)
        os.remove(fullpath)
        if file_num%500 == 1:
            time.sleep(2)
            print "Deleted %i files" % file_num
        file_num = file_num + 1

1
ext3 파일 시스템의 100G + 파일에서 사용해보십시오. 문제는 파일 수가 아닌 단일 파일의 크기입니다.

귀하의 경우에는 작동하지 않는 것 같습니다. 그러나 나는 많은 작은 파일을 가지고있었습니다. 피드백 감사드립니다.
Nick Woodhams

1

내 두 센트

나는 이미이 문제를 겪었다. "빠르게 실행되어야하는 순차 스크립트에서 프로세스는 많은 파일을 제거합니다." "rm"은 해당 스크립트 속도를 IO 대기 / 실행 시간에 가깝게 만듭니다.

그래서 일을 더 빨리하기 위해 가비지 콜렉터와 같이 cron ..마다 실행되는 다른 프로세스 (bash 스크립트)를 추가하여 특정 디렉토리의 모든 파일을 제거합니다.

그런 다음 "rm"을 mv로 "garbage folder"로 바꾸어 원본 스크립트를 업데이트했습니다 (충돌을 피하기 위해 이름 끝에 카운터를 추가하여 파일 이름을 바꿉니다).

이것은 나를 위해 작동합니다. 스크립트는 최소 3 배 빠르게 실행됩니다. 그러나 파일 폴더를 피하기 위해 가비지 폴더와 원본 파일이 동일한 마운트 지점 (동일한 장치)에있는 경우에만 잘 작동합니다. (동일한 장치에서 mv는 rm보다 적은 IO를 소비합니다)

도움이 되길 바랍니다 ..


0

또한 로드에 대한 해결 방법으로 ionice 를 제안하는 Dennis Williamson의 답변은 블록 장치가 CFQ io 스케줄러를 사용하는 경우에만 작동합니다.


0

백업을 저장할 루프 파일 시스템을 만들 수 있습니다.

# dd if=/dev/zero of=/path/to/virtualfs bs=100M count=1024 # 100 MB * 1024 = 100 GB
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop

그런 다음 백업을 지우려면 다음을 수행하십시오.

# umount /mnt/backups
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop

프레스토 악장! 전체 가상 파일 시스템이 순식간에 지워집니다.


주어진 파일 시스템에서 모든 백업을 제거하려는 경우에만 작동하므로 문제를 해결하지 못합니다.

0

xargs를 사용하여 멀티 타이 딩을 사용할 수 있습니다

find . -type f | xargs -P 30 rm -rf 

여기서 30은 작성하려는 스레드 수입니다. 0을 사용하는 경우 시스템은 작업을 실행하는 사용자가 사용할 수있는 최대 스레드를 만듭니다.


1
find-delete훨씬 더 나은 대안이 옵션을 선택합니다.
Ariel

0

mv <파일 이름> / dev / null

/ dev / null은 디렉토리가 아닌 파일입니다. 파일을 파일로 옮길 수 없거나 덮어 쓸 위험이 있습니다.

루프 파일?을 사용하여 빠른 파일 시스템으로 특수 마운트 포인트를 작성하고이를 사용하여 거대한 파일을 저장하고 삭제하십시오. (파일을 삭제하기 전에 파일을 이동하거나, 더 빠르거나 파일을 원치 않을 때 마운트 해제 할 수 있음)

나는 이것이 실용적이지 않다고 생각한다. OP가 원하는 것보다 불필요하게 더 많은 I / O를 사용합니다.


-1

/ dev / null은 디렉토리가 아닌 파일입니다. 파일을 파일로 옮길 수 없거나 덮어 쓸 위험이 있습니다.

실제로는 장치이며 장치에 기록 된 모든 데이터는 폐기되므로 mv <file> /dev/null의미가 있습니다.

Wikipedia에서 무료 백과 사전
Unix와 같은 운영 체제에서 / dev / null 또는 null 장치는 쓰여진 모든 데이터를 버리고 (쓰기 작업이 성공했다고보고) 특별한 프로세스에 데이터를 제공하지 않는 특수 파일입니다. 그것으로부터 읽습니다 (즉시 EOF를 나타냄). [1]


1
그것은 틀리고 믿을 수 없을 정도로 위험합니다. / dev / null은 특별한 파일과 같은 객체 인 장치입니다. 루트라면 "mv / some / file / dev / null"은 특별한 / dev / null 장치를 삭제하고 파일을 그곳으로 옮깁니다! 다음에 누군가가 / dev / null을 사용하려고하면 장치 대신 실제 파일을 사용하게되고 재난이옵니다. (Wikipedia가 "기록 된 모든 데이터를 버린다"고 말하면, "cat / some / file> / dev / null"은 / some / file을 읽고 읽은 데이터를 버린다. 원본 파일).
user9876
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.