Linux에서 수십억 개의 파일을 효과적으로 삭제하는 방법은 무엇입니까?

Linux에서 수십억 개의 파일을 효과적으로 삭제하는 방법은 무엇입니까?

수년에 걸쳐 스토리지 시스템은 개정판 백업에서 17억 개의 파일을 수집했으며 이미 어느 정도 가득 찼습니다.

그래서 5년이 넘은 모든 파일을 삭제하기 시작했습니다. 나는 약 90TByte의 데이터를 포함하는 약 17억(!!!)개의 파일이 있다고 가정합니다. 단지 find 또는 du에만 몇 주 또는 몇 달이 걸리기 때문에 추정해야 합니다. 백엔드 자체(mdraid, ext4)는 어쨌든 변경하고 싶기 때문에 실제로는 그다지 중요하지 않습니다.

하루 동안 파일을 rm 삭제하도록 했는데 전체 파일의 약 0.1%만 삭제되었습니다. 이런 식으로 모든 것을 삭제하려면 1~2년 정도 걸릴 것으로 예상됩니다. 이 작업을 수행하는 동안 일부 드라이브가 종료될 가능성이 높습니다. 너무 걱정되는 것은 아닙니다. Hotswap RAID입니다.

나는 드라이브가 일반적으로 하루에 1-2시간 동안 과부하 상태에 있기 때문에 디스크 스래싱을 ​​방지하기 위해 드라이브가 사용 중이지 않을 때만 파일이 삭제되도록 ionice -c3을 사용해 왔습니다. 다소 흥미로운 측면은 제가 처음 rm을 실행하려고 시도했을 때 수백만 개의 하드 링크로 인해 메모리 사용량이 약 100GByte로 증가한 다음 코어 덤프가 발생했다는 것입니다. 그래서 작업을 더 작은 조각으로 나누고 단일 하위 디렉터리만 삭제하면 파일이 작동하지만 여전히 최고치는 20-30GByte입니다.

내 두 가지 질문:

  1. 몇 년이 걸리지 않는 방식으로 이 시스템의 오래된 파일을 어떻게 삭제합니까?

예를 들어, 파일은 사라졌지만 공간은 반환되지 않도록 Inode-Structures를 수동으로 편집한 다음 fsck가 시스템을 복구하도록 하는 것을 고려했습니다.

다른 미친 아이디어도 환영합니다. LVM 스냅샷을 찍어 언제든지 복구할 수 있습니다.

  1. 나중에 같은 문제가 발생하지 않도록 하려면 어떤 설정이 있나요? 예를 들어. 다양한 파일 시스템, 다양한 툴체인을 사용하고 SSD에 메타데이터(inode, 할당 테이블 등)를 넣습니다. 데이터 자체는 여러 가지 이유로 HD에 유지되어야 합니다.

아무도 더 나은 아이디어를 갖고 있지 않으면 내가 만드는 개정 수를 대폭 줄이고/또는 한 달이 넘은 모든 것을 외부 USB 드라이브로 tar/xz할 것입니다. 사용자는 실제로 개정판의 오래된 콘텐츠에 액세스하는 것을 좋아하기 때문에 이는 좋지 않습니다.

답변1

시스템에 액세스하여 실험하지 않으면 무엇이 효과가 있고 무엇이 도움이 되는지, 무엇이 효과가 없는지 확인하기가 어렵습니다. 하지만 다음은 이를 수행하는 방법입니다.

즉, 필요하지 않은 파일을 삭제하지 말고 mv디렉터리에서 삭제한 다음(이 작업은 빠른 작업이어야 함) 해당 파일을 0 크기로 자릅니다(공간을 확보하기 위해). rm디렉터리를 볼 수 있습니다. 나중에 (파일을 완전히 삭제하고 inode를 다시 가져오기 위해) 이 3단계는 시스템 로드에 따라 병렬로 또는 순차적으로 완료될 수 있습니다.

세부정보:
X 디렉터리를 생성합니다.
쉘 스크립트 S1에서는 mv약 N=500개의 원치 않는 파일을 X/latest에 넣고 X/X1로 이름을 바꾸고 mv다음 N개의 원치 않는 파일을 X/latest에 넣고 이름을 바꿉니다. X/X2의 경우 mv다음 N개의 원치 않는 파일을
넣습니다 . X/latest에 넣고 X/X1, X/X2, X/X3으로 이름을 바꾸고 파일을 0 크기로 자르고 디렉터리 이름을 X/ 0X1
, 으로 바꿉니다.rm

여기서 디렉토리 이름 지정은 각 쉘 스크립트가 독립적이고 다른 스크립트를 방해하지 않도록 보장합니다. S1은 X/latest와 함께 작동하고 S2는 X/X1, X/X2, X/X3...과 함께 작동합니다. /0X1, X/0X2, X/0X3...: 충돌이 없습니다!

시스템 부하에 따라 3단계 각각을 병렬로 완료할 수 있는지, 순차적으로 완료할 수 있는지 확인하세요. N을 변경하고 nice&를 사용 ionice하여 sleep시스템 로드를 제어합니다.

대체 제안:
새 위치를 사용하여 최신 버전을 저장하고 기본적으로 사용자가 그곳에서 볼 수 있도록 하세요. 이 새 위치( cp또는) 를 지난 1개월 동안 생성된 수정본으로 채울 수도 있습니다. 사용자가 "모든 개정판"을 원하는 경우 이전 위치에만 접근할 수 있습니다. 이렇게 하면 이전 위치가 커지지 않습니다. 그런 다음 시스템에 부하를 주지 않고도 필요하지 않은 매우 오래된 개정판을 쉽게 삭제할 수 있습니다.mv

rm

답변2

더 큰 커밋 간격(상대적으로 절약되지만 도움이 되지 않음)을 사용하거나 nobarrier마운트된 파티션을 사용할 수 있습니다(도움이 되어야 함). 이는 정전이나 커널 패닉이 발생할 경우 매우 위험합니다.

비동기 I/O 마법이 도움이 될 수 있지만 어떤 도구도 추천할 수는 없습니다.

관련 정보