Too many open files

Daily/Prog 2017. 5. 8. 23:20

java.io.FileNotFoundException: /var/lib/tomcat8/webapps/ROOT/WEB-INF/lib/hibernate-core-4.3.6.Final.jar (Too many open files)

java.util.zip.ZipFile.open(Native Method)

java.util.zip.ZipFile.<init>(ZipFile.java:219)

java.util.zip.ZipFile.<init>(ZipFile.java:149)

java.util.jar.JarFile.<init>(JarFile.java:166)

java.util.jar.JarFile.<init>(JarFile.java:103)

        ...



갑자기 웹사이트에 출력되는 기이한 메시지.

Chrome 에서는 404 error, IE 에서는 500 error 가 발생하는 기이한 현상.

EC2 와 RDS 의 모든 모니터링 결과 기이하게도 상태 양호.

Apache 에서는 볼 수 없었던... JVM 의 매력? 아님 Linux 만의 매력인가?


위 에러에서 중요한 문구는 Too many open files 이다. (앞에 exception 과 library 는 변할 수 있다.)

말그대로 너무 많은 파일이 열려 있다는 것인데, 얼마나 열려 있길래... 얼마나 열리면 이런 에러가 발생하는거지.

라는 궁금증이 드는 사람들은 ulimit -n 명령을 사용해 보면 해당 OS 에서 할당된 오픈 파일 허용 개수를 확인할 수 있다. (기본 1024)


서버가 뻗었을 때 lsof -p <pid of jvm> 명령이나 lsof -p <pid of jvm> | wc -l 명령으로 오픈된 파일 수를 확인해 보는 것도 좋을 것 같다.

lsof(List Open Files) 명령은 말 그대로 프로세스나 포트가 참조하는 오픈된 파일의 목록을 확인할 수 있다.

미리미리 체크를 해두면, 포트가 문제인지 소켓이 문제인지 안닫힌게 무엇인지를 파악해야 해당 에러를 방지할 수 있을 것이다.


그 전에 ulimit 명령으로 오픈 파일 허용치를 높여 테스트를 용이하게 할 수 있다.


$ sudo vi /etc/security/limits.conf
...
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
cs


사용자 별로 설정이 가능하며 모든 사용자(*) 에 대한 설정도 가능하다.

서버를 재부팅 해야 적용되므로 일시적으로 해당 사용자로 로그인하여 아래처럼 수정하고 추후 재부팅하는 것도 방법이다.


$ ulimit -Sn 65536
$ ulimit -Hn 65536
cs



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,