【发布时间】:2013-06-05 05:55:36
【问题描述】:
这个问题类似于Network port open, but no process attached? 和netstat shows a listening port with no pid but lsof does not。但是他们的答案无法解决我的问题,因为它太奇怪了。
我有一个名为 lps 的服务器应用程序,它在端口 8588 上等待 tcp 连接。
[root@centos63 lcms]# netstat -lnp | grep 8588
tcp 0 0 0.0.0.0:8588 0.0.0.0:* LISTEN 6971/lps
如您所见,监听套接字没有任何问题,但是当我将几千个测试客户端(由另一位同事编写)连接到服务器时,无论是 2000、3000 还是 4000。总是有 5 个客户端(这也是随机的)连接并向服务器发送登录请求,但收不到任何响应。以 3000 个客户为例。这是netstat 命令给出的:
[root@centos63 lcms]# netstat -nap | grep 8588 | grep ES | wc -l
3000
这是lsof 命令输出:
[root@centos63 lcms]# lsof -i:8588 | grep ES | wc -l
2995
这里有 5 个连接:
[root@centos63 lcms]# netstat -nap | grep 8588 | grep -v 'lps'
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52658 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52692 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52719 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52721 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52705 ESTABLISHED -
上面的 5 表明它们在 8588 端口上连接到服务器,但没有附加任何程序。随着客户端发送请求,第二列(RECV-Q)不断增加。
上面的链接说明了 NFS 挂载和 RPC。至于RPC,我用了命令rcpinfo -p,结果和8588端口无关。而NFS挂载,nfssta输出说Error: No Client Stats (/proc/net/rpc/nfs: No such file or directory).
问题:这怎么会发生?总是 5 个,也不是来自同一个 5 个客户。我不认为这是端口冲突,因为其他客户端也连接到相同的服务器 IP 和端口,并且它们都由服务器正确处理。
注意:我使用 Linux epoll 来接受客户端请求。我还在我的程序中编写调试代码并记录accept 返回但找不到 5 个连接的每个套接字(以及客户端的信息)。这是uname -a 输出:
Linux centos63 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
感谢您的热心帮助!我真的很困惑。
更新 2013-06-08:
将系统升级到 CentOS 6.4 后,出现同样的问题。最后我回到epoll,发现this page 说set listen fd 是非阻塞的,accept 直到EAGAIN 或EWOULDBLOCK 错误返回。是的,它有效。没有更多的连接挂起。但这是为什么呢? Unix 网络编程卷 1 说
accept is called by a TCP server to return the next completed connection from the
front of the completed connection queue. If the completed connection queue is empty,
the process is put to sleep (assuming the default of a blocking socket).
那么如果队列中还有一些已完成的连接,为什么进程要休眠呢?
更新 2013-7-1:
我在添加监听套接字时使用EPOLLET,所以如果在遇到EAGAIN 之前不继续接受,我将无法接受所有内容。我才意识到这个问题。我的错。请记住:如果使用EPOLLET,则始终使用read 或accept 直到出现EAGAIN,即使它正在侦听套接字。再次感谢 Matthew 用测试程序证明了我。
【问题讨论】:
-
您的环境中的IP 192.168.0.241有什么特别之处吗?
-
@Nils 又加了一个,我觉得不是 IP 192.168.0.241 的问题。我们有几个测试虚拟机,这 5 个可以来自不同的主机。
-
等一下。这个服务器
lps是你正在写的程序吗? -
@MichaelHampton 是的。
标签: linux networking netstat lsof