Too Many Open Files Exception

2009. 6. 5. 14:19Java

이 문제는 OS의 리소스, 특히 JVM에서 사용하는 FD(File Descriptor)가 부족함을 알리는 메시지이다. 서버
에 동시에 많은 사용자가 접속하게 되면, 처리를 위해 파일을 열거나, 소켓을 사용하게 되는데, 파일이나 소켓
이 fd를 사용하게 되며, 이것이 설정 값 이상을 넘게 되면 Too many open files 에러가 발생한다.
FD를 늘려주는 방법


* Solaris에서는 /usr/bin/ulimit를 사용하여 변경할 수 있으며, 최대값은 커널값 rlim_fd_max(디폴트 65536)
이다.


*Linux에서는 /etc/security/limits.conf 파일을 아래와 같이 수정하면 된다
soft nofile 1024
hard nofile 4096

또, /etc/rc.d/rc.local 파일에 아래와 같이 설정하여도 된다.
# Increase system-wide file descriptor limit.
echo 4096 > /proc/sys/fs/file-max
echo 16384 > /proc/sys/fs/inode-max

*Windows에서는 파일 핸들이라 부르며, Windows 2000에서는 16,384개로 한정되어 있고, Windows 작
업 관리자의‘성능’탭에서 확인할 수 있다.

*HP-UX에서는 nfile가 최대 오픈할 수 있는 파일 개수를 의미하며, nfile=((NPROC*2)+1000),
NPROC=((MAXUSERS*5)+64)와 같이 계산된다. MAXUSERS가 400이면 5128이 된다. maxfiles은 프로
세스에 대한 Soft limit이고, maxfiles_lim는 Hard Limit이다.


*AIX에서는 /etc/security/limits에 정의하며, 디폴트 값은 2000이다. ulimit 명령이나 setrlimit subrotine으
로 설정할 수 있으며, 최대값은 OPEN_MAX로 설정한다.
프로세스가 사용중인 파일을 확인하는 방법


*UNIX 플랫폼(Solaris, Tru64, HP-UX, Linux, AIX)에서는 lsof(LiSt Open Files) 명령으로 확인할 수 있다.
*$ lsof -p <pid of process>
*HP-UX에서는 glance 툴을 이용하여 프로세스가 사용하는 fd를 볼 수 있다.
*lsof도 없고 어떤 툴도 없다면, /proc/<pid>/fd 디렉토리의 파일들이 실제 열려 있는 fd이므로, 이 파일을
살펴보면 된다.

*Windows 플랫폼에서는 아래 handle이란 툴을 이용하여, 프로세스가 사용중인 fd를 모니터링 할 수 있다.
*http://www.sysinternals.com/ntw2k/freeware/handle.shtml
*$ handle -p java
*또는 http://www.sysinternals.com/ntw2k/freeware/procexp.shtml의 GUI 인터페이스로 제공되는


Process Explorer를 사용하여 모니터링 할 수 있다.
Technical Tip
Bea Enterprise Solution Technical News
www.bea.co.kr 33


해 결 안
위와 같이 해당 OS에서 java 프로세스가 사용하는 FD를 모니터링하여, 비정상적으로 파일이나 소켓을 많이
사용하는 부분이 있는지 점검하고 이를 수정 함으로써, Too many open files 문제를 해결할 수 있다.
추가정보


====================================================================

Windows 운영체계에서 File handle 갯수의 최대치와 이를 조정하는 방



Windows 2000 을 기준으로 최대 Handle 값은 10,000 입니다.


이를 Registry 수정을 통해서 수정은 가능하나, 이로 인해서 생기는 문제는 사용자의 책임입니다. (최대 18,000까지가 By Design 입니다.)


특히 GDI 등의 경우는 Handle Leak 등에 취약성이 있습니다.


you must create or modify the following registry values to specify the number of NT User handles that you want to allow. The maximum number is 18,000.

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota 

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit (REG_DWORD)

[Reference]

Maximum NT User Handles Per Process Is 10,000 in Windows 2000 (http://support.microsoft.com/kb/326591)
Windows Server 2003 Resource Kit Registry Reference (http://technet2.microsoft.com/windowsserver/en/library/56a33a88-a7b2-4f21-ab5e-5c62d728619f1033.mspx?mfr=true)
Technical Reference to the Windows 2000 Registry Start Page
(http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/w2rkbook/regentry.mspx?mfr=true)