您现在的位置是:亿华云 > 域名
Go 超时引发大量 Fin-Wait2
亿华云2025-10-03 22:23:13【域名】3人已围观
简介本文转载自微信公众号「码农桃花源」,作者峰云就她了。转载本文请联系码农桃花源公众号。通过grafana监控面板,发现了几个高频的业务缓存节点出现了大量的fin-wait2,而且fin-wait2状态持
本文转载自微信公众号「码农桃花源」,大量作者峰云就她了。大量转载本文请联系码农桃花源公众号。大量
通过grafana监控面板,大量发现了几个高频的大量业务缓存节点出现了大量的fin-wait2,而且fin-wait2状态持续了不短的大量时间。通过连接的大量ip地址和抓包数据判断出对端的业务。除此之外,大量频繁地去创建新连接,大量我们对golang net/http transport的大量连接池已优化过,但established已建连的大量连接没有得到复用。
另外,大量随之带来的大量问题是大量time-wait的出现,毕竟fin-wait2在拿到对端fin后会转变为time-wait状态。大量但该状态是大量正常的。亿华云计算
分析问题
通过分析业务日志发现了大量的接口超时问题,连接的地址跟netstat中fin-wait2目的地址是一致的。那么问题已经明确了,当http的请求触发超时,定时器对连接对象进行了关闭。这边都close了,那么连接自然无法复用,所以就需要创建新连接,但由于对端的API接口出现逻辑阻塞,自然就又触发了超时,continue。
// xiaorui.cc Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers) Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers) Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers)通过strace追踪socket的系统调用,发现golang的socket读写超时没有使用setsockopt so_sndtimeo so_revtimeo参数。
[pid 34262] epoll_ctl(3, EPOLL_CTL_ADD, 6, { EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, { u32=1310076696, u64=140244877192984}}) = 0 [pid 34265] epoll_pwait(3, <unfinished ...> [pid 34262] <... getsockname resumed>{ sa_family=AF_INET, sin_port=htons(45242), sin_addr=inet_addr("127.0.0.1")}, [112->16]) = 0 [pid 34264] epoll_pwait(3, <unfinished ...> [pid 34262] setsockopt(6, SOL_TCP, TCP_NODELAY, [1], 4 <unfinished ...> [pid 34262] setsockopt(6, SOL_SOCKET, SO_KEEPALIVE, [1], 4 <unfinished ...> [pid 34264] read(4, <unfinished ...> [pid 34262] setsockopt(6, SOL_TCP, TCP_KEEPINTVL, [30], 4 <unfinished ...>代码分析
通过net/http源码可以看到socket的超时控制是通过定时器来实现的,服务器租用在连接的roundTrip方法里有超时引发关闭连接的逻辑。由于http的语义不支持多路复用,所以为了规避超时后再回来的数据造成混乱,索性直接关闭连接。
当触发超时会主动关闭连接,这里涉及到了四次挥手,作为关闭方会发送fin,对端内核会回应ack,这时候客户端从fin-wait1到fin-wait2,而服务端在close-wait状态,等待触发close syscall系统调用。服务端什么时候触发close动作?需要等待net/http handler业务逻辑执行完毕。
如何解决
要么加大客户端的超时时间,要么优化对端的获取数据的逻辑,总之减少超时的触发。这个问题其实跟 Go 没有关系,换成openresyt和python同样有这个问题。
网站模板很赞哦!(5)
相关文章
- 4、club娱乐
- Vue使用技巧和项目中遇到的问题
- Java线程池实现原理与技术,看这一篇就够了
- 为什么阿里巴巴禁止在foreach循环里进行元素的remove/add操作
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- 几行JavaScript代码构建计算机视觉程序,这里有6个js框架
- 程序员是如何神不知鬼不觉的弄丢银行1分钱的?
- 惊到了!大神炮轰CUDA:CUDA存致命缺陷,它不是未来!这种新语言将打破英伟达的GPU垄断地位,护城河终会消失!
- 尽量不要在域名中出现特殊字符,这样的域名很容易导致访问者输入错误,同时给人留下不专业的印象,降低网站的可信度,并流失大量潜在客户。
- 22个每个程序员都应该知道的 Git 命令