问题描述 以下两个堆栈跟踪指示同一个问题并报告相同的消息:打开的文件过多丅 异常 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:打开的文件过多
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 操作时抛出。 这两个异常都是由阻止服务器的类似问题所产生的,该问题可通过下面的研究方法来解决。 |
故障排除 请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。 快速链接: |
问题描述 以下两个堆栈跟踪指示同一个问题并报告相同的消息:打开的文件过多丅 异常 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:打开的文件过多
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 秒)会延迟其它连接企图,从而将限制最大连接数量。
您可以使用下列指导原则来监视和诊断所有描述符如何由一个进程使用(这取决于您的操作系统): 返回页首
lsof -p
示例 1以下命令在 Solaris 2.7 启动 WLS 8.1SP1 后立即执行。它表明运行服务器的 Java 进程 (pid 390) 分配了 84 个文件描述符,此数量远小于文件描述符缺省的硬极限。
$ lsof -p 390 | wc -l
84 在异常出现之后可以执行此命令,以确保此 Java 进程达到了打开文件的最大数量。这将确认该进程缺乏文件描述符。 然后,您可以运行 $ lsof -p 并将输出结果重定向到某个文件以检查打开的每个文件。如果某个应当关闭的文件却出现在列表中,您可以探查此文件以前没有按照预期方式关闭的原因。 下面是 lsof 的输出结果片断: |
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/。 文件描述符将用于每个套接字连接,lsof 还可以显示套接字的类型(TCP 或 UDP)以及监听地址和端口(位于名称列中)。 示例 2 |
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 上,您还可以使用性能监视工具 Glance(可从 http://www.hp.com/ 获得)来分析在运行 WebLogic Server 时所打开文件的总数。 如果您没有 lsof,则还可以在 /proc//fd 中查看某个进程的所有文件描述符,每个文件描述符都驻留在此目录中。 Windows 平台 Handle 在 WinNT 或 Windows 2000 上,命令行工具 handle 报告有关引用所打开文件的句柄的信息,如下例所示。此工具可用于特定进程, 它可从以下网址获得:http://www.sysinternals.com/ntw2k/freeware/handle.shtml。 |
C:tmp>ps -ef | grep java usera 1656 1428 0 10:11:41 CONIN$ 0:46 c:ReleasesWLS8.2JDK141~1binjava -client -Xms32m -Xmx200m -XX:MaxPermSize=128m -Xverify:none -Dweblogic.Name=myserver -Dweblogic.ProductionModeEnabled= -Djava.security.policy="c:ReleasesWLS8.2WEBLOG~1serverlibweblogic.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 ABCDEFusera 18: File C:ReleasesWLS8.2user_projectsdomainsmydomain 170: File C:ReleasesWLS8.2jdk141_05jrelibrt.jar 178: File C:ReleasesWLS8.2jdk141_05jrelibsunrsasign.jar 180: File C:ReleasesWLS8.2jdk141_05jrelibjsse.jar 188: File C:ReleasesWLS8.2jdk141_05jrelibjce.jar 190: File C:ReleasesWLS8.2jdk141_05jrelibcharsets.jar 328: File C:ReleasesWLS8.2jdk141_05jrelibextdnsns.jar 330: File C:ReleasesWLS8.2jdk141_05jrelibextldapsec.jar 338: File C:ReleasesWLS8.2jdk141_05jrelibextlocaledata.jar 340: File C:ReleasesWLS8.2jdk141_05jrelibextsunjce_provider.jar 348: File C:ReleasesWLS8.2jdk141_05libtools.jar 350: File C:ReleasesWLS8.2weblogic81serverlibweblogic.jar 358: File C:ReleasesWLS8.2weblogic81serverlibjconn2.jar 360: File C:ReleasesWLS8.2weblogic81serverlibojdbc14.jar 368: File C:ReleasesWLS8.2weblogic81serverlibxmlx.jar 370: File C:ReleasesWLS8.2weblogic81serverlibwebservices.jar 378: File C:ReleasesWLS8.2weblogic81serverlibwlcipher.jar 3e0: File C:ReleasesWLS8.2weblogic81serverlibantant.jar 3e8: File C:ReleasesWLS8.2weblogic81serverlibEccpressoJcae.jar 3f0: File C:ReleasesWLS8.2weblogic81serverlibEccpressoCore.jar 3f8: File C:ReleasesWLS8.2weblogic81serverlibEccpressoAsn1.jar 400: File C:ReleasesWLS8.2weblogic81serverlibjConnect.jar 408: File C:ReleasesWLS8.2weblogic81serverlibantoptional.jar 410: File C:ReleasesWLS8.2weblogic81serverlibantjakarta-oro-2.0.7.jar …. C:tmp>handle -p java | wc -l 65 |
这表明在 Windows 上运行 WLS 8.1SP2 时使用了 65 个文件句柄。 Process Explorer Process Explorer 是另一个 Windows 工具,它是用来监视文件句柄的更高级实用程序。它具有 GUI 界面并显示有关正在运行的每个进程的更多信息。您可以使用此程序来搜索特殊句柄。 它可从以下网址获得:http://www.sysinternals.com/ntw2k/freeware/procexp.shtml。 下面是示例输出的屏幕快照: |

这表明运行 WLS 的 Java 进程使用 884 个句柄,但只有少数(65 个)句柄引用打开的文件。 返回页首 已关闭的套接字传输到 TIME_WAIT 以确保所有的数据在连接期间被传输,最终确认 (ACK) 应当终止数据传输,此状态会延迟释放分配给该套接字的文件描述符。在 Unix 系统上,此 TIME_WAIT 期间的持续时间在名为 tcp_time_wait _interval 的内核参数中定义。在 Windows NT、Windows 2000 和 Windows XP 上,此期间在注册表中名为 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters 的系统项中定义为 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 |
是否需要更多帮助? 如果您已经理解这个模式,但仍需要其它帮助,您可以:
如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support.bea.com。 |
反馈 请给我们提供您的意见,说明此支持诊断模式“打开的文件过多”一文是否有所帮助,您需要的任何解释,以及对支持诊断模式的新主题的任何要求。 |
免责声明: 依据 BEA 与您签署的维护和支持协议条款,BEA Systems, Inc. 在本网站上提供技术技巧和修补程序供您使用。虽然您可以将这些信息和代码与您获得 BEA 授权的软件一起使用,但 BEA 并不对所提供的技术技巧和修补程序做任何形式的担保,无论是明确的还是隐含的。 本文档中引用的任何商标是其各自所有者的财产。有关完整的商标信息,请参考您的产品手册。 |
http://www.tot.name/show/3/7/20070528072334.htm
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/220284/viewspace-1024475/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/220284/viewspace-1024475/