linux产生大量CLOSE_WAIT且进程名为- 问题

背景:

        写了个简单的onvif相机模拟器,流程是绑定1000个端口作为onvif相机注册信令交换,又绑定一个端口作为rtsp流媒体服务,onvif信令是http请求会经常建立http短链接,奇怪的事是:当部分相机拉着流时,系统就会出现大量CLOSE_WAIT的链接,显示的进程为 -,且存在待接收数据。没有拉流就不会有,有的CLOSE_WAIT也会消失。

执行 netstat -nap|grep CLOSE_WAIT如下:

linux产生大量CLOSE_WAIT且进程名为- 问题_第1张图片

先的时候没发现这个规律,很是头疼一直找是不是什么地方漏close socket了。

抓包分析:

        抓包来看客户端链接tcp 3次握手正常,客户端发来数据,服务器始终无响应,客户端关闭链接。onvif信令和流媒体服务是不同的线程,cpu没有饱和。

怀疑点:

        客户端链接上以后,系统底层完成了tcp 3次握手链接,发起软中断信号等待应用程序调用accept函数接收句柄,但当前线程受其他数据收发影响,导致accept函数不能返回底层建好的链接。程序中定时轮循调用1000个端口绑定的socket accetp,accetp始终返回负数。

        【更新】可能是linux系统限制了socket打开数量,由于已经绑定了1024端口且接收了多个socket,所以再收到链接时系统不能再分配socket。

修改解决:

        fork一个子进程,让流媒体服务的流数据收发到另一个进程就好了。

结论:

        一个进程中绑定多个端口时,数据的收发可能影响accept函数返回socket句柄,导致系统产生大量CLOSE_WAIT句柄,此类CLOSE_WAIT句柄进程名为 - ,排查CLOSE_WAIT原因时需要考虑。

你可能感兴趣的:(烂笔头,hello,world,tcp,编程,网络协议,tcp/ip,linux)