微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

狩猎“文件太多”的原因

我们在其中一个客户服务器上遇到一个奇怪的问题,那就是Java遇到“文件过多”,

通过lsof检查描述符会产生一个“无法识别协议”的大量“sock”描述符。

我怀疑是因为打开了太多时间的套接字而发生的,但是由于我们的线程转储包含了很多这些套接字,所以我不清楚究竟是谁的罪魁祸首。

有什么好的方法来检测哪个线程完全打开这些sockets?

XP和Vista之间使用winsock API差异的UDP多播

有没有办法让UDP .net套接字在套接字closures时释放绑定端口?

setsockopt()SOL_IP API级别和IPT_SO_SET_REPLACE开关

Windows中SO_RCVBUF的最大值?

如何暂停IOCP TCP套接字服务器?

谢谢。

为什么Socket连接被阻塞,并且TCP内核保持重传数据包

OS X getsockopt:不是SO_PROTOCOL

bind()失败,出现Windows套接错误10049

如何在Linux套接字编程中限制连接?

是否有一个非阻塞方法比select()和poll()更快地检查数据?

有什么好的方法来检测哪个线程完全打开这些插座?

不是线程本身 。

一种方法是使用分析器运行应用程序。 即使您不能准确地再现客户的问题,也可以很好地发现问题。 (@SyBer报告yourkit分析器对查找套接字泄漏有特殊的支持 …查看评论。)

第二种方法是通过使用ulimit来调整测试平台来减少允许的打开文件数量。 这可能会使您在测试环境中重现“打开的文件太多”情况变得更加容易。

最后,我建议“刷新”你的代码库,找到创建套接字对象的所有地方。 然后检查它们,确保它们正确使用try / finally块,以确保套接字始终关闭

从…开始

netstat -ano | grep $YOUR_PROCESS_ID netstat -ano | grep $YOUR_PROCESS_ID – 对于unix

netstat -ano | find "$YOUR_PROCESS_ID" netstat -ano | find "$YOUR_PROCESS_ID" – 对于Windows

至少你会看到连接是否真的存在。

你有没有尝试ulimit来增加打开文件数量? 另外,你可能没有正确地关闭你的套接字,所以你有泄漏。

检测泄漏套接字的唯一“好”方法是非常详细的日志或分析器。 做一个内存转储并分析对象。

如果你传递--track-fds=yes Valgrind将识别文件描述符泄漏。 Valgrind在其追踪资源的“采集”点生成短堆栈跟踪。 当你找到源代码行发生泄漏时,可以将pthread_self的返回值与你的日志系统结合起来(我相信你会使用它),或者在gdb中放置断点 。

可能你忽略close()你完成的套接字。 即使对等方启动关机,也需要这样做。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