linux孤儿套接字监听器问题

时间:2015-10-07 15:16:36

标签: java linux sockets file-descriptor orphan

我想出了一个不寻常的套接字状态,想知道是否有人可以解释它。

  • 有问题的操作系统是:Linux SLES11SP2-2 Revision 0 ia32e
  • 使用的java版本是:1.7.0.45-64

我有一个正在运行的java进程,它使用TCP协议侦听端口N. java进程在启动时成功绑定到该端口,并在其上等待accept()方法。 在某些未知的点上,java进程已经丢失了正在侦听该端口的文件描述符,但它仍在wait()方法上等待,并且在其上调用了no close()方法。

  • 查看'lsof'的输出(以root为单位),没有进程持有该端口。

    /root ! # lsof | grep N

  • 查看'fuser'的输出(作为root),没有进程持有该端口。

    /root ! # fuser –n tcp N

  • 查看'ss'的输出(作为root),没有进程持有该端口。

    /root ! # ss -ltp | grep N 129 128 *:31526 *:*

  • 查看'netstat'(作为root)套接字是Listening但没有任何与之相关的进程(但它确实有一个inode编号)

    root ! # netstat -putane | grep N tcp 129 0 0.0.0.0:N 0.0.0.0:* LISTEN 0 1488959042 - tcp 661 0 X0.X1.X2.X3:N Y0.Y1.Y2.Y3:N1 CLOSE_WAIT 0 0 - tcp 1982 0 X0.X1.X2.X3:N Y0.Y1.Y2.Y3:N2 CLOSE_WAIT 0 0 - …

  • 在/ proc / / fd / 中搜索该inode的引用时显示为空。

    /root ! # find /proc/*/fd/* -exec stat {} \; | grep 1488959042

  • 在/ proc / net / etc中查找inode会产生以下结果:

    /root ! # cat /proc/net/tcp | grep 1488959042 5: 00000000:7B26 00000000:0000 0A 00000000:00000081 00:00000000 00000000 0 0 1488959042 1 ffff88179d96af40 300 0 0 2 -1

  • 使用telnet连接到该端口正在运行,数据可以发送给它。

    /root ! # telnet localhost N

  • 尝试从新进程获取端口失败,错误指示地址正在使用中。

  • 内核中没有列出孤儿,也没有达到孤儿的限制。

    /root ! # cat /proc/sys/net/ipv4/tcp_max_orphans 262144

    /root ! # cat /proc/net/sockstat sockets: used 179 TCP: inuse 111 orphan 0 tw 33 alloc 164 mem 346 UDP: inuse 17 mem 11 UDPLITE: inuse 0 RAW: inuse 0 FRAG: inuse 0 memory 0

  • tcp内存也没有被破坏。

    /root ! # cat /proc/sys/net/ipv4/tcp_mem 2326728 3102307 4653456

所以这是我的问题:

  1. 如果在正在运行的进程中分离活动套接字,会出现这种情况吗?
  2. 如何关闭孤立套接字以便再次绑定它?
  3. 在线查看是空的,关于孤立套接字的唯一信息是指基于内核的端口(例如NFS服务端口)和处于TIME_WAIT状态的套接字,应该在一定的超时后由内核清除。

    非常感谢您的帮助!

0 个答案:

没有答案