国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Go性能分析工具pprof詳解

這篇具有很好參考價值的文章主要介紹了Go性能分析工具pprof詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


一、什么是pprof

pprof是Go官方提供的性能分析工具,可以分析程序的運行情況,并且提供可視化的功能。prof是profile(畫像)的縮寫,使用pprof可以分析以下幾種指標數(shù)據(jù):
go pprof,go,golang,開發(fā)語言,后端

  • allocs:程序啟動之后內(nèi)存分配的情況
  • block:導致阻塞操作的一些堆棧跟蹤信息
  • cmdline:當前程序啟動的命令行
  • goroutine:所有當前 goroutine 的堆棧跟蹤信息
  • heap:程序在當前堆上內(nèi)存分配的情況
  • mutex:鎖資源的競爭的堆棧信息
  • profileCPU profile文件??梢栽?debug/pprof?seconds=x秒 GET 參數(shù)中指定持續(xù)時間。獲取pprof文件后,使用 go tool pprof x.prof命令分析pprof文件。
  • threadcreate:系統(tǒng)線程的使用情況
  • trace:當前系統(tǒng)的代碼執(zhí)行的鏈路情況

使用pprof工具主要分析以下幾種指標:

  • CPU ProfilingCPU 分析,按照一定的頻率采集所監(jiān)聽的應(yīng)用程序 CPU(含寄存器)的使用情況,可確定應(yīng)用程序在主動消耗 CPU 周期時花費時間的位置

  • Memory Profiling:內(nèi)存分析,在應(yīng)用程序進行堆分配時記錄堆棧跟蹤,用于監(jiān)視當前和歷史內(nèi)存使用情況,以及檢查內(nèi)存泄漏

  • Block Profiling:阻塞分析,記錄 goroutine 阻塞等待同步(包括定時器通道)的位置

  • Mutex Profiling:互斥鎖分析,報告互斥鎖的競爭情況。

當程序存在內(nèi)存或者CPU飆升的情況時,我們可以通過pprof工具來查詢問題出現(xiàn)的根源。


二、怎么使用pprof

pprof包含兩個相關(guān)的庫:

  1. runtime/pprof
    主要應(yīng)用于工具型應(yīng)用。包含腳本、定時任務(wù)等。
    如:對于只跑一次的程序,例如每天只跑一次的離線預(yù)處理程序,調(diào)用 pprof 包提供的函數(shù),手動開啟性能數(shù)據(jù)采集
  2. net/http/pprof
    主要應(yīng)用于服務(wù)型應(yīng)用。包含HTTP服務(wù),GRPC服務(wù)等。
    如:對于在線服務(wù),對于一個 HTTP Server,訪問 pprof 提供的 HTTP 接口,獲得性能數(shù)據(jù)。當然,實際上這里底層也是調(diào)用的 runtime/pprof提供的函數(shù),封裝成接口對外提供網(wǎng)絡(luò)訪問。

1. 工具型應(yīng)用

工具型應(yīng)用主要使用runtime/pprof包實現(xiàn)性能分析。

func main() {
	// --- cpu 分析示例 start---
	// 創(chuàng)建cpu分析文件
	fc, err := os.Create("./cpu.prof")
	if err != nil {
		fmt.Println("create cpu.prof err:", err.Error())
		return
	}
	defer fc.Close()

	// 開始分析cpu
	err = pprof.StartCPUProfile(fc)
	if err == nil {
		defer pprof.StopCPUProfile()
	}
	// --- cpu 分析示例 end---
	
	var count int
	for i := 0; i < 10000; i++ {
		count++
	}

	// --- 內(nèi)存 分析示例 start---
	fm, err := os.Create("./memory.prof")
	if err != nil {
		fmt.Println("create memory.prof err:", err.Error())
		return
	}
	defer fm.Close()

	// 開始分析內(nèi)存
	err = pprof.WriteHeapProfile(fm)
	if err != nil {
		fmt.Println("write heap prof err:", err.Error())
		return
	}
	// --- 內(nèi)存 分析示例 end---

	for i := 0; i < 10000; i++ {
		count++
	}
	fmt.Println("do finish......count:", count)
}

執(zhí)行go run main.go后,在代碼目錄下,可以看到生成了cpu.profmemory.prof文件。
通過執(zhí)行go tool pprof ./memory.prof或者
go tool pprof -http=:8888 ./memory.prof進入命令行模式或者web頁面進行性能分析。

執(zhí)行go tool pprof ./memory.prof進入命令行:
go pprof,go,golang,開發(fā)語言,后端

執(zhí)行go tool -http=:8888 pprof ./memory.prof可進入web頁面,更方便查看:
go pprof,go,golang,開發(fā)語言,后端
頁面展示效果:
go pprof,go,golang,開發(fā)語言,后端
SAMPLE各個標簽的含義解釋:
go pprof,go,golang,開發(fā)語言,后端

2. 服務(wù)型應(yīng)用

對于服務(wù)類型的應(yīng)用,主要在服務(wù)內(nèi)部匿名引入net/http/pprof包,然后通過HTTP訪問pprof頁面。
匿名引入方式為:import _ "net/http/pprof"

package main

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
)

func main() {
	http.HandleFunc("/", hello)
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Println("ListenAndServe Err:", err.Error())
		return
	}
}

func hello(resp http.ResponseWriter, req *http.Request) {
	fmt.Fprintln(resp, "Hello World, Are You OK?")
}

執(zhí)行http://localhost:8080/debug/pprof/可以看到畫像信息:
go pprof,go,golang,開發(fā)語言,后端

但是需要注意,如果HTTP服務(wù)不是通過
http.ListenAndServe(":8080", nil)啟動的,而是指定第二個參數(shù)啟動的話,需要自己注冊pprof路由。

net/http/pprof/pprof.go的官方源碼注釋中也提到此種情況:

If you are not using DefaultServeMux, you will have to register handlers with the mux you are using.
如果您不使用DefaultServeMux,則必須向所使用的多路復(fù)用器注冊pprof處理程序
http.ListenAndServe函數(shù)可以傳遞handler,如果handler不為nil,則說明研發(fā)自定義了 ServeMux,否則用的是默認DefaultServeMux

net/http/pprof包中,有init函數(shù)

func init() {
   http.HandleFunc("/debug/pprof/", Index)
   http.HandleFunc("/debug/pprof/cmdline", Cmdline)
   http.HandleFunc("/debug/pprof/profile", Profile)
   http.HandleFunc("/debug/pprof/symbol", Symbol)
   http.HandleFunc("/debug/pprof/trace", Trace)
}

所以如果使用默認ServeMux,則不需要注冊,但是如果使用自定義的ServeMux,則需要增加注冊后,才能獲取到pprof。

// 自己注冊這幾個函數(shù)
r.HandleFunc("/debug/pprof/", pprof.Index)
r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
r.HandleFunc("/debug/pprof/profile", pprof.Profile)
r.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
r.HandleFunc("/debug/pprof/trace", pprof.Trace)

另外一種啟動pprof的方式在生產(chǎn)環(huán)境中更加常用:通過協(xié)程另起一個HTTP服務(wù),單獨用作pprof分析:

func RegisterProf() {
	go func() {
		if err := http.ListenAndServe(":6060", nil); err != nil {
			panic("pprof server start error: " + err.Error())
		}
	}()
}

三、pprof數(shù)據(jù)分析

GO官方提供了go tool pprof工具來幫助我們分析pprof生成的數(shù)據(jù)文件。
使用go tool pprof分析數(shù)據(jù),主要有兩種模式:

  1. 命令行交互模式
    go tool pprof [file_pprof|url_pprof]
  2. web頁面模式
    go tool pprof -http=:6666 [file_pprof|url_pprof]
    其中,file_pprof表示生成的prof分析文件,如cpu.prof;url_pprof表示遠端服務(wù)開啟的pprof訪問,如http://localhost:8080/debug/pprof/profile

進入命令行交互模式后,可以使用help查看所有子命令,使用help <cmd|option>查看子命令使用方法。如 help、help top

CPU Profiling

瀏覽器訪問/debug/pprof/profile會自動進行 CPU profiling,默認持續(xù) 30s,并生成一個文件供下載,可以通過帶參數(shù)?seconds=60進行60秒的數(shù)據(jù)采集。

為了模擬請求,使用ab進行壓測,
ab -k -c 1 -t 180 -n 100000000 http://localhost:8080/hello

執(zhí)行go tool pprof http://localhost:8080/debug/pprof/profile后,默認需要等30s才會顯示交互

top指令排序展示

go pprof,go,golang,開發(fā)語言,后端

每一行表示一個函數(shù)的信息,列信息字段解釋:

  • flat:函數(shù)在 CPU 上運行的時間
  • flat%:函數(shù)在CPU上運行時間的百分比
  • sum%:是從第一行到當前行所有函數(shù)累加使用 CPU 的比例,如第二行sum=53.85=30.77+23.08
  • cum:這個函數(shù)以及子函數(shù)運行所占用的時間,應(yīng)該大于等于flat
  • cum%:這個函數(shù)以及子函數(shù)運行所占用的比例,應(yīng)該大于等于flat%
  • 最后一列:函數(shù)的名字

web指令生成圖示

在交互模式下輸入 web,會自動生成一個 svg 文件,并跳轉(zhuǎn)到瀏覽器打開。

改功能需要安裝graphviz后才能使用,安裝方法https://shidawuhen.github.io/2020/02/08/go-callvis/ 。

go pprof,go,golang,開發(fā)語言,后端
圖中每個方框?qū)?yīng)應(yīng)用程序運行的一個函數(shù),方框越大代表函數(shù)執(zhí)行的時間越久(函數(shù)執(zhí)行時間會包含它調(diào)用的子函數(shù)的執(zhí)行時間,但并不是正比的關(guān)系);方框之間的箭頭代表著調(diào)用關(guān)系,箭頭上的數(shù)字代表被調(diào)用函數(shù)的執(zhí)行時間。

具體細節(jié)可以參考:https://github.com/google/pprof/tree/master/doc#interpreting-the-callgraph

runtime netpoll為例:
箭頭上的230ms表示該函數(shù)總共的執(zhí)行時間,包含自身和下游所有子節(jié)點;
方框中的10ms表示自身的執(zhí)行時間;
方框中的2.70%表示自身執(zhí)行時間在該函數(shù)總共執(zhí)行時間的占比在總時間中的占比:2.70 = (10/230)*62.16
方框中的62.16%表示總時間占比,即整個程序耗時占比。

list指令分析函數(shù)

確定出哪個函數(shù)耗時之后,可以用pprof分析函數(shù)中的哪一行導致的耗時,使用子命令:list 函數(shù)名。
go pprof,go,golang,開發(fā)語言,后端

堆內(nèi)存分析示例

內(nèi)存分配既可以發(fā)生在堆上也可以在棧上。堆上分配的內(nèi)存需要垃圾回收或者手動回收(對于沒有垃圾回收的語言,例如 C++),棧上的內(nèi)存則通常在函數(shù)退出后自動釋放。

Go 語言通過逃逸分析會將盡可能多的對象分配到棧上,以使程序可以運行地更快。

這里說明一下,有兩種內(nèi)存分析策略:一種是當前的(這一次采集)內(nèi)存或?qū)ο蟮姆峙?,稱為 inuse;另一種是從程序運行到現(xiàn)在所有的內(nèi)存分配,不管是否已經(jīng)被 gc 過了,稱為 alloc。

As mentioned above, there are two main memory analysis strategies with pprof. One is around looking at the current allocations (bytes or object count), called inuse. The other is looking at all the allocated bytes or object count throughout the run-time of the program, called alloc. This means regardless if it was gc-ed, a summation of everything sampled.

加上 -sample_index 參數(shù)后,可以切換內(nèi)存分析的類型:
go tool pprof -sample_index=alloc_space http://localhost:8080/debug/pprof/heap
或者
go tool pprof -alloc_space http://localhost:8080/debug/pprof/heap

四種標簽:
go pprof,go,golang,開發(fā)語言,后端


四、pprof數(shù)據(jù)分析類型匯總

其他數(shù)據(jù)的分析和CPU的基本一致。下面列舉所有的分類:文章來源地址http://www.zghlxwxcb.cn/news/detail-625193.html

http://localhost:8080/debug/pprof/ :獲取概況信息,即本文第一張圖的信息
go tool pprof http://localhost:8080/debug/pprof/allocs : 分析內(nèi)存分配
go tool pprof http://localhost:8080/debug/pprof/block : 分析堆棧跟蹤導致阻塞的同步原語
go tool pprof http://localhost:8080/debug/pprof/cmdline : 分析命令行調(diào)用的程序,web下調(diào)用報錯
go tool pprof http://localhost:8080/debug/pprof/goroutine : 分析當前 goroutine 的堆棧信息
go tool pprof http://localhost:8080/debug/pprof/heap : 分析當前活動對象內(nèi)存分配
go tool pprof http://localhost:8080/debug/pprof/mutex : 分析堆棧跟蹤競爭狀態(tài)互斥鎖的持有者
go tool pprof http://localhost:8080/debug/pprof/profile : 分析一定持續(xù)時間內(nèi)CPU的使用情況
go tool pprof http://localhost:8080/debug/pprof/threadcreate : 分析堆棧跟蹤系統(tǒng)新線程的創(chuàng)建
go tool pprof http://localhost:8080/debug/pprof/trace : 分析追蹤當前程序的執(zhí)行狀況

參考連接

  1. 一文搞懂pprof
  2. 深度解密Go語言之 pprof
  3. go性能分析工具pprof
  4. Go語言:利用pprof工具排查內(nèi)存泄漏的示例
  5. Go語言:利用pprof工具查找goroutine(協(xié)程)泄漏的示例
  6. go 程序性能調(diào)優(yōu) pprof 的使用

到了這里,關(guān)于Go性能分析工具pprof詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • go 調(diào)試利器之pprof指標分析

    go 調(diào)試利器之pprof指標分析

    Go語言原生支持對于程序運行時重要指標或特征進行分析。pprof是其中一種重要的工具,其不僅可以分析程序運行時的錯誤(內(nèi)存泄漏、并發(fā)沖突、協(xié)程泄漏等),也可以對程序進行優(yōu)化(比如定位cpu,內(nèi)存異常邏輯)。由于Go程序運行時不對外暴漏相關(guān)指標,因此Go提供了 ru

    2024年02月09日
    瀏覽(27)
  • Go語言入門記錄:從channel的池應(yīng)用、sync的Pool、benchmark、反射reflect、json處理、http、性能分析和一些編程習慣

    channel的一對一會阻塞,添加buffer不會阻塞。 buffered Channel實現(xiàn)對象池。 sync.Pool 的介紹。 獲取時先去私有對象中獲取,如果不存在就在相同Processor中的共享池中獲取,如果還沒有,則去其他Processor中去獲取。 存放時,如果私有對象不存在,就放在私有對象中,如果存在就放在

    2024年02月10日
    瀏覽(25)
  • Go 工具鏈詳解(四): Golang環(huán)境變量設(shè)置和查看工具 go env

    go env 是 Go 工具鏈中的一個命令,用于設(shè)置和查看當前 Golang 環(huán)境的相關(guān)信息,對于理解、編譯和運行 Golang 程序非常有用。 go 提供的命令及 go 程序的編譯運行都會使用到環(huán)境變量,如果未設(shè)置對應(yīng)的環(huán)境變量,go 則會使用其默認設(shè)置。默認情況下,env 以 shell 腳本(在Windo

    2024年02月16日
    瀏覽(56)
  • Linux系統(tǒng)運維:性能監(jiān)視和分析工具sar命令詳解

    目? ? ? ? ? 錄 一、sar工具介紹 二、sar工作原理 (一)原理概述 (二)sar數(shù)據(jù)收集器 三、sar命令語法 四、sar主要功能介紹 (一)功能概述 (二)CPU統(tǒng)計數(shù)據(jù) (三)磁盤I/O統(tǒng)計數(shù)據(jù) (四)網(wǎng)絡(luò)統(tǒng)計數(shù)據(jù) 1、是使用-n DEV選項的sar輸出 2、關(guān)于網(wǎng)絡(luò)錯誤的信息可以用sar -n EDE

    2024年02月21日
    瀏覽(28)
  • Golang的trace性能分析

    Golang的trace性能分析

    ??????上一篇是 pprof 的性能分析,通過 pprof 找到我們服務(wù)中的瓶頸點來進行優(yōu)化。Golang的pprof性能分析 ??????一般我們使用 pprof 的 profile 來分析服務(wù)的性能,主要是 CPU 方面的耗時和調(diào)用鏈路等。但是光靠 profile 是不夠的,細節(jié)方面還是要使用 trace 分析并發(fā)和阻塞事件

    2024年02月09日
    瀏覽(27)
  • 輔助性能優(yōu)化——長安鏈性能分析工具原理及用法

    輔助性能優(yōu)化——長安鏈性能分析工具原理及用法

    如何提升區(qū)塊鏈系統(tǒng)性能是很多開發(fā)者都會關(guān)注的事,但是有些對區(qū)塊鏈并非十分熟悉的開發(fā)者可能會感到?jīng)]有頭緒。長安鏈提供了性能分析工具幫助開發(fā)者梳理系統(tǒng)耗時,優(yōu)化系統(tǒng)性能。下面對長安鏈性能分析工具原理及使用進行介紹。 time_counter.sh是長安鏈性能分析工具,

    2024年02月13日
    瀏覽(30)
  • 前端性能分析工具——Lighthouse

    前端性能分析工具——Lighthouse

    1、谷歌插件lighthouse的基本介紹 Lighthouse 是一個網(wǎng)站性能測評工具, 它是 Google Chrome 推出的一個開源自動化工具,能夠?qū)?PWA 和網(wǎng)頁多方面的效果指標進行評測,并給出最佳實踐的建議以幫助開發(fā)者改進網(wǎng)站的質(zhì)量。它的使用方法也非常簡單,我們只需要提供一個要測評的網(wǎng)

    2024年02月13日
    瀏覽(26)
  • Lighthouse前端性能分析工具

    Lighthouse前端性能分析工具

    我們多數(shù)性能測試,基本上針對接口的性能測試,很少涉及到前端頁面的性能測試。 但影響用戶體驗的因素除了后端接口數(shù)據(jù)的返回,還有前端頁面的渲染等等。 所以我們除了在開發(fā)的過程中注意代碼的質(zhì)量,同時還需要專業(yè)的網(wǎng)站測試工具輔助,讓我們知道自己的網(wǎng)頁還

    2024年02月16日
    瀏覽(19)
  • unity 渲染性能分析工具

    unity 渲染性能分析工具

    既然要優(yōu)化,肯定要有個目標: pc上一般要求:一秒渲染60幀 移動端:一秒渲染30幀 這應(yīng)該是最低的要求,如果游戲運行時,游戲幀率有變化,人眼能夠明顯的感覺到幀率下降。 優(yōu)化的首要規(guī)則是找到性能問題的所在。 一般出現(xiàn)問題不是在cpu就是gpu。 unity內(nèi)置了性能檢測工

    2024年02月03日
    瀏覽(37)
  • 前端性能分析工具-Lighthouse

    前端性能分析工具-Lighthouse

    對于前端開發(fā)人員來說,除了實現(xiàn)頁面功能外,那就是頁面的性能響應(yīng)問題也要關(guān)注。同樣對于測試人員在進行性能測試時,也要關(guān)注前端頁面的性能指標。測試前端性能市面上可以用到的工具也比較多,比如可以用 HttpWatch 進行頁面的抓取與分析,或者也可以使用抓包工具

    2024年02月11日
    瀏覽(48)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包