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

如何給 Go 提性能優化的 pr

開發 后端
優化前每個 tls 連接上都有一個 write buffer,但是活躍的連接數很少,很多內存都被閑置了,這種就可以用 sync.Pool 來優化了。

[[415262]]

本文轉載自微信公眾號「碼農桃花源」,作者小X。轉載本文請聯系碼農桃花源公眾號。

你好,我是小X。

曹大最近開 Go 課程了,小X 正在和曹大學 Go。

這個系列會講一些從課程中學到的讓人醍醐灌頂的東西,撥云見日,帶你重新認識 Go。

之前寫了一篇《成為 Go Contributor》 的文章,講了如何給 Go 提一個 typo 的 pr,以此熟悉整個流程。當然,離真正的 Contributor 還差得遠。

開課前曹大在 Go 夜讀上講了他給 Go 提的一個關于 tls 的性能優化,課上又細講了下,本文就帶大家來學習下他優化了啥以及如何看優化效果。

第一次提的 pr 在這里,之后又挪到了一個新的位置,前后有一些代碼上的簡化,最后看著挺舒服。

優化前每個 tls 連接上都有一個 write buffer,但是活躍的連接數很少,很多內存都被閑置了,這種就可以用 sync.Pool 來優化了。

conn

用 sync.Pool 緩存 []byte,并順帶將連接上的一個 outBuf 字段給干掉了:

files changed

整體上改動挺少,效果也不錯。

雖然一開始給了 _test 文件,但其實并不能太好反映性能的提升。因此后面曹大又寫了一個簡單的 client 和 server 來實際測試。

我在開發機上測了一下,優化還是挺明顯的。這又是一個使用 pprof 查看性能優化的好例子。

