我们每周都会将新代码发布到生产环境中,Glassfish 没有遇到任何问题。这个周末我们不得不在我们的托管服务提供商那里移动机架。没有任何代码更改(它们只是关闭、移动、重新安装和打开电源),但我们在一个新的网络基础设施上,突然我们像筛子一样泄漏文件描述符。所以我猜想尝试建立某种连接,但现在由于网络更改而失败。
我在带有嵌入式 IMQ 实例的 RHEL4 上运行 Glassfish v2ur2-b04/AS9.1_02。搬家后,我开始看到:
[#|2010-04-25T05:34:02.783+0000|SEVERE|sun-appserver9.1|javax.enterprise.system.container.web|_ThreadID=33;_ThreadName=SelectorThread-?4848;_RequestID=c4de6f6d-c1d6- 416d-ac6e-49750b1a36ff;|WEB0756:在 HTTP 处理期间捕获异常。 java.io.IOException:在 sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)中
打开的文件太多 ... [#|2010-04-25T05:34:03.327+0000|WARNING|sun-appserver9.1| javax.enterprise.system.stream.err|_ThreadID=34;_ThreadName=Timer-1;_RequestID=d27e1b94-d359-4d90-a6e3-c7ec49a0f383;|java.lang.NullPointerException at com.sun.jbi.management.system.AutoAdminTask .pollAutoDirectory(AutoAdminTask.java:1031)
使用 lsof 我检查文件描述符的数量,我看到很多条目,如下所示:
java 18510 root 8556u sock 0,4 1555182 无法识别协议
java 18510 root 8557u sock 0,4 1555320 无法识别协议
java 18510 root 8558u sock 0,4 1555736 无法识别协议
java 18510 root 8559u sock 0,4 1555883 无法识别协议
如果我每分钟计算一次打开的文件描述符,我会看到它每分钟增长 12 个。我不知道这些插座是什么。
我已经取消部署我的应用程序,所以只有一个普通的 Glassfish 实例在运行,我仍然看到它每分钟泄漏 12 个文件描述符。所以我认为这个泄漏是在 Glassfish 或潜在的 IMQ 中。
我应该采取什么方法来追踪这些未知协议的套接字?我可以使用哪些工具(或者我可以将标志传递给 lsof)来获取有关查看位置的更多信息?
谢谢,
夹头