这篇博客从常见的i/o timeout现象入手, 经过抓包确认了是自连接创建3s后,http客户端主动断开连接(怀疑超时原因), 然后进一步跟踪源码,同时按照调用链路贴出源码,追踪出了超时原因和超时错误产生的位置.

整个过程环环相扣,读完印象深刻,好像自己分析定位出来的原因一样.

从这篇文章可以学会如下技能:

  • 1.抓包

  • 2.golang net/http设置超时分为两种
    • 2.1 自连接创建时开始计算的超时,如果这个连接被复用,那么每次请求时间都会累计到超时时间里。
    • 2.2 每次请求的超时
  • 3.net/http包复用长连接的缘由

  • 4.net/http包复用长连接的实现(源码分析)
    • 4.1 一个域名,一个长连接,每个连接对应2个携程(1个读,1个写) 所以,如果有N个域名,会有1+2*N个携程,1个建立连接的携程,N对读写携程 // 附录2,携程泄漏
    • 4.2 超时的触发过程
    • 4.3 i/o timeout在源码中产生的位置
  • 5.学习博客中如何贴源代码 按照调用链路贴出函数和关键代码行即可,力求让读者不用看源码,只用看博客的跟踪链路即可明白源码的链路.

参考

1.i/o timeout , 希望你不要踩到这个net/http包的坑

2.携程泄漏分析

3.给大家丢脸了,用了三年golang,我还是没答对这道内存泄漏题

这篇文章后面有很多面试题链接

连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。
昨天那个在for循环里append元素的同事,今天还在么?
golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个case呢?
golang面试官:for select时,如果通道已经关闭会怎么样?如果只有一个case呢?
golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?
golang面试题:对未初始化的的chan进行读写,会怎么样?为什么?
golang 面试题:reflect(反射包)如何获取字段 tag?为什么 json 包不能导出私有变量的 tag?
golang面试题:json包变量不加tag会怎么样?
golang面试题:怎么避免内存逃逸?
golang面试题:简单聊聊内存逃逸?
golang面试题:字符串转成byte数组,会发生内存拷贝吗?
golang面试题:翻转含有中文、数字、英文字母的字符串
golang面试题:拷贝大切片一定比小切片代价大吗?
golang面试题:能说说uintptr和unsafe.Pointer的区别吗?

4.TCP协议之RST与FIN 缓冲区所有数据包都发送完成才会发送FIN包

发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。

原创文章转载请注明出处: 【转载】i/o timeout,希望你不要踩到这个net/http包的坑:Go内存泄露