协议深入系列第7篇。
先扔个真实场景
有一次半夜两点,服务端收到报警,说某台机器连接数异常堆积。
上去一看,ESTABLISHED连接好几万,但业务QPS几乎为零。
连接状态全是活的。人全没了。
这就是TCP Keepalive没开的后果。连接池里全是僵尸,占着文件描述符不干活,等到业务恢复时发现连不上,还得等超时重试。
后来把这个案例写进复盘,顺手把TCP Keepalive彻底撸了一遍。
这玩意儿到底干嘛的
TCP连接建好之后,如果双方都不发数据,这条连接可以安安静静挂在那,操作系统不会主动去问对方还在不在。
对方可能早挂了:手机切了网络、NAT映射过期、防火墙清了状态、主机直接断电。
但你这边TCP状态还是ESTABLISHED。
Keepalive解决的就是这个问题——在连接空闲到一定时间后,主动发一个探测包,确认对端TCP栈还能不能回话。
注意措辞:确认的是对端TCP栈还通不通,不确认业务还活不活。
默认配置就是一个坑
Linux默认值长这样:
tcp_keepalive_time = 7200 tcp_keepalive_intvl = 75 tcp_keepalive_probes = 9什么意思?连接空了两小时后才开始探测,每75秒探一次,连探9次都失败才认为断了。<