출처 :http://kr.bea.com/support/customer_support/SupportPattern/08_15_Too_Many_Open_Files_Pattern.html
Too many open files
문제 설명 |
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 동작에 영향을 주는 경우 발생합니다. |
문제 해결 |
문제 발생 원인 페이지 맨 위
서로 다른 기간에 파일 디스크립터의 총 개수를 확인하여 파일 디스크립터 개수의 증감 여부를 파악할 수 있습니다.
이와 함께 연결이 닫히기 전TIME_WAIT상태 커넥션의 유지 시간을 줄일 수 있습니다(파일 디스크립터 해제 및 시기). 사용량이 많은 서버에서 디폴트 값인 240을 사용하면 커넥션 시도가 지연될 수 있으며, 이로 인해 커넥션의 최대 개수가 제한됩니다.
OS에 따라 다음 가이드를 통해 한 프로세스에서 모든 디스크립터를 어떻게 사용하고 있는지 모니터링하고 진단할 수 있습니다. 페이지 맨 위 lsof -p <pid of process> 예제 1다음 명령은 Solaris 2.7에서 WLS 8.1SP1을 시작한 직후 실행되었습니다. 서버에서 실행 중인 Java 프로세스(pid 390)에 의해 84개의 파일 디스크립터가 할당되었음을 보여줍니다. 이 숫자는 파일 디스크립터의 디폴트 hard limit보다 훨씬 작습니다. $ lsof -p 390 | wc -l 84
|
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 29733 usera cwd VDIR 176,22 4096 4300274 /home/usera/810/user_projects/mydomain java 29733 usera txt VREG 176,22 36396 6642305 /home/usera/810/jdk141_02/bin/java java 29733 usera txt VREG 176,22 1251192 10818087 /home/usera/810/user_projects/mydomain/myserver/.wlnotdelete/extract/myserver_uddi_uddi/jarfiles/_wl_cls_gen.jar java 29733 usera txt VREG 176,22 511935 10074851 /home/usera/810/user_projects/mydomain/myserver/.wlnotdelete/extract/myserver_uddi_uddi/jarfiles/WEB-INF/lib/jsse39153.jar java 29733 usera txt VREG 176,22 2305960 6000676 /home/usera/810/user_projects/mydomain/myserver/.internal/uddi.war java 29733 usera txt VREG 176,22 1227013 1385413 /home/usera/810/weblogic81/common/eval/pointbase/lib/pbserver44.jar java 29733 usera txt VREG 176,22 653661 69379 /home/usera/810/weblogic81/server/lib/ant/optional.jar |
lsof .h는 가능한 모든 구문 및 옵션을 표시합니다. 이 프로그램의 최신 버전은http://ftp.cerias.purdue.edu/pub/tools/unix/sysutils/lsof/에서 구할 수 있습니다. |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME in.telnet 29705 root 2u inet 0x30002808fd8 0t76 TCP aaaaabbbb:telnet->abcdef.bea.com:3886 (ESTABLISHED) |
HP에서 WebLogic Server를 실행할 때에는 성능 모니터링 도구인glance를 사용하여 열린 파일의 총 개수를 파악할 수도 있습니다. (이 도구는http://www.hp.com/에서 구할 수 있습니다.) |
C:\tmp>ps -ef | grep java usera 1656 1428 0 10:11:41 CONIN$ 0:46 c:\Releases\WLS8.2\JDK141~1\bin\java -client -Xms32m -Xmx200m -XX:MaxPermSize=128m -Xverify:none -Dweblogic.Name=myserver -Dweblogic.ProductionModeEnabled= -Djava.security.policy="c:\Releases\WLS8.2\WEBLOG~1\server\lib\weblogic.policy" weblogic.Server |
C:\tmp>handle -p java Handle v2.10 Copyright (C) 1997-2003 Mark Russinovich Sysinternals - www.sysinternals.com ------------------------------------------------------------------------------ java.exe pid: 1656 ABCDEF\usera 18: File C:\Releases\WLS8.2\user_projects\domains\mydomain 170: File C:\Releases\WLS8.2\jdk141_05\jre\lib\rt.jar 178: File C:\Releases\WLS8.2\jdk141_05\jre\lib\sunrsasign.jar 180: File C:\Releases\WLS8.2\jdk141_05\jre\lib\jsse.jar 188: File C:\Releases\WLS8.2\jdk141_05\jre\lib\jce.jar 190: File C:\Releases\WLS8.2\jdk141_05\jre\lib\charsets.jar 328: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\dnsns.jar 330: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\ldapsec.jar 338: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\localedata.jar 340: File C:\Releases\WLS8.2\jdk141_05\jre\lib\ext\sunjce_provider.jar 348: File C:\Releases\WLS8.2\jdk141_05\lib\tools.jar 350: File C:\Releases\WLS8.2\weblogic81\server\lib\weblogic.jar 358: File C:\Releases\WLS8.2\weblogic81\server\lib\jconn2.jar 360: File C:\Releases\WLS8.2\weblogic81\server\lib\ojdbc14.jar 368: File C:\Releases\WLS8.2\weblogic81\server\lib\xmlx.jar 370: File C:\Releases\WLS8.2\weblogic81\server\lib\webservices.jar 378: File C:\Releases\WLS8.2\weblogic81\server\lib\wlcipher.jar 3e0: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\ant.jar 3e8: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoJcae.jar 3f0: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoCore.jar 3f8: File C:\Releases\WLS8.2\weblogic81\server\lib\EccpressoAsn1.jar 400: File C:\Releases\WLS8.2\weblogic81\server\lib\jConnect.jar 408: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\optional.jar 410: File C:\Releases\WLS8.2\weblogic81\server\lib\ant\jakarta-oro-2.0.7.jar 갋. C:\tmp>handle -p java | wc -l 65 |
WLS 8.1SP2 실행 시 Windows에서 65개의 파일 핸들을 사용했음을 알 수 있습니다. |
WLS 실행 시 java 프로세스에서 884개의 핸들을 사용했고 이 중 일부(65개) 핸들만 열린 파일을 참조하고 있음을 알 수 있습니다. 페이지 맨 위 모든 데이터 전송을 완료하기 위해 소켓을 닫더라도TIME_WAIT으로 변환되었다가 최종 승인(ACK)에 의해 데이터 전송이 종료됩니다. 이 경우 파일 디스크립터의 해제를 지연시킵니다. 이TIME_WAIT시간은 Unix 시스템에서tcp_time_wait _interval이라는 커널 매개변수로 정의됩니다. Windows NT, Windows 2000 및 Windows XP의 경우 이 시간은 레지스트리의HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters라는 시스템 키의TcpTimedWaitDelay로 정의됩니다. 페이지 맨 위 페이지 맨 위 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 |
'Java' 카테고리의 다른 글
out of memory 와 Runtime 객체 사이의 관계 (0) | 2007.05.09 |
---|---|
예제로 살펴보는 쓰레드 제어하기 (0) | 2007.04.18 |
Java™ Troubleshooting Guide for HP-UX Systems (0) | 2007.04.03 |