最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go性能分析工具pprof的用途及使用詳解

 更新時間:2023年01月06日 14:13:06   作者:我是等閑之輩  
剛開始接觸go就遇到了一個內存問題,在進行內存分析的時候發(fā)現(xiàn)了一下比較好的工具,在此留下記錄,下面這篇文章主要給大家介紹了關于go性能分析工具pprof的用途及使用的相關資料,需要的朋友可以參考下

pprof的用途

  • CPU Profiling:CPU 分析,按照一定的頻率采集所監(jiān)聽的應用程序 CPU(含寄存器)的使用情況,可確定應用程序在主動消耗CPU 周期時花費時間的位置
  • Memory Profiling:內存分析,在應用程序進行堆分配時記錄堆棧跟蹤,用于監(jiān)視當前和歷史內存使用情況,以及檢查內存泄漏
  • Block Profiling:阻塞分析,記錄 goroutine 阻塞等待同步(包括定時器通道)的位置。阻塞分析對分析程序并發(fā)瓶頸非常有幫助。
  • Mutex Profiling:互斥鎖分析,報告互斥鎖的競爭情況

所以當內存或者cpu飆升的時候,我們可以使用go自帶的性能分析利器pprof來查找問題所在。

Go 語言自帶的 pprof 庫就可以分析程序的運行情況,并且提供可視化的功能。它包含兩個相關的庫:

runtime/pprof

對于只跑一次的程序,例如每天只跑一次的離線預處理程序,調用 pprof 包提供的函數(shù),手動開啟性能數(shù)據(jù)采集。

net/http/pprof

對于在線服務,對于一個 HTTP Server,訪問 pprof 提供的 HTTP 接口,獲得性能數(shù)據(jù)。當然,實際上這里底層也是調用的 runtime/pprof 提供的函數(shù),封裝成接口對外提供網(wǎng)絡訪問。

利用runtime/pprof包實現(xiàn)cpu分析的步驟

package main

import (
    "flag"
    "fmt"
    "log"
    "os"
    "runtime/pprof"
)

//執(zhí)行 go run main -help 查看幫助信息
//執(zhí)行 go run main -cpuprofile cpu.prof 生成cpu性能分析文件
func main() {
    var cpuprofile = flag.String("cpuprofile", "", "請輸入 -cpuprofile 指定cpu性能分析文件名稱")
    //在所有flag都注冊之后,調用:flag.Parse()
    flag.Parse()
    f, err := os.Create(*cpuprofile)
    if err != nil {
        log.Fatal("could not create CPU profile: ", err)
    }
    // StartCPUProfile為當前進程開啟CPU profile。
    if err := pprof.StartCPUProfile(f); err != nil {
        log.Fatal("could not start CPU profile: ", err)
    }
    // StopCPUProfile會停止當前的CPU profile(如果有)
    defer pprof.StopCPUProfile()

    sum := 0
    for i := 0; i < 100; i++ {
        sum += i
    }
    fmt.Printf("sum=%d\n", sum)
}

這里對flag.String參數(shù)的解釋如下:

2、執(zhí)行命令生成本地文件cpu.prof:

go run main.go -cpuprofile cpu.prof

3、對文件進行分析:

go tool pprof cpu.prof

對應的參數(shù)說明:

利用runtime/pprof包實現(xiàn)內存分析的步驟:

package main

import (
    "flag"
    "fmt"
    "log"
    "os"
    "runtime"
    "runtime/pprof"
)

//執(zhí)行 go run main -help 查看幫助信息
//執(zhí)行 go run main -menprofile men.prof 生成內存性能分析文件
func main() {
    var menprofile = flag.String("menprofile", "", "請輸入 -menprofile 指定內存性能分析文件名稱")
    //在所有flag都注冊之后,調用:flag.Parse()
    flag.Parse()
    f, err := os.Create(*menprofile)
    if err != nil {
        log.Fatal("could not create memory profile: ", err)
    }
    defer f.Close() // error handling omitted for example
    runtime.GC()    // get up-to-date statistics
    if err := pprof.WriteHeapProfile(f); err != nil {
        log.Fatal("could not write memory profile: ", err)
    }
    sum := 0
    for i := 0; i < 100; i++ {
        sum += i
    }
    fmt.Printf("sum=%d\n", sum)
}

然后就是生成本地性能分析文件和查看文件:

總結:

其實,我們可以把上面兩個代碼合并,輸入 go run main.go -cpuprofile cpu.prof -menprofile men.prof同時生成cpu和內存的性能分析文件。

利用net/http/pprof包進行性能分析

這個很簡單,直接啟動一個端口(和正常提供業(yè)務服務的端口不同)監(jiān)聽 pprof 請求:

package main

import (
    "fmt"
    "gin_pro/pkg/setting"
    "gin_pro/routers"
    "net/http"
    _ "net/http/pprof"
)

