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

淺談Pprof,你了解多少?

開發 開發工具
對于大多數 Gopher 而言,一般平時最主要的工作內容除了實現各種無聊的業務邏輯之外,剩下的就是解決各種瑣碎的問題。

[[403923]]

本文轉載自微信公眾號「架構技術漫談」,作者LA0WAN9。轉載本文請聯系架構技術漫談公眾號。

對于大多數 Gopher 而言,一般平時最主要的工作內容除了實現各種無聊的業務邏輯之外,剩下的就是解決各種瑣碎的問題。比如:查詢性能瓶頸在哪里?查詢內存泄漏在哪里?好在 pprof 是處理此類問題的利器,共有兩套標準庫,分別適用于不同的場景:

  • runtime/pprof[1]:采集工具型應用運行數據進行分析
  • net/http/pprof[2]:采集服務型應用運行時數據進行分析

命令行工具「go test」就包含了 runtime/pprof,相關參數請參考「go help testflag」:

  1. shell> go test -cpuprofile cpu.out -memprofile mem.out -bench . 

不過和 runtime/pprof 相比,更常用的是 net/http/pprof,接下來我們主要通過它來解決一些常見問題,想要激活 net/http/pprof 的話很簡單,只要導入對應的包并啟動服務即可:

  1. import _ "net/http/pprof" 
  2.  
  3. func main() { 
  4.  _ = http.ListenAndServe("localhost:6060", nil) 

需要注意的是,千萬別讓外網訪問到 pprof,否則可能會導致出現安全問題。有興趣的讀者可以嘗試通過 google 搜索「intitle:/debug/pprof/ inurl:/debug/pprof/」看看反面例子。

Profile

pprof 預置了很多種不同類型的 profile,我們可以按照自己的需要選擇:

  • allocs:A sampling of all past memory allocations
  • block:Stack traces that led to blocking on synchronization primitives
  • goroutine:Stack traces of all current goroutines
  • heap:A sampling of memory allocations of live objects
  • mutex:Stack traces of holders of contended mutexes
  • profile:CPU profile
  • threadcreate:Stack traces that led to the creation of new OS threads

其中最常用的是 profile 和 heap,分別用來診斷 CPU 和內存問題。

CPU profiling

演示代碼模擬了 CPU 密集型任務(onCPU)和耗時的網絡請求(offCPU):

  1. package main 
  2.  
  3. import ( 
  4.  "log" 
  5.  "net/http" 
  6.  _ "net/http/pprof" 
  7.  "runtime" 
  8.  "time" 
  9.  
  10.  "github.com/felixge/fgprof" 
  11.  
  12. const cpuTime = 1000 * time.Millisecond 
  13.  
  14. func main() { 
  15.  runtime.SetBlockProfileRate(1) 
  16.  runtime.SetMutexProfileFraction(1) 
  17.  
  18.  go func() { 
  19.   http.Handle("/debug/fgprof", fgprof.Handler()) 
  20.   log.Println(http.ListenAndServe(":6060", nil)) 
  21.  }() 
  22.  
  23.  for { 
  24.   cpuIntensiveTask() 
  25.   slowNetworkRequest() 
  26.  } 
  27.  
  28. func cpuIntensiveTask() { 
  29.  start := time.Now() 
  30.  
  31.  for time.Since(start) <= cpuTime { 
  32.   for i := 0; i < 1000; i++ { 
  33.    _ = i 
  34.   } 
  35.  } 
  36.  
  37. func slowNetworkRequest() { 
  38.  resp, err := http.Get("http://httpbin.org/delay/1"
  39.  
  40.  if err != nil { 
  41.   log.Fatal(err) 
  42.  } 
  43.  
  44.  defer resp.Body.Close() 

通過 go tool pprof 查看 /debug/pprof/profile:

  1. go tool pprof -http :8080 http://localhost:6060/debug/pprof/profile 

結果發現 profile 只能檢測到 onCPU(也就是 cpuIntensiveTask)部分,卻不能檢測到 offCPU (也就是 slowNetworkRequest)部分:

profile

為了檢測 offCPU 部分,我們引入 fgprof,通過 go tool pprof 查看 /debug/fgprof:

  1. go tool pprof -http :8080 http://localhost:6060/debug/fgprof 

結果發現 fgprof 不僅能檢測到 onCPU(也就是 cpuIntensiveTask)部分,還能檢測到 offCPU (也就是 slowNetworkRequest)部分:

fgprof

實際應用中,最好對你的瓶頸是 onCPU 還是 offCPU 有一個大體的認識,進而選擇合適的工具,如果不確定就直接用 fgprof,不過需要注意的是 fgprof 對性能的影響較大。

Memory profiling

演示代碼模擬了一段有內存泄漏問題的程序:

  1. package main 
  2.  
  3. import ( 
  4.  "log" 
  5.  "net/http" 
  6.  _ "net/http/pprof" 
  7.  "time" 
  8.  
  9. func main() { 
  10.  go func() { 
  11.   log.Println(http.ListenAndServe(":6060", nil)) 
  12.  }() 
  13.  
  14.  for { 
  15.   leak() 
  16.  } 
  17.  
  18. func leak() { 
  19.  s := make([]string, 10) 
  20.  
  21.  for i := 0; i < 10000000; i++ { 
  22.   s = append(s, "leak"
  23.  
  24.   if (i % 10000) == 0 { 
  25.    time.Sleep(1 * time.Second
  26.   } 
  27.  
  28.   _ = s 
  29.  } 

通過 go tool pprof 查看 /debug/pprof/head(這次不用 web,用命令行):

heap

通過 top 命令可以很直觀的看出哪里可能出現了內存泄漏問題。不過這里有一個需要說明的問題是內存占用大的地方本身可能是正常的,與內存的絕對值大小相比,我們更應該關注的是不同時間點內存相對變化大小,這里可以使用參數 base 或者 diff_base:

heap

本文篇幅有限,無法列舉更多的例子,有興趣的讀者推薦參考「golang pprof 實戰[3]」。

參考資料

[1]runtime/pprof: https://golang.org/pkg/runtime/pprof/

[2]net/http/pprof: https://golang.org/pkg/net/http/pprof/

[3]golang pprof 實戰: https://blog.wolfogre.com/posts/go-ppof-practice/

 

責任編輯:武曉燕 來源: 架構技術漫談
相關推薦

2020-03-25 08:47:22

智能邊緣邊緣計算網絡

2023-10-25 08:17:06

Lite模式代理類

2023-10-29 08:35:47

AndroidAOP編程

2012-12-27 10:58:24

KVMKVM概念

2022-06-07 07:37:40

線程進程開發

2023-09-07 10:26:50

接口測試自動化測試

2022-02-08 12:06:12

云計算

2019-08-07 17:18:18

云計算云原生函數

2011-08-23 11:03:35

ATM

2025-01-16 10:41:40

2020-12-10 09:00:00

開發.NET工具

2015-11-09 10:44:37

DevOpsIT運維

2023-12-24 12:56:36

協程

2023-08-17 10:12:04

前端整潔架構

2021-12-09 07:47:58

Flink 提交模式

2018-10-15 12:42:21

2011-08-10 09:35:38

2021-09-07 18:34:14

混合云架構私有云云計算

2017-05-26 18:30:34

華為

2023-09-14 08:30:46

JsonPathXPath
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久一区二区三区免费 | 欧洲成人免费视频 | 国产欧美日韩精品一区二区三区 | 久操亚洲| 亚洲在线免费观看 | 中文字幕在线观看日韩 | 国产原创在线观看 | 一级黄色大片 | 亚洲欧美久久 | 日韩中文一区 | 日韩精品在线看 | 色婷婷九月 | 精品人伦一区二区三区蜜桃网站 | www久| 欧美天堂 | 羞羞视频网站在线观看 | 欧美 日本 国产 | 成人免费区一区二区三区 | 91精品国产91久久久 | 日韩在线不卡 | 国产精品久久国产精品久久 | 亚洲免费在线观看 | 日韩福利电影 | 久久久久无码国产精品一区 | 日韩欧美在线播放 | 欧美福利视频一区 | 五月激情久久 | 日本欧美黄色片 | 日韩一区二区在线观看视频 | 亚洲一区二区三区在线视频 | 蜜桃视频一区二区三区 | 在线看h| 成人午夜电影在线观看 | 国产精品美女www爽爽爽 | 一级片在线观看 | 成人精品一区二区三区 | 久草网视频 | 九九综合 | 在线国产一区二区 | 中文字幕精品一区 | 一区二区三区不卡视频 |