批里批里 (゜-゜)つ🍺 干杯~|

七つ一旋桜

园龄:4年2个月粉丝:6关注:3

Day3 pprof性能調優筆記 | 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

什麼是pprof? pprof是一個go自帶的性能分析工具,可以對運行的服務進行數據採樣,然後開發者可以就採樣的數據對程序的cpu佔用、內存佔用等資源消耗情況進行直觀的分析

如何啓用pprof?

在入口文件main.go的import列表中加入net/http/pprof即可

import (
    _ "net/http/pprof"
)

然後添加一個函數

func PprofDebug() {
    runtime.GOMAXPROCS(1) // 限制 CPU 使用数,避免过载 
    runtime.SetMutexProfileFraction(1) // 开启对锁调用的跟踪 
    runtime.SetBlockProfileRate(1) // 开启对阻塞操作的跟踪 
    go func() { 
    // 启动一个 http server,注意 pprof 相关的 handler 已经自动注册过了 
    if err := http.ListenAndServe(":6060", nil); err != nil { 
        log.Fatal(err) 
    } 
    os.Exit(0) }()
}

這個函數啓動了一個http服務器,然後pprof會給這個服務器進行服務注入 然後在main函數的開頭調用這個函數就行了

之後讓瀏覽器訪問http://localhost:6060/debug/pprof/ 可以看到dashboard頁面

image.png 其中cmdline(獲取程序啓動命令以及參數) trace(獲取程序運行的跟蹤信息) threadcreate(獲取系統的線程創建情況的採樣信息)都不太實用

使用go tool pprof可以對pprof獲取的採樣信息得到直觀的展現

其命令格式爲

go tool pprof http://<host>:<port>/debug/pprof/<profile> -seconds [采样间隔时间数字]

此外還可以使用pprof對數據採樣生成網頁

go tool pprof -http=:8081 http://<host>:<port>/debug/pprof/<profile>

之後就可以訪問http://localhost:8081/ui/flamegraph查看火焰圖了

排查cpu的佔用

使用命令進入一個交互式終端

go tool pprof http://<host>:<port>/debug/pprof/profile

進入交互式終端之後就可以輸入top命令獲取cpu資源佔用情況

image.png

可以看到佔用最高的是哪個函數

image.png 輸入命令list <Function Name>就可以查看相關代碼的運行耗時詳情

通過耗時詳情就可以定位到性能損耗最嚴重的地方了 image.png

排查內存佔用

這裏需要先安裝一個命令行工具graphviz,安裝方式可以到其官網查看

有了graphviz之後,就可以在pprof的交互界面中使用web svg等命令生成數據可視化圖片,進行更直觀的排查

輸入命令

go tool pprof http://<host>:<port>/debug/pprof/heap   

就可以進入交互式界面排查內存佔用問題 和排查cpu佔用一樣,這裏也是使用toplist命令排查代碼的內存佔用情況

佔用詳情會顯示出佔用的內存是多少 image.png

此時可以輸入web命令獲取一張圖片來查看資源佔用的詳情

內存回收檢查

通過設置GODEBUG=gctrace=1可以在程序運行時輸出gc的相關日誌 然後從日誌中截取含有gc的內容就可以知道gc執行的頻繁程度

GODEBUG=gctrace=1 ./<filename> | grep gc

如果gc調用過於頻繁,就可以通過pprof查看內存的申請情況

go tool pprof http://<host>:<port>/debug/pprof/allocs

之後就可以使用toplistweb命令查看佔用詳情了

排查協程泄漏

如果協程不斷被創建但是卻不被回收,這時就會發生內存泄漏 使用pprof還可以查看協程的佔用情況 在dashboard頁面就可以看到協程數,如果協程數過高就可以考慮用pprof排查是否發生了協程導致的內存泄漏

image.png

使用pprof進入交互界面

go tool pprof http://<host>:<port>/debug/pprof/goroutine

然後就可以用top list web進行排查了

本文作者:七つ一旋桜

本文链接:https://www.cnblogs.com/poifa/p/17716925.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   七つ一旋桜  阅读(14)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起