通过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.ccGet "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业务逻辑执行完毕。

// xiaorui.ccvar errTimeout error = &httpError{err: "net/http: timeout awaiting response headers", timeout: true}func (pc *persistConn) roundTrip(req *transportRequest) (resp *Response, err error) {for {testHookWaitResLoop()select {case err := <-writeErrCh:if debugRoundTrip {req.logf("writeErrCh resv: %T/%#v", err, err)}if err != nil {pc.close(fmt.Errorf("write error: %v", err))return nil, pc.mapRoundTripError(req, startBytesWritten, err)}if d := pc.t.ResponseHeaderTimeout; d > 0 {if debugRoundTrip {req.logf("starting timer for %v", d)}timer := time.NewTimer(d)defer timer.Stop() // prevent leaksrespHeaderTimer = timer.C}case <-pc.closech:...case <-respHeaderTimer:if debugRoundTrip {req.logf("timeout waiting for response headers.")}pc.close(errTimeout)return nil, errTimeout

如何解决

要么加大客户端的超时时间,要么优化对端的获取数据的逻辑,总之减少超时的触发。这个问题其实跟 Go 没有关系,换成openresyt和python同样有这个问题。

Go 超时引发大量 fin-wait2相关推荐

  1. mysql 请求超时_由请求超时引发的mysql慢日志问题

    背景 由于系统在生产环境运行了一段时间,发现系统超时的接口的请求越来越多,通过服务器的日志发现同样的接口,有时候会超过2s,  有时候又几百毫秒就完成,通过把 接口的 sql拿出来分析执行,工作量有点 ...

  2. 没有超时和隔离差点引发的系统雪崩

    20170602公司开始618的第二天,收到了业务线订单量下滑的告警. 查看监控平台,移动端下单接口可用率掉到了99.999%,同时服务端调用次数也有一定幅度的下降.既然可用率不到100%,接口肯定有 ...

  3. RPC的超时设置,一不小心就是线上事故

    来自:IT人的职场进阶 上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨 ...

  4. 醉了,RPC 超时设置也能引起线上事故!

    上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨多个服务调用后才能返回结 ...

  5. 同时设置超时时间_刚入职的小菜鸡,设错了RPC超时,搞了个线上事故

    上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨多个服务调用后才能返回结 ...

  6. ajax接口一直在重复调用请求是什么原因_为什么RPC超时设置非常重要

    上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨多个服务调用后才能返回结 ...

  7. 这个超时问题花了我两周才解决!

    我们常说面试造火箭,很多人对此提出质疑,相信大家看了这篇文章会明白面试造火箭的道理,这篇排查问题的技巧涉及到索引,GC,容器,网络抓包,全链路追踪等基本技能,没有这些造火箭的本事,排查这类问题往往会无 ...

  8. RPC 的超时设置,一不小心就是线上事故!

    作者 | 骆俊武 来源 | IT人的职场进阶(ID:BestITer) 上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微 ...

  9. 连接超时_记一次网络请求连接超时的事故

    点击上方蓝色字关注我们~前言 从HTTP请求超时.重试机制.操作系统网络等层面剖析了事故的原因,最终解决业务问题. 这里先抛两个问题: 1)你遭遇过由于网络连接或请求超时造成的生产事故吗? 2)你知道 ...

最新文章

  1. 作业 3 应用分支与循环结构解决问题 统计字符个数
  2. [转]程序员技术练级攻略
  3. 从王者荣耀AI看人工智能与游戏结合的未来意义
  4. 北大AI公开课2019 | 商汤科技沈徽:AI创新与落地
  5. 大规模使用 Apache Kafka 的20个最佳实践
  6. mysql c where_mysql where条件语句优化笔记
  7. 在linux中500g怎么分区,500G的硬盘,怎么分区比较合理?
  8. 在Windows 10上安装TensorFlow 2.2.0 RC4版
  9. 集中器到服务器传输协议,集中器130通讯协议(捷先数码).doc
  10. poythoncode-实战5--json 文件读取,文本文件,csv文件,存到系统中以大列表方式进行存储
  11. Svn插件提交比较慢的解决方法
  12. 信息学竞赛中的直觉与证明 - 刘汝佳
  13. python右对齐输出乘法表_Python 第6讲 打印九九乘法表
  14. (高小德用车)高仿滴滴/快的应用源码
  15. 欢迎使用CSD 第三方士大夫胜多负少的N-markdown编辑器
  16. 文件共享——HHFM
  17. python篮球-python画篮球
  18. Scrapy抓取新浪微博
  19. Excel绘制图表时X轴在有数据点的地方才出现刻度标签
  20. 实时显示当前时间(英文版)

热门文章

  1. 【项目经验】在填写表单时,首先添加一个失去焦点事件,将数据库中信息自动填充信息到表单,其余信息手动填写然后提交表单。
  2. Jlink无法识别CPU/lpc2103/lpc2131
  3. koa-mysql(三)
  4. Struts框架原理分析之我见
  5. MySQL多个相同结构的表查询并把结果合并放在一起的语句(union all)
  6. iOS开发-编译出错 duplicate symbols for architecture x86_64
  7. 精通JavaScript攻击框架:AttackAPI
  8. ReentrantReadWriteLock可重入读写锁分析
  9. [转贴]制作windows 2003自动安装盘-集成补丁/Raid及硬件驱动
  10. CodeForces - 1409F Subsequences of Length Two(dp)