前文
今天被一个bug给困扰,k8s集群上,不同节点的同个服务访问同一台服务器结果不同,区别在于如果同节点的并发量一旦上去,在该节点上去telnet对应服务器的80端口,会不通。
排查
因为是telnet直接不通,所以可以否定是应用层的拦截,定位在tcp层拦截,逐一排查防火墙、iptables等都未做拦截,并且注意到是当并发数上去后才会出现失败,继而通过抓包定位到当发往目标服务器三次握手是,即syn,目标服务器不会答复ack,而这边会不断重试(Retransmission)
结论
翻到一篇,写的很适合,直接饮用:https://codeantenna.com/a/7f71g3pzce。
本质上两条命令确认是否是tcp连接重用,然后因为时间戳的原因导致后续的连续都被抛弃了:
查看是否又因为时间戳丢包的情况
netstat -s | grep timestamp
接着:
查看tcp复用连接是否开启
cat /proc/sys/net/ipv4/tcp_tw_recycle
将其改成0, sysctl -p使其生效后,问题解决