트래픽이 많은 웹 서버에 심각한 문제가 있습니다. 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
.
예를 들어, 파일 시스템이 /var
GNU에 마운트된 경우 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
.