배경 : 실제 서버, 약 2 년 된 3Ware RAID 카드에 연결된 7200RPM SATA 드라이브, ext3 FS 탑재 noatime 및 데이터 . 디렉토리에는 수백 개의 작은 (~ 100 바이트) 파일과 더 큰 (몇 KB) 파일이 포함 된 하위 디렉토리가 없습니다.
우리는 지난 몇 달 동안 약간의 뻐꾸기가 된 서버를 가지고 있지만, 너무 많은 파일을 포함하고 있기 때문에 디렉토리에 쓸 수 없었던 다른 날에만 서버를 발견했습니다. 특히, / var / log / messages에서이 오류가 발생하기 시작했습니다.
ext3_dx_add_entry: Directory index full!
문제의 디스크에는 많은 inode가 남아 있습니다.
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 60719104 3465660 57253444 6% /
그래서 그것은 우리가 디렉토리 파일 자체에있을 수있는 항목 수의 한계에 도달했음을 의미합니다. 얼마나 많은 파일이 될지 모릅니다. 그러나 3 백만 개 이상이 될 수 있습니다. 그게 좋은 게 아니에요 그러나 그것은 내 질문 중 하나입니다. 정확히 그 상한은 무엇입니까? 조정 가능합니까? 나는 외쳤다하기 전에에서-I는 조정을 원하는 아래로 ; 이 거대한 디렉토리는 모든 종류의 문제를 일으켰습니다.
어쨌든, 우리는 모든 파일을 생성하는 코드에서 문제를 추적하고 수정했습니다. 이제 디렉토리 삭제에 붙어 있습니다.
몇 가지 옵션은 다음과 같습니다.
rm -rf (dir)
나는 이것을 먼저 시도했다. 나는 눈에 띄는 영향없이 하루 반 동안 도망 간 후에 그것을 포기하고 죽였습니다.
- 디렉토리에서 unlink (2) : 고려할 가치가 있지만, unlink (2)를 통해 삭제하는 것보다 fsck를 통해 디렉토리 내의 파일을 삭제하는 것이 더 빠른지 여부가 문제입니다. 즉, 어떤 식 으로든, 나는 그 inode를 사용되지 않은 것으로 표시해야합니다. 이것은 물론 fsck가 / lost + found에있는 파일에 항목을 삭제하지 않도록 지시 할 수 있다고 가정합니다. 그렇지 않으면 방금 문제를 옮겼습니다. 다른 모든 관심사에 더하여, 이것에 대해 조금 더 읽은 후에, 내가 찾을 수있는 unlink (2) 변형 중 어느 것도 내가 거칠게 삭제할 수 없기 때문에 내부 FS 함수를 호출해야 할 것입니다 항목이있는 디렉토리 푸우
while [ true ]; do ls -Uf | head -n 10000 | xargs rm -f 2>/dev/null; done )
이것은 실제로 단축 버전입니다. 내가 실행중인 실제 파일은 진행률 보고서를 추가하고 삭제할 파일이 부족할 때 깨끗하게 중지하는 것입니다.
수출 i = 0; 시간 (while [true]; do LS -Uf | 헤드 -n 3 | grep -qF '.png'|| 단절; LS -Uf | 헤드 -n 10000 | xargs rm -f 2> / dev / null; 수출 i = $ (($ i + 10000)); 에코 "$ i ..."; 완료)
이것은 오히려 잘 작동하는 것 같습니다. 이 글을 쓰면서 지난 30 분 동안 26 만 개의 파일이 삭제되었습니다.
- 위에서 언급했듯이 디렉토리 별 항목 제한은 조정 가능합니까?
- 왜에 의해 반환 된 목록의 첫 번째 하나 하나의 파일을 삭제 "실제 7m9.561s / 사용자 0m0.001s / SYS의 0m0.001s"을 했는가
ls -U
, 그리고 그것은으로 처음 10,000 개 항목을 삭제 아마도 십분했다 3 번 명령을했지만 이제는 아주 행복하게 지내고 있습니까? 그 문제로 약 30 분 만에 260,000을 삭제했지만 이제 60,000 개를 더 삭제하는 데 15 분이 더 걸립니다. 왜 큰 속도로 스윙합니까? - 이런 종류의 일을하는 더 좋은 방법이 있습니까? 디렉토리에 수백만 개의 파일을 저장하지 마십시오. 나는 그것이 어리 석다는 것을 안다. 그리고 그것은 내 시계에서 일어나지 않았을 것이다. 문제를 탐색하고 SF와 SO를 살펴보면
find
몇 가지 자명 한 이유로 내 접근 방식보다 훨씬 빠르지 않은 많은 변형이 제공 됩니다. 그러나 Delete-via-fsck 아이디어에는 다리가 있습니까? 아니면 다른 것이 있습니까? 즉시 사용 가능한 (또는 잘 알려지지 않은 내부에서) 생각을 듣고 싶습니다.
최종 스크립트 출력! :
2970000...
2980000...
2990000...
3000000...
3010000...
real 253m59.331s
user 0m6.061s
sys 5m4.019s
따라서 3 시간 동안 3 백만 개의 파일이 약간 삭제되었습니다.
rm -rfv | pv -l >/dev/null
. EPEL 저장소 에서 pv를 사용할 수 있어야 합니다.