client 的代碼如下:

  1. package main 
  2.  
  3. import ( 
  4.  "crypto/tls" 
  5.  "fmt" 
  6.  "io/ioutil" 
  7.  "net/http" 
  8.  "os" 
  9.  "strconv" 
  10.  "sync" 
  11.  
  12.  "go.uber.org/ratelimit" 
  13.  
  14. func main() { 
  15.  url := os.Args[3] 
  16.  connNum, err := strconv.ParseInt(os.Args[1], 10, 64) 
  17.  if err != nil { 
  18.   fmt.Println(err) 
  19.   return 
  20.  } 
  21.  
  22.  qps, err := strconv.ParseInt(os.Args[2], 10, 64) 
  23.  if err != nil { 
  24.   fmt.Println(err) 
  25.   return 
  26.  } 
  27.  
  28.  bucket := ratelimit.New(int(qps)) 
  29.  
  30.  var l sync.Mutex 
  31.  connList := make([]*http.Client, connNum) 
  32.  
  33.  for i := 0; ; i++ { 
  34.   bucket.Take() 
  35.   i := i 
  36.   go func() { 
  37.    l.Lock() 
  38.    if connList[i%len(connList)] == nil { 
  39.     connList[i%len(connList)] = &http.Client{ 
  40.      Transport: &http.Transport{ 
  41.       TLSClientConfig:     &tls.Config{InsecureSkipVerify: true}, 
  42.       IdleConnTimeout:     0, 
  43.       MaxIdleConns:        1, 
  44.       MaxIdleConnsPerHost: 1, 
  45.      }, 
  46.     } 
  47.    } 
  48.    conn := connList[i%len(connList)] 
  49.    l.Unlock() 
  50.    if resp, e := conn.Get(url); e != nil { 
  51.     fmt.Println(e) 
  52.    } else { 
  53.     defer resp.Body.Close() 
  54.     ioutil.ReadAll(resp.Body) 
  55.    } 
  56.   }() 
  57.  } 
  58.  

邏輯比較簡單,就是固定連接數、固定 QPS 向服務端發請求。

server 的代碼如下:

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  "net/http" 
  6.  _ "net/http/pprof" 
  7.  
  8. var content = make([]byte, 16000) 
  9.  
  10. func sayhello(wr http.ResponseWriter, r *http.Request) { 
  11.  wr.Header()["Content-Length"] = []string{fmt.Sprint(len(content))} 
  12.  wr.Header()["Content-Type"] = []string{"application/json"
  13.  wr.Write(content) 
  14.  
  15. func main() { 
  16.  go func() { 
  17.   http.ListenAndServe(":3333", nil) 
  18.  }() 
  19.  http.HandleFunc("/", sayhello) 
  20.  
  21.  err := http.ListenAndServeTLS(":4443""server.crt""server.key", nil) 
  22.  if err != nil { 
  23.   fmt.Println(err) 
  24.  } 

邏輯也很簡單,起了一個 tls server,并注冊了一個 sayhello 接口。

啟動 server 后,先用 1.15(1.17 之前的版本都可以,曹大的改動還沒合入)測試:

  1. go run server.go 
  2.  
  3. # 1000 個連接,100 個 QPS 
  4. go run client.go 1000 100 https://localhost:4443 

查看 server 的內存 profile。后面還會用 --base 的命令,比較前后兩個 profile 文件的差異。

pprof 的命令如下:

  1. go tool pprof --http=:8000 http://127.0.0.1:3333/debug/pprof/heap 

Go 1.15 mem profile

看看這個大“平頂山”,有那味了(平頂山表示可以優化,如果是那種特別窄的尖尖就沒辦法了)~

因為這個 pr 已經合到了 1.17,我們再用 1.17 來測一下:

  1. go1.17rc1 run server.go 
  2. go1.17rc1 run client.go 1000 100 https://localhost:4443 

Go 1.17 mem profile

為了使用 --base 命令來進行比較,需要把 profile 文件保存下來:

  1. curl http://127.0.0.1:3333/debug/pprof/heap > mem.1.14 
  2. curl http://127.0.0.1:3333/debug/pprof/heap > mem.1.17 

最后來比較優化前后的差異:

  1. go tool pprof -http=:8000 --base mem.1.15 mem.1.17 

--base

優化效果還是很明顯的。我們來看菜單欄里的 view->top:

view->top

整個優化從最終的提交來看還挺簡單,但是能發現問題所在,并能結合自己的知識儲備進行優化還是挺難的。我們平時也要多積累相關的優化經驗,到關鍵時候才能頂上去。像 pprof 的使用,要自己多加練習。

好了,這就是今天全部的內容了~ 我是小X,我們下期再見~

參考資料

[1]tls 的性能優化: https://www.bilibili.com/video/BV1Z64y1m7uc

[2]這里: https://go-review.googlesource.com/c/go/+/263277

[3]位置: https://go-review.googlesource.com/c/go/+/267957

 

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

2022-06-21 09:26:28

開源項目PR

2021-08-13 09:06:52

Go高性能優化

2023-12-30 18:35:37

Go識別應用程序

2020-10-16 09:00:12

前端開發技術

2009-06-10 22:00:57

JavaScript腳

2009-06-11 17:15:23

JavaScript性

2023-10-18 10:38:53

API

2020-10-16 10:40:39

前端性能可視化

2024-02-26 00:02:00

開發Go

2022-10-09 11:32:52

數據分析業務銷量

2023-10-30 16:14:44

Metrics SD數據庫

2021-08-05 08:18:02

開源項目 PR

2020-12-11 18:58:21

Nginx瀏覽器緩存

2024-03-12 09:47:10

Redis數據庫

2011-03-01 17:26:48

WLAN優化

2022-03-30 08:36:32

Node.jsPRHTTP

2022-08-03 09:11:31

React性能優化

2023-01-30 08:30:09

Tomcat性能優化

2022-09-26 09:19:38

服務器優化

2021-11-17 08:16:03

內存控制Go
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 特级做a爰片毛片免费看108 | 在线一区视频 | 超级乱淫av片免费播放 | 欧美一区视频 | 日韩精品极品视频在线观看免费 | 国产精品7777777 | 免费骚视频 | 在线观看涩涩视频 | 另类专区亚洲 | 天天草狠狠干 | 99热首页| 中文字幕一区二区三区精彩视频 | 一区二区三区精品视频 | 久久激情视频 | 日韩黄色小视频 | 天天干天天干 | 成人在线小视频 | 中文字幕亚洲精品在线观看 | 国产精品一区在线 | 精品久久久久久 | 黄色国产在线播放 | 国产精品激情 | 欧美国产激情 | 国产三区在线观看视频 | 亚洲精品99 | 成人免费网站 | 在线观看中文字幕视频 | 在线一区| 成人h视频在线 | 欧美日韩视频在线播放 | www.国产 | 九九热在线免费观看 | 亚洲精品区 | 欧美日韩在线不卡 | 欧美日韩亚洲视频 | 国产日韩精品久久 | 亚洲成人av一区二区 | 亚洲图片一区二区三区 | 欧美在线日韩 | 日韩精品一区二区久久 | 国产精品国产精品国产专区不卡 |