昨天巡检的时候看 apache 监控视图(open-falcon)发现某台 apache 的网卡流量和连接数从前天晚上突然降到非常低,没来得及保留现场赶紧重启 apache 后恢复。排查了该机器 CPU 内存都没什么问题,apache 日志并没有异常,内核日志无异常,后来看了看 TCP 的监控,发现出问题的时候,有很多 TCPLISTENOVERFLOW 的报错,查了一下可能和 Backlog 和 somaxconn 等参数有些关系,后来我查了一下这台机器的这些配置和其他机器有无差别,也没发现有啥问题。不知道大家有啥排查思路?
1
liuxu 2021-04-04 17:18:57 +08:00 2
TCPLISTENOVERFLOW 的问题在于 backlog 的队列满了没能及时消费掉,所以 tcp 协议栈会停止接收新连接(不返回任何 tcp 包,而是服务端过一会返回 syn ack 装傻告诉客户端没收到 ack,客户端会重发 ack 建立连接),引发这个问题在于为什么你的 apache 的 accept()没有快速消费掉 backlog 的队列
你当时的情况应该是 ESTABLISHED 的连接是满的,只是新连接建立不起来 流量非常低,是因为服务端重复返回 syn ack,装成没收到客户端的 ack,这会导致客户端根据间隔时间指数增加的方式重复发送 ack/psh ack 业务数据包,所以没有正常的入网流量,出网流量会根据你的业务情况,如果不是下载和推送数据类,由于 ESTABLISHED 的连接没能及时处理,也就没有什么出网数据包了,所以出网流量也会很低 重启一下就能好的很难事后分析,自己看看你的业务逻辑和代码吧 |
2
liuxu 2021-04-04 17:37:41 +08:00 1
其实没有业务场景的话我能假设一种情况,你前面有负载均衡 lb,后面 3 台服务器 abc,假设某种原因,ab 服务器当机几分钟后正常,导致 lb 将流量全部给了服务器 c,服务器 c 连接太多,当你重启 c 后,lb 有均分给 3 台服务器了,所以就出现了你这种情况
|