Inode 사용 위치 결정

Inode 사용 위치 결정

저는 최근 시스템 사용량을 추적하기 위해 개발 웹 서버에 Munin을 설치했습니다. 나는 디스크 사용량이 거의 증가하지 않았음에도 불구하고 시스템의 inode 사용량이 하루에 약 7-8% 증가하고 있음을 발견했습니다. 뭔가 엄청난 양의 작은 파일을 작성하고 있는 것 같은데 무엇을/어디에서 찾을 수 없습니다.

디스크 공간 사용량을 찾는 방법을 알고 있지만 inode 사용량을 요약하는 방법을 찾을 수 없는 것 같습니다.

사용 소스를 찾을 수 있도록 디렉토리별로 inode 사용을 결정하는 좋은 방법이 있습니까?

답변1

이것이 빨리 실행될 것이라고 기대하지 마십시오 ...

많은 inode가 있는 하위 디렉토리가 있을 것으로 의심되는 디렉토리로 cd합니다. 이 스크립트에 엄청난 시간이 걸리면 파일 시스템에서 살펴볼 위치를 찾았을 것입니다. /var는 좋은 시작입니다...

그렇지 않은 경우 해당 파일 시스템의 최상위 디렉터리로 변경하고 이를 실행하고 완료될 때까지 기다리면 모든 inode가 있는 디렉터리를 찾을 수 있습니다.

find . -type d | 
while 
  read line  
do 
  echo "$( find "$line" -maxdepth 1 | wc -l) $line"  
done | 
sort -rn | less

정리 비용 걱정은 안 되네요. 테스트를 실행하고 350,000개의 디렉터리에 대해 정렬되지 않은 출력을 정렬하는 데 8초가 걸렸습니다. 초기 발견에는 . 실제 비용은 while 루프에서 이러한 모든 디렉터리를 여는 것입니다. (루프 자체에는 22초가 소요됩니다.) (테스트 데이터는 350,000개의 디렉터리가 있는 하위 디렉터리에서 실행되었으며, 그 중 하나에는 백만 개의 파일이 있었고 나머지에는 1~15개의 디렉터리가 있었습니다.)

다양한 사람들이 ls가 출력을 정렬하기 때문에 그다지 좋지 않다고 지적했습니다. 나는 에코를 시도했지만 그것도 좋지 않습니다. 다른 사람은 stat가 이 정보(디렉토리 항목 수)를 제공하지만 이식성이 없다는 점을 지적했습니다. find -max깊이는 디렉토리를 열고 .files를 계산하는 데 정말 빠르다는 것이 밝혀졌습니다. 그래서... 여기 있습니다.. 모두를 위한 포인트입니다!

답변2

파일이 너무 많은 하나의 디렉터리에 문제가 있는 경우 간단한 해결 방법은 다음과 같습니다.

# Let's find which partition is out of inodes:
$ df -hi
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3               2.4M    2.4M       0  100% /
...

# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d

이 줄 뒤에 있는 아이디어 find는 디렉토리의 크기가 해당 디렉토리 내부에 있는 파일의 양에 비례한다는 것입니다. 그래서 여기서 우리는 내부에 수많은 파일이 있는 디렉토리를 찾습니다.

숫자를 추측하고 싶지 않고 "크기"순으로 모든 의심되는 디렉터리를 나열하려는 경우에도 쉽습니다.

# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n

답변3

Grrr, 댓글을 달려면 담당자가 50명이 필요합니다. 따라서 이 답변은 실제로 Chris의 답변에 대한 의견입니다.

질문자는 아마도 모든 디렉토리에 관심을 두지 않고 최악의 디렉토리에만 관심을 가지기 때문에 sort를 사용하는 것은 매우 비용이 많이 드는 과잉 작업일 가능성이 높습니다.

find . -type d | 
while 
  read line  
do 
  echo "$(ls "$line" | wc -l) $line"  
done | 
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]'  | less

이것은 귀하의 버전만큼 완전하지는 않지만 이전 최대값보다 큰 경우 라인을 인쇄하여 인쇄되는 소음의 양을 크게 줄이고 정렬 비용을 절약합니다.

이것의 단점은 매우 큰 디렉토리가 2개 있고 첫 번째 디렉토리가 두 번째 디렉토리보다 inode가 1개 더 많은 경우 두 번째 디렉토리를 볼 수 없다는 것입니다.

더 완전한 해결책은 표시된 상위 10개 값을 추적하고 마지막에 이를 인쇄하는 더 똑똑한 Perl 스크립트를 작성하는 것입니다. 그러나 빠른 서버 오류 답변에는 너무 깁니다.

또한, 좀 더 똑똑한 Perl 스크립팅을 사용하면 while 루프를 건너뛸 수 있습니다. 대부분의 플랫폼에서 ls는 결과를 정렬하며 큰 디렉토리의 경우 비용이 매우 많이 들 수도 있습니다. 여기서는 ls 정렬이 필요하지 않습니다. 왜냐하면 우리가 관심을 갖는 것은 개수뿐이기 때문입니다.

답변4

이것은 귀하의 질문에 대한 직접적인 대답은 아니지만 find를 사용하여 최근에 수정된 작은 크기의 파일을 검색하면 검색 범위가 좁아질 수 있습니다.

find / -mmin -10 -size -20k

관련 정보