func main() {
    //用于pprof檢測內存使用情況
    go func() {
        http.ListenAndServe("0.0.0.0:8080", nil)
    }()

    router := routers.InitRouter()

    s := &http.Server{
        Addr:           fmt.Sprintf(":%d", setting.HTTPPort),
        Handler:        router,
        ReadTimeout:    setting.ReadTimeout,
        WriteTimeout:   setting.WriteTimeout,
        MaxHeaderBytes: 1 << 20, // 1* 2^20 = 1*1024*1024 = 1M
    }
    s.ListenAndServe()
}

然后在終端執(zhí)行以下命令就能查看對應的數(shù)據(jù)了:

#所有過去內存分配的采樣
go tool pprof http://127.0.0.1:8080/debug/pprof/allocs

#對活動對象的內存分配進行采樣(活動)
go tool pprof http://127.0.0.1:8080/debug/pprof/heap

# 下載 cpu profile,默認從當前開始收集 30s 的 cpu 使用情況,需要等待 30s
go tool pprof http://127.0.0.1:8080/debug/pprof/profile
# wait 120s
go tool pprof http://127.0.0.1:8080/debug/pprof/profile?seconds=120    

#導致同步原語阻塞的堆棧跟蹤
go tool pprof http://127.0.0.1:8080/debug/pprof/block

#所有當前goroutine的堆棧跟蹤
go tool pprof http://127.0.0.1:8080/debug/pprof/goroutine

#爭用互斥鎖持有者的堆棧跟蹤
go tool pprof http://127.0.0.1:8080/debug/pprof/mutex

#當前程序的執(zhí)行軌跡。
go tool pprof http://127.0.0.1:8080/debug/pprof/trace

在可以直接在瀏覽器查看:

http://127.0.0.1:8080/debug/pprof/

總結 

到此這篇關于go性能分析工具pprof的用途及使用的文章就介紹到這了,更多相關go性能分析工具pprof內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go使用Gin+mysql實現(xiàn)增刪改查的詳細實例

    Go使用Gin+mysql實現(xiàn)增刪改查的詳細實例

    golang本身沒有提供連接mysql的驅動,但是定義了標準接口供第三方開發(fā)驅動,下面這篇文章主要給大家介紹了關于Go使用Gin+mysql實現(xiàn)增刪改查的相關資料,需要的朋友可以參考下
    2022-12-12
  • 一文帶你了解Golang中的WaitGroups

    一文帶你了解Golang中的WaitGroups

    WaitGroups是同步你的goroutines的一種有效方式。這篇文章主要來和大家聊聊Golang中WaitGroups的使用,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03
  • 利用go語言實現(xiàn)Git?重命名遠程分支??

    利用go語言實現(xiàn)Git?重命名遠程分支??

    這篇文章主要介紹了go語言實現(xiàn)Git?重命名遠程分支,文章基于go語言的基礎展開Git?重命名遠程分支的實現(xiàn)過程,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-06-06
  • 詳解Go中的高效切片拼接和Go1.22提供的新方法

    詳解Go中的高效切片拼接和Go1.22提供的新方法

    在?Go?語言中,切片拼接是一項常見的操作,但如果處理不當,可能會導致性能問題或意外的副作用,本文將詳細介紹幾種高效的切片拼接方法,希望對大家有所幫助
    2024-01-01
  • GO日志打印如何添加goroutineid

    GO日志打印如何添加goroutineid

    今天想給日志添加一個前綴,以區(qū)分不同goroutine的日志,方便做并發(fā)問題的排查,做日志跟蹤,下面給大家分享GO日志打印如何添加goroutineid,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • 關于Golang標準庫flag的全面講解

    關于Golang標準庫flag的全面講解

    這篇文章主要介紹了關于Golang標準庫flag的全面講解,這個庫的代碼量只有1000行左右,卻提供了非常完善的命令行參數(shù)解析功能,更多相關內容需要的朋友可以參考一下
    2022-09-09
  • Go語言實現(xiàn)聊天小工具的示例代碼

    Go語言實現(xiàn)聊天小工具的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)聊天小工具,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Gorm存在時更新,不存在時創(chuàng)建的問題

    Gorm存在時更新,不存在時創(chuàng)建的問題

    這篇文章主要介紹了Gorm存在時更新,不存在時創(chuàng)建的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 關于go-zero服務自動收集問題分析

    關于go-zero服務自動收集問題分析

    這篇文章主要介紹了關于go-zero服務自動收集問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Go語言利用接口實現(xiàn)鏈表插入功能詳解

    Go語言利用接口實現(xiàn)鏈表插入功能詳解

    這篇文章主要為大家介紹了Go語言中的接口,以及如何利用接口實現(xiàn)鏈表插入功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-04-04

最新評論

吉隆县| 淳化县| 巨野县| 界首市| 壤塘县| 绥棱县| 靖宇县| 个旧市| 灯塔市| 定结县| 正蓝旗| 浑源县| 河北省| 灵璧县| 鄂伦春自治旗| 和平区| 丰台区| 满城县| 内乡县| 南部县| 贡嘎县| 沙河市| 永胜县| 嘉义市| 璧山县| 阳山县| 奉节县| 上栗县| 乌恰县| 寿阳县| 房山区| 石渠县| 化德县| 东安县| 夏津县| 松阳县| 延安市| 武穴市| 新乐市| 东乡县| 高邑县|