계산하지 않고 디렉토리에 파일 수를 확인하는 방법은 무엇입니까?

계산하지 않고 디렉토리에 파일 수를 확인하는 방법은 무엇입니까?

트래픽이 많은 웹 서버에 심각한 문제가 있습니다. PHP 페이지의 속도가 눈에 띄게 느려지고 이는 데이터베이스의 테이블을 참조하는 페이지나 액세스 세션에서만 발생하는 문제인 것 같습니다. "/var/log/messages" 로그 파일에 다음과 같은 오류가 수십만 개 표시됩니다. "Kernel: EXT4-fs warning (device dm-0): ext4_dx_add_entry: 디렉터리 인덱스가 꽉 찼습니다!"

Filezilla에서 폴더를 열 수 없고 grep을 사용하여 파일/하위 디렉터리 수를 계산할 수 없기 때문에 '/var/lib/php/sessions'에 병목 현상이 있는 것 같습니다. 이는 하드 드라이브 손상일 가능성이 높지만 먼저 해당 디렉토리 내의 파일 수를 확인하여 직감을 확인하고 싶었습니다.

폴더에 있는 파일 수를 실제로 계산하지 않고 폴더에 있는 파일 수를 어떻게 알 수 있습니까?

답변1

디렉토리의 크기( 그림 참조 ls -ld /var/lib/php/sessions)를 통해 알 수 있습니다. 파일이 작으면 파일이 많지 않습니다. 크면 거기에 항목이 많을 수도 있고, 과거에 항목이 많았을 수도 있습니다.

파일을 개별적으로 나열 하지 않는 한 stat, 내용 나열은 동일한 크기의 파일을 읽는 것보다 더 오래 걸리지 않습니다.

ls아마도 무슨 일이 일어나고 있는지 dos ls -F또는 에 대한 별칭이 있다는 것입니다 ls --color. 이러한 옵션을 사용하면 lstat각 파일에 대해 시스템 호출이 발생하여 해당 파일이 파일인지 디렉터리인지 확인합니다.

또한 도트 파일을 나열하고 파일 목록을 정렬되지 않은 상태로 두어야 합니다. 이렇게 하려면 다음을 실행하세요.

command ls -f /var/lib/php/sessions | wc -l

개행 문자가 포함된 파일 이름이 너무 많지 않으면 이를 통해 좋은 추정값을 얻을 수 있습니다.

$ ls -lhd 1
drwxr-xr-x 2 chazelas chazelas 69M Aug 15 20:02 1/
$ time ls -f 1 | wc -l
3218992
ls -f 1  0.68s user 1.20s system 99% cpu 1.881 total
wc -l  0.00s user 0.18s system 9% cpu 1.880 total
$ time ls -F 1 | wc -l
<still running...>

의 출력에 사용된 inode 수에서 파일 시스템의 다른 위치에 있는 고유 파일 수를 빼서 해당 파일 수를 유추할 수도 있습니다 df -i.

예를 들어, 파일 시스템이 /varGNU에 마운트된 경우 find:

find /var -xdev -path /var/lib/php/sessions -prune -o \
  -printf '%i\n' | sort -u | wc -l

/var/lib/php/sessions에 없는 파일 수를 찾으십시오. IUsed출력의 필드에서 이를 빼면 다른 곳에서는 df -i /var연결되지 않은(일부 특수 inode는 일반적인 ext 파일 시스템의 어떤 디렉터리에도 연결되지 않기 때문에) 연결된 파일 수의 대략적인 값을 얻을 수 있습니다 /var/lib/php/sessions( 참고 / var/lib/php/sessions에는 동일한 파일에 대해 10억 개의 항목이 포함될 가능성이 높습니다(실제로 파일의 최대 링크 수는 대부분의 파일 시스템보다 훨씬 낮습니다). 따라서 이 접근 방식은 완벽하지 않습니다.

디렉터리 내용을 읽는 속도가 상대적으로 빨라야 하는 경우 파일 삭제 속도가 매우 느릴 수 있습니다.

rm -r, 파일을 삭제할 때 먼저 디렉터리 내용을 나열한 다음 unlink()각 파일을 호출합니다. 각 파일에 대해 시스템은 이 거대한 디렉터리에서 파일을 찾아야 하는데, 해시되지 않으면 비용이 매우 많이 들 수 있습니다.

답변2

ls -1 /var/lib/php/sessions | wc -l다음을 사용하여 SSH를 사용할 수 있다고 생각합니다.

참고로 ls -(one)ws -(letter l)

답변3

ext2/3/4에서는 디렉토리 자체의 크기를 기반으로 몇 가지 근사치를 만들 수 있습니다. 이는 매우 정확하지는 않지만 "계산"하지 않고 교육적인 추측을 허용합니다.

기본적으로 디렉터리는 4096바이트에서 시작됩니다. 항목이 많아지면 크기가 커집니다(그러나 다시는 줄어들지 않습니다). 몇 가지 테스트를 거친 후 각 항목은 12바이트를 차지하고 제한에 도달하면 4096바이트씩 증가한다는 사실을 발견했습니다. 이는 현재 디렉터리 크기가 16384라면 한 번에 1,024~1,365개의 항목이 있다는 의미입니다.

이 디렉토리의 파일을 즉시 보는 방법도 있습니다. 를 실행하면 ls전체 디렉토리를 읽은 다음 정렬합니다. 비활성화 정렬을 사용할 수 있습니다 ls -1U.

관련 정보