열린 파일이 너무 많음-범인을 찾는 방법


69

을 실행할 때 tail -f filename다음 메시지가 나타납니다.

tail: inotify cannot be used, reverting to polling: Too many open files

잠재적 인 문제입니까?

열려있는 모든 파일에 대한 책임을 어떻게 진단합니까? 의심스러운 프로세스 목록이 있지만 문제가 범인으로 밝혀지지 않은 경우 확인할 프로세스를 알지 못하는 지시가 유용합니다.


1
ulimit? 를 통해 사용 가능한 파일 디스크립터 수를 늘렸 습니까?
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams 다른 사용자에게 도움이 될 수 있지만, 저보다는 질병보다는 증상을 치료하는 느낌이 듭니다.
Andrew Grimm

틀린 것은 아니지만 때때로 앱에 많은 파일이 열려있는 합당한 이유가 있습니다.
Ignacio Vazquez-Abrams

답변:


71

lsof를 사용하여 누가 너무 많은 파일을 열고 있는지 이해할 수 있습니다. 일반적으로 너무 많은 파일을 여는 (웹) 서버이지만 lsof는 원인을 식별하는 데 도움이됩니다.

누가 나쁜 사람인지 이해하면

lsof의 출력이 상당히 큰 경우 파일로 리디렉션하고 파일을여십시오.

예 ( 첫 번째 명령 을 Ctrl+ 해야 할 수도 있음 C)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log

37
게으른 :lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
itsadok

1
동일한 오류가 발생하고 ulimit를 사용하면 작동하지 않습니다. tail -F 명령은 여전히 ​​오류를 반환합니다. 한도를 1024에서 3000으로 늘려서 충분한 여유 공간이 있다고 생각할 것입니다. 재부팅해야 할 것 같습니다!
Alexis Wilke

15
itsadok의 줄이 유용하다는 것을 알았지 uniq만 먼저 정렬 ( 인접한 줄에서만 작동 하기 때문에 )하고 uniq을 실행 한 다음 다시 정렬 해야한다고 생각 합니다. 그래서 lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier

19
가장 많은 파일을 정렬하고 계산하는 것이 가장 좋은 방법입니다. 프로세스 이름과 pid 표시 : '' 'lsof | awk '{print $ 2 ""$ 1; } '| 정렬 -rn | uniq -c | 정렬 -rn | head -20 '' '
gaoithe

2
@gaoithe 당신이 답변에 넣었다면 기꺼이 찬성합니다:)
Matt Ball

23

다른 사람이 필요로하는 경우 ...

ulimit -a

모든 전류 제한을 표시합니다. 특히 ulimit -n 70000파일 디스크립터 한계를 설정합니다.

또한...

cat /proc/sys/fs/file-max

편집하면 커널 제한을 표시 / 설정합니다.

sudo echo 200000 > /proc/sys/fs/file-max

훨씬 더 자세한 설명은 다음에서 찾을 수 있습니다.

루트가 아닌 사용자의 열린 파일 제한을 늘리려면 어떻게합니까?


3
ulimits가 있으므로 시스템의 자원 사용을 엄격하게 제어 할 수 있습니다. 많은 파일 디스크립터를 사용해야하는 프로세스에 대해 개별적으로 늘리는 것이 가장 좋습니다. 테스트를 엄격하게 유지하면 시간이 지남에 따라 파일 디스크립터가 꾸준히 누출 될 수있는 프로세스를 찾을 수 있습니다. 또한 파일 핸들은 unix / linux의 모든 장치 액세스에 사용됩니다. 예를 들어 프로세스에 의해 열린 모든 네트워크 소켓은 파일 핸들을 사용합니다. 네트워크 연결과 같은 장치 파일뿐만 아니라 일반 파일 시스템 파일의 경우 "너무 많은 열린 파일"에 도달 할 수있는 이유를 설명합니다.
gaoithe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.