成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 超時引發大量 Fin-Wait2

開發 后端
通過grafana監控面板,發現了幾個高頻的業務緩存節點出現了大量的fin-wait2,而且fin-wait2狀態持續了不短的時間。通過連接的ip地址和抓包數據判斷出對端的業務。

[[410689]]

本文轉載自微信公眾號「碼農桃花源」,作者峰云就她了。轉載本文請聯系碼農桃花源公眾號。

通過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。

  1. // xiaorui.cc 
  2.  
  3. Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers) 
  4.  
  5. Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers) 
  6.  
  7. Get "http://xxxx": context deadline exceeded (Client.Timeout exceeded while awaiting headers) 

通過strace追蹤socket的系統調用,發現golang的socket讀寫超時沒有使用setsockopt so_sndtimeo so_revtimeo參數。

  1. [pid 34262] epoll_ctl(3, EPOLL_CTL_ADD, 6, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=1310076696, u64=140244877192984}}) = 0 
  2. [pid 34265] epoll_pwait(3,  <unfinished ...> 
  3. [pid 34262] <... getsockname resumed>{sa_family=AF_INET, sin_port=htons(45242), sin_addr=inet_addr("127.0.0.1")}, [112->16]) = 0 
  4. [pid 34264] epoll_pwait(3,  <unfinished ...> 
  5. [pid 34262] setsockopt(6, SOL_TCP, TCP_NODELAY, [1], 4 <unfinished ...> 
  6. [pid 34262] setsockopt(6, SOL_SOCKET, SO_KEEPALIVE, [1], 4 <unfinished ...> 
  7. [pid 34264] read(4,  <unfinished ...> 
  8. [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業務邏輯執行完畢。

  1. // xiaorui.cc 
  2.  
  3. var errTimeout error = &httpError{err: "net/http: timeout awaiting response headers", timeout: true
  4.  
  5. func (pc *persistConn) roundTrip(req *transportRequest) (resp *Response, err error) { 
  6.     for { 
  7.         testHookWaitResLoop() 
  8.         select { 
  9.         case err := <-writeErrCh: 
  10.             if debugRoundTrip { 
  11.                 req.logf("writeErrCh resv: %T/%#v", err, err) 
  12.             } 
  13.             if err != nil { 
  14.                 pc.close(fmt.Errorf("write error: %v", err)) 
  15.                 return nil, pc.mapRoundTripError(req, startBytesWritten, err) 
  16.             } 
  17.             if d := pc.t.ResponseHeaderTimeout; d > 0 { 
  18.                 if debugRoundTrip { 
  19.                     req.logf("starting timer for %v", d) 
  20.                 } 
  21.                 timer := time.NewTimer(d) 
  22.                 defer timer.Stop() // prevent leaks 
  23.                 respHeaderTimer = timer.C 
  24.             } 
  25.         case <-pc.closech: 
  26.             ... 
  27.         case <-respHeaderTimer: 
  28.             if debugRoundTrip { 
  29.                 req.logf("timeout waiting for response headers."
  30.             } 
  31.             pc.close(errTimeout) 
  32.             return nil, errTimeout 

如何解決

要么加大客戶端的超時時間,要么優化對端的獲取數據的邏輯,總之減少超時的觸發。這個問題其實跟 Go 沒有關系,換成openresyt和python同樣有這個問題。

 

責任編輯:武曉燕 來源: 碼農桃花源
相關推薦

2022-02-25 14:12:10

熔斷Sentinel微服務

2020-05-07 11:00:24

Go亂碼框架

2021-01-20 10:16:26

高并發數據服務

2013-07-25 10:30:02

亞馬遜數據中心

2023-04-11 22:01:57

2021-04-26 09:40:46

QPS數據庫Redis

2020-04-02 07:31:53

RPC超時服務端

2021-08-02 22:31:24

Go語言Append

2017-06-09 10:16:40

2015-04-02 09:43:17

2021-09-30 14:23:23

服務器開發工具

2021-10-28 19:35:48

Go 控制超時

2022-01-09 17:38:32

goHttpClient 集群

2020-10-15 12:26:28

黑客勒索軟件攻擊

2012-05-15 09:49:03

TIME_WAITMySQL

2020-08-06 10:12:20

TCP連接網絡協議

2021-07-22 16:19:11

Android 12谷歌用戶

2025-04-23 09:36:23

2021-05-20 06:03:20

比特幣區塊鏈加密貨幣

2021-09-05 11:20:04

帶寬網絡排查
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲成人免费av | 我想看一级黄色毛片 | 亚洲一区二区在线 | 亚洲一区二区三区视频 | 日韩欧美一区二区三区免费看 | 国产一区在线免费观看视频 | 干干干操操操 | 国产精品美女久久久久aⅴ国产馆 | 精品无码久久久久久国产 | 99久久婷婷国产综合精品 | 国产午夜精品久久 | 日本久久网站 | 一区二区三区不卡视频 | 久久精品综合 | 亚洲一区二区不卡在线观看 | 91毛片网| h网站在线观看 | 在线一区 | 欧美 日韩 国产 一区 | 国产精品区一区二区三 | 亚洲狠狠爱一区二区三区 | 久久久精品一区 | 色婷婷一区 | 亚洲综合三区 | 91精品国产91久久久久福利 | 中文字幕亚洲精品在线观看 | 九九视频在线观看 | 欧美在线观看一区二区 | 一区二区三区国产 | 日韩在线免费视频 | 中文字幕久久精品 | 6080亚洲精品一区二区 | 黄色网络在线观看 | 国产精品不卡视频 | 国产高清视频 | 成人av在线大片 | 91国内精品| 国产亚洲高清视频 | 在线 丝袜 欧美 日韩 制服 | 日韩高清国产一区在线 | 一区二区三区四区电影视频在线观看 |