这段时间在做一个项目中,大量运用到了redis,用了很多后台进程跑任务。
后台脚本是个死循环,由于连接redis的类有问题,导致每次进行操作都会进行一次connect,产生一个新连接。一段时间后连接redis的tcp端口过多,超出了系统的默认限制。使用netstat命令查看端口连接数,系统对外端口连接数默认是28232个,使用命令cat /proc/sys/net/ipv4/ip_local_port_range 得出结果32768 61000,意思是系统随机分配端口的范围,28232=61000-32768.
当时做了临时解决,及时close掉redis,但是查看tcp连接,还会保持一定数量的tcp 连接 状态time_out。为什么呢?虽然客户端关闭了连接,但是系统依然会保持这个tcp连接一段时间,时间是msl的2倍,通常是1分钟。使用命令 cat /proc/sys/net/ipv4/tcp_fin_timeout可查看系统保持时间.
MSL 是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态
后来,对redis的连接类做了修改,使用单例,将连接资源存入一个static变量数组中,注意获取连接资源时,需要加上ping,判断该连接资源是否可用。防止redis服务端主动断开连接或者超时,使该连接失效。