0. 背景
公司的服务器后台部署在某一个地方,接入的是用户的APP,而该地方的网络信号较差,导致了服务器后台在运行一段时间后用户无法接入,那边的同事反馈使用netstat查看系统,存在较多的TCP连接。
1. 问题分析
首先在公司内部测试服务器上部署,使用LoadRunner做压力测试,能正常运行,然后那边的同事反馈该地方信号较差。考虑到接入的问题,有可能接入进程的FD资源耗尽,导致accept失败。推论的依据是对于TCP连接来说,如果客户端那边由于一些异常情况导致断网而未能向服务器发起FIN关闭消息,服务端这边若没有设置存活检测的话,该连接会存在(存活时间暂未测)。
2. 实验测试
这里简单地写了一个服务端的程序,主要功能是回应,即接受一个报文(格式:2Byte报文长度+报文内容),然后原封不动将报文内容发回客户端。
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <sys/epoll.h> 5 #include <unistd.h> 6 #include <pthread.h> 7 #include <stdlib.h> 8 #include <string.h> 9 #include <arpa/inet.h> 10 11 int g_epfd; 12 13 int InitServer( unsigned short port ) 14 { 15 int nServerFd = socket( AF_INET, SOCK_STREAM, 0 ); 16 17 struct sockaddr_in addr; 18 memset( &addr, 0, sizeof(addr) ); 19 20 addr.sin_family = AF_INET; 21 addr.sin_port = htons( port ); 22 addr.sin_addr.s_addr = 0; 23 24 if ( bind( nServerFd, (struct sockaddr *)&addr, sizeof(addr) ) <0 ) 25 { 26 printf("bind error\n"); 27 exit(-1); 28 } 29 30 if ( listen( nServerFd, 128 ) < 0 ) 31 { 32 printf("listen error\n"); 33 exit(-1); 34 } 35 36 return nServerFd; 37 } 38 39 int AddFd( <