980MB 메타데이터가 있는 디렉토리, 수백만 개의 파일, 삭제하는 방법은 무엇입니까? (ext3)

980MB 메타데이터가 있는 디렉토리, 수백만 개의 파일, 삭제하는 방법은 무엇입니까? (ext3)

가능한 중복:
수백만 개의 파일이 있는 디렉토리에 rm

안녕하세요,

그래서 저는 이 디렉토리에 갇혀있습니다:

drwxrwxrwx 2 dan users 980M 2010-12-22 18:38 sessions2

디렉토리 내용은 작습니다. 수백만 개의 작은 파일에 불과합니다.

파일 시스템에서 지우고 싶지만 그렇게 할 수 없습니다. 내 첫 번째 시도는 다음과 같습니다.

find sessions2 -type f -delete

그리고

find sessions2 -type f -print0 | xargs -0 rm -f

하지만 두 가지 모두 메모리 사용량이 증가했기 때문에 중지해야 했습니다. 한때 시스템 메모리의 65%를 사용하고 있었습니다.

그래서 나는 그것이 dir_index가 시스템에서 활성화되어 있다는 사실과 관련이 있다고 생각했습니다(의심할 바 없이 틀렸습니다). 아마도 find가 전체 인덱스를 메모리로 읽으려고 시도했을 것입니다.

그래서 나는 (어리석게도) 이렇게 했습니다.tune2fs -O^dir_index /dev/xxx

좋아요, 그러면 됩니다. 위의 명령을 다시 실행했는데 find... 똑같았습니다. 미친 메모리 사용량.

서둘러 tune2fs -Odir_index /dev/xxxdir_index를 다시 활성화하고 Server Fault로 실행했습니다!

질문 2개:

1) 내 라이브 시스템에서 이 디렉토리를 어떻게 제거합니까? 메모리와 CPU를 적게 사용하는 한 시간이 얼마나 걸리는지는 상관하지 않습니다. 그건 그렇고, 를 사용하면 nice find ...CPU 사용량을 줄일 수 있었으므로 지금 내 문제는 메모리 사용량뿐입니다.

2) dir_index를 약 20분 동안 비활성화했습니다. 그 동안 파일 시스템에 새 파일이 기록되었다는 것은 의심의 여지가 없습니다. dir_index를 다시 활성화했습니다. 이는 파일 이름이 이전 인덱스에서 누락되므로 dir_index가 다시 활성화되기 전에 작성된 파일을 시스템이 찾을 수 없다는 의미입니까? 그렇다면 이러한 새 파일이 중요하지 않다는 것을 알고 있다면 이전 색인을 유지할 수 있습니까? 그렇지 않은 경우 인덱스를 어떻게 다시 작성합니까? 라이브 시스템에서 수행할 수 있습니까?

감사해요!

답변1

이 질문을 참조하세요:수백만 개의 파일이 있는 디렉토리에 rm

이것이 내 답변이었지만 다른 훌륭한 답변도 있었습니다.

이 파일 시스템의 다른 모든 파일을 임시 저장 위치에 백업하고 파티션을 다시 포맷한 다음 파일을 복원할 수 있습니까?

답변2

나는 현재 디렉터리를 다른 곳으로 옮기고 새 디렉터리를 만든 다음 이전 디렉터리를 제거하고 싶습니다.

mv dirname dirname.old; mkdir dirname ls -ld dirname dirname.old # 권한이 올바른지 확인 rm -rf dirname.old

이는 실수로 다시 실행할 수 있는 기록에 "rm -rf dirname"이 발생하지 않는다는 추가 이점이 있습니다. :-)

"rm -rf"는 아주 적은 메모리 오버헤드만 사용하여 디렉토리를 제거해야 합니다. 그러나 이전에 실행한 "찾기" 명령도 오버헤드 메모리를 많이 사용해서는 안 됩니다. 메모리 사용량을 어떻게 측정하고 있나요?

"free" 명령 출력의 "free" 열을 보고 이 메모리 사용량을 측정하는 것이 아닙니다. 그렇죠? Linux는 디스크 캐싱에 사용되지 않은 메모리를 사용하고 "free" 아래의 맨 위 열에서는 이를 고려하지 않기 때문입니다. 프로그램 중 하나에서 메모리 사용이 표시됩니까? 어느 것? "ps awwlx --sort=vsz"는 프로그램을 사용하여 큰 메모리를 보여주고 마지막에 큰 메모리로 정렬됩니다.

답변3

문제는 xargs에 파이핑하고 있다는 것입니다. 아마도 거기에서 메모리를 모두 먹어치울 것입니다. find에는 삭제 옵션이 있습니다.

find sessions2 -type f -delete

답변4

흠 미친 아이디어인데 효과가 있을지 모르겠네요. 일괄적으로 하려고 하면 어떻게 되나요? 먼저 디렉토리의 이름을 바꾸고 새로운 빈 디렉토리를 생성하여 새 파일이 방해가 되지 않도록 하세요. 그런 다음 dir의 내용을 출력하십시오. 텍스트 파일로. 그런 다음 해당 파일을 살펴보고 한 번에 100개의 파일을 제거하고 그 사이에 잠자고 동기화하시겠습니까?

관련 정보