Apache httpd 引发的丢包问题求解

2021-04-03 10:49:00 +08:00
 zhoudaiyu

昨天巡检的时候看 apache 监控视图(open-falcon)发现某台 apache 的网卡流量和连接数从前天晚上突然降到非常低,没来得及保留现场赶紧重启 apache 后恢复。排查了该机器 CPU 内存都没什么问题,apache 日志并没有异常,内核日志无异常,后来看了看 TCP 的监控,发现出问题的时候,有很多 TCPLISTENOVERFLOW 的报错,查了一下可能和 Backlog 和 somaxconn 等参数有些关系,后来我查了一下这台机器的这些配置和其他机器有无差别,也没发现有啥问题。不知道大家有啥排查思路?

1631 次点击
所在节点    Linux
4 条回复
liuxu
2021-04-04 17:18:57 +08:00
TCPLISTENOVERFLOW 的问题在于 backlog 的队列满了没能及时消费掉,所以 tcp 协议栈会停止接收新连接(不返回任何 tcp 包,而是服务端过一会返回 syn ack 装傻告诉客户端没收到 ack,客户端会重发 ack 建立连接),引发这个问题在于为什么你的 apache 的 accept()没有快速消费掉 backlog 的队列

你当时的情况应该是 ESTABLISHED 的连接是满的,只是新连接建立不起来

流量非常低,是因为服务端重复返回 syn ack,装成没收到客户端的 ack,这会导致客户端根据间隔时间指数增加的方式重复发送 ack/psh ack 业务数据包,所以没有正常的入网流量,出网流量会根据你的业务情况,如果不是下载和推送数据类,由于 ESTABLISHED 的连接没能及时处理,也就没有什么出网数据包了,所以出网流量也会很低

重启一下就能好的很难事后分析,自己看看你的业务逻辑和代码吧
liuxu
2021-04-04 17:37:41 +08:00
其实没有业务场景的话我能假设一种情况,你前面有负载均衡 lb,后面 3 台服务器 abc,假设某种原因,ab 服务器当机几分钟后正常,导致 lb 将流量全部给了服务器 c,服务器 c 连接太多,当你重启 c 后,lb 有均分给 3 台服务器了,所以就出现了你这种情况
zhoudaiyu
2021-04-04 17:53:33 +08:00
@liuxu 十分感谢!您的意思是可能是 lb 的问题? lb 是硬件的 lb,用了好几年了都挺稳的,不过也不排除
liuxu
2021-04-04 18:23:55 +08:00
@zhoudaiyu 没有当时情况的具体分析,很难说是什么问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767747

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX