IO 관련해서 개발을 하다보면 자주 마주치는 부분중 하나가 이 오류일 것이다.
java.io.IOException: Too many open files
일단 해당 메시지로 구글 검색을 하면 대부분 해결책이
“시스템의 open files 를 올려라 리눅스의 경우 ulimit -n 65535” 이정도 및 limit.conf 파일 수정 하는 것이
나오는 것이 대부분 일것이다.
하지만 그전에 프로그램에서 뭔가 파일을 열고 닫는 부분에서 버그가 있어야 하지 않을까? 라는 것으로 접근하는 것이
가장 우선시 되어야 할 사항 이라고 생각한다.
일단 이렇게 접근 하기 위해서는 프로그램이 실행이 될때 (어떠한 액션이 발생할때) 지금 열린 파일의 갯수를 알아야 할것이 아닌가?
os 가 linux 라고 가정 할때 대상 프로세스에서 열린 파일의 수를 실시간으로 확인이 가능한 간단한 스크립트를 소개하겠다.
가령 대상 프로세스가 java 프로세스라고 가정하면
shell # ps aux | grep java
해당 프로세스 리스트를 확인하면
1 |
root 593228 52.6 6.0 5365932 484076 pts/0 Sl 09:27 0:13 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat//conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -XX:ReservedCodeCacheSize=512m -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:NewRatio=3 -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/tomcat_dump.hprof -Djava.endorsed.dirs=/usr/local/tomcat//endorsed -classpath /usr/local/tomcat//bin/bootstrap.jar:/usr/local/tomcat//bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat/ -Dcatalina.home=/usr/local/tomcat/ -Djava.io.tmpdir=/usr/local/tomcat//temp org.apache.catalina.startup.Bootstrap start |
아래와 같이 593228 라는 프로세스 아이디가 나온다.
그러면 아래처럼 linux shell 상에서 명령어를 실행하면…
1 2 3 4 |
while true; do sleep 2; ls -l /proc/593228/fd/ | wc -l; done; |
라고 실행하면 2초 단위로 해당 프로세스에서 열린 파일의 갯수가 출력되니 디버깅에 참고하기 바란다.