當前位置:
首頁 > 知識 > Golang使用pprof和qcachegrind進行性能監控

Golang使用pprof和qcachegrind進行性能監控

Golang為我們提供了非常方便的性能測試工具pprof,使用pprof可以非常方便地對Go程序的運行效率進行監測。本文講述如何使用pprof對Go程序進行性能測試,並使用qcachegrind查看性能測試的輸出文件。


載入pprof模塊

想要對一個Go程序進行pprof監測,第一步是在main函數所在的模塊中添加 net/http/pprof 模塊。import後面的「_」是一定要加上的。

import _ "net/http/pprof"

運行HTTP伺服器

如果你的程序不是一個Web伺服器,那麼你還需要再程序中啟動一個Http伺服器,如下所示:

go func {
http.ListenAndServe("localhost:13001", nil)
}

重新編譯並運行程序。然後我們可以通過網頁瀏覽器查看當前程序的運行狀態:http://localhost:13001/debug/pprof。如果運行正常,可以看到類似如下的輸出:

/debug/pprof/

profiles:
0block
9goroutine
7heap
0mutex
12threadcreate

full goroutine stack dump

在這個網頁里我們可以查看程序當前的goroutine運行狀態、內存使用情況等信息。


使用go tool pprof命令

打開命令行,輸入命令: go tool pprof http://localhost:13001/debug/pprof/profile ,此時命令行會卡出,並列印類似如下信息:

C:UsersAdministrator>go tool pprof http://localhost:13001/debug/pprof/profile
Fetching profile from http://localhost:13001/debug/pprof/profile
Please wait... (30s)
Saved profile in pprofpprof.localhost:13001.samples.cpu.007.pb.gz
Entering interactive mode (type "help" for commands)

在經過30秒的等待之後,性能測試完成,會在本地保存壓測結果。

可以使用top命令查看開銷最大的一些函數,或者使用web命令直接在網頁中查看,其他的命令還包括:svg,pdf,png等,你可以選擇自己所習慣的工具查看性能檢測結果。

(pprof) top20
970ms of 1130ms total (85.84%)
Showing top 20 nodes out of 86 (cum >= 20ms)
flat flat% sum% cum cum%
280ms 24.78% 24.78% 300ms 26.55% runtime.stdcall1
100ms 8.85% 33.63% 110ms 9.73% runtime.acquirep
100ms 8.85% 42.48% 100ms 8.85% runtime.siftdownTimer
90ms 7.96% 50.44% 90ms 7.96% runtime.osyield
80ms 7.08% 57.52% 260ms 23.01% runtime.timerproc
60ms 5.31% 62.83% 60ms 5.31% runtime.memeqbody
50ms 4.42% 67.26% 50ms 4.42% runtime.casgstatus
30ms 2.65% 69.91% 30ms 2.65% runtime.cgocall
30ms 2.65% 72.57% 430ms 38.05% runtime.exitsyscallfast_pidle
20ms 1.77% 74.34% 20ms 1.77% runtime.asmstdcall
20ms 1.77% 76.11% 20ms 1.77% runtime.goready
20ms 1.77% 77.88% 20ms 1.77% runtime.pidleget
20ms 1.77% 79.65% 60ms 5.31% runtime.startm
10ms 0.88% 80.53% 20ms 1.77% github.com/xiaonanln/goworld/netutil.(*PacketConnection).Flush
10ms 0.88% 81.42% 10ms 0.88% github.com/xiaonanln/goworld/netutil.allocPacket
10ms 0.88% 82.30% 80ms 7.08% main.(*DispatcherService).getEntityDispatcherInfoForRead
10ms 0.88% 83.19% 10ms 0.88% net.(*fdMutex).rwunlock
10ms 0.88% 84.07% 10ms 0.88% runtime.(*guintptr).cas
10ms 0.88% 84.96% 10ms 0.88% runtime.acquirep1
10ms 0.88% 85.84% 20ms 1.77% runtime.asmcgocall

值得一提的是,如果我們的程序中一台Linux伺服器上運行,我們也可以在自己的Windows電腦上運行go tool pprof命令,只需要將網址里的localhost替換為Linux伺服器的地址即可。


使用qcachegrind查看性能監測結果

相比top、web、svg等命令,查看性能檢測結果最方便的工具還是qcachegrind。首先需要前往 https://sourceforge.net/projects/qcachegrindwin/files/下載Windows版的qcachegrind。

在go tool pprof的命令行里,使用callgrind命令生成qcachegrind工具所支持的文件類型:

(pprof) callgrind
Generating report in profile010.callgraph.out

然後使用下載的qcachegrind.exe打開生成的文件即可,此處為:profile010.callgraph.out。使用qcachegrind可以在各個函數之間自由跳轉,查看函數內部的CPU佔用情況,相對其他格式要更加靈活方便。例如以下是我們對GoWorld伺服器進行一次性能測試的結果。

Golang使用pprof和qcachegrind進行性能監控

不成熟的優化是萬惡之源!因此我們在對自己的Go程序進行優化之前,不妨先使用go tool pprof對程序性能進行檢測,然後對關鍵的性能瓶頸部分進行優化,這樣才會起到事半功倍的效果。Golang提供的pprof是進行性能測試的利器,經過我們的實際使用發現,即使在開啟性能測試的30s里,pprof對程序帶來的性能損耗並不大。


對Go語言服務端開發感興趣的朋友歡迎加入QQ討論群:662182346

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

原生js之千位分隔符
SpringBoot上傳任意文件功能的實現
基於vue的顏色選擇器vue-color-picker
php的db類庫Eloquent單獨使用系列(4)-事件監聽

TAG:達人科技 |

您可能感興趣

通過Google Expeditions和Virtual Tours進行
bcftools進行SNP calling
通過Google Expeditions和Virtual Tours進行沉浸式教育
通過Google Expeditions和Virtual Tours進行沉浸式教育
Getting in shape this Summer夏日塑身進行時
為Dr.Martens加上綁帶?Engineered Garments進行大膽的嘗試
Snapchat推出3D Friendmojis進行社交互動
Cheerble Studio推出智能骨頭Wickerbone,可以與寵物進行互動
沃爾沃Polestar公司推Polestar Engineered 將電氣化進行到底
Telegram發布Telegram Passport,對ICO等數據進行加密
全球「變醜」進行時:Blenciaga vs Prada?
Google試圖僱用Vitalik Buterin進行秘密加密項目
SpringBoot中如何進行Bean配置
Randomevent 監控進行中……
如何使用Reviewboard進行代碼Review?
使用TensorFlow,Kafka和MemSQL進行實時機器學習
Randomevent ? 監控進行中……
Pablo Picasso 名畫《Le Marin》即將進行拍賣
如何進行 code review?
英格蘭教會或使用Apple Pay/Google Pay進行募捐