【发布时间】:2014-06-16 01:27:08
【问题描述】:
我有一个 Java 程序,运行大约 3 分钟后会抛出“打开的文件太多”错误。增加打开文件限制不起作用,因为它仍然会用完所有限制,只是速度较慢。所以我的程序有问题,我需要找出来。
这是我所做的,10970 是 pid
- 使用
cat /proc/10970/fd检查Java进程打开的文件,发现大部分是管道 - 使用
lsof -p 10970 | grep FIFO列出所有管道并找到大约 450 个管道 - 管道如下所示
java 10970 服务 1w FIFO 0,8 0t0 5890 管道
java 10970 服务 2w FIFO 0,8 0t0 5890 管道
java 10970 服务 169r FIFO 0,8 0t0 2450696 管道
java 10970 服务 201r FIFO 0,8 0t0 2450708 管道
但我不知道如何继续。上面输出中的0,8 表示设备号。如何找到具有这些编号的设备?
更新
该程序是一个 TCP 服务器,从客户端接收套接字连接并处理消息。我有两个环境。在生产环境中它工作正常,但在测试环境中它最近有这个问题。在生产环境中,我看不到这么多管道。这两个环境的代码和基础架构相同,均由 Chef 管理。
【问题讨论】:
-
这个问题很模糊。你的程序是做什么的?另外,您是否会关闭“连接”?