다음과 같은 예외 메시지를 발생시킵니다. 소켓과 파일에서 이런 문제가 발생할 수 있습니다.

예외 1
java.net.SocketException: Too many open files

at java.net.PlainSocketImpl.accept(Compiled Code)
at java.net.ServerSocket.implAccept(Compiled Code)
at java.net.ServerSocket.accept(Compiled Code)
at weblogic.t3.srvr.ListenThread.run(Compiled Code)

예외 2

java.io.IOException: Too many open files

at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:551)
at java.lang.Runtime.exec(Runtime.java:477)
at java.lang.Runtime.exec(Runtime.java:443)
...

첫 번째 예외는 오류가 TCP 프로토콜에 영향을 주는 경우에 발생하며 두 번째 예외는 오류가 I/O 동작에 영향을 주는 경우 발생합니다.

두 경우 모두 서버 차단(blocking) 문제를 유발합니다. 아래에서 설명하는 방법으로 문제를 파악하여 해결할 수 있습니다.

Unix와 Linux에서는 스트림을 File로서 처리합니다. 이것은 OS에서 사용할 수 있는 파일디스크립터(fd)의 갯수를 지정하는데, 이것이 작을때 발생합니다.

우선, 엔진에 문제가 없는지 확인합니다. 파일(소켓)을 연 상태에서 닫은게 없는지 확인하고 이상이 없다면, 시스템의 fd의 설정을 확인합니다.

저희는 Unix와 Linux를 주로 사용하기에 이 경우에는 ulimit명령으로 간단히 확인할 수 있습니다. ulimit -a 하면 모든 설정이 나오게 됩니다.

 core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 48743
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 48743
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


Unix 및 Linux에 모두 파일 디스크립터가 있습니다.  주요한 차이점은 hard limit의 설정, 디폴트값 및 파일 디스크립터의 구성 절차에 있습니다.

Solaris
/usr/bin/ulimit유틸리티를 사용하여 단일 프로세스에 할당하는 파일 디스크립터의 개수를 정의합니다.  최대값은 rlim_fd_max로 정의되며 기본적으로 65,536으로 설정됩니다.  루트 사용자만이 이 커널 값을 수정할 수 있습니다.

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 OS에서는 파일 핸들이라고 합니다.  Windows 2000 서버의 경우 열린 파일 핸들 제한은 16,384로 설정되어 있습니다.  이 값은 작업 관리자 성능 요약에서 확인할 수 있습니다.

HP-UX
nfile 을 사용하여 열린 파일의 최대 개수를 정의할 수 있습니다.  이 값은 대개 다음 공식으로 결정됩니다. ((NPROC*2)+1000) 여기서 NPROC는 대개 ((MAXUSERS*5)+64)입니다.  MAXUSERS가 400인 경우 계산 결과는 5128입니다.  대개 이 값을 더 높게 설정합니다.  maxfiles는 프로세스별 소프트 파일 제한이고 maxfiles_lim은 프로세스별 하드 파일 제한입니다.

AIX
파일 디스크립터 제한은 /etc/security/limits파일에 설정되어 있으며 기본값은 2000입니다.  이 제한은 ulimit명령 또는 setrlimit 함수로 변경할 수 있습니다.  최대 크기는 OPEN_MAX 상수로 정의합니다.



*참고*
Too many open files - BEA

Posted by 지영아빠

티스토리 툴바