欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go?pprof?的使用操作代碼

 更新時(shí)間:2022年09月26日 09:56:47   作者:Grassto  
pprof 是 go 中進(jìn)行性能分析的工具,可以提供可視化數(shù)據(jù)查看,這篇文章主要介紹了go?pprof?的使用操作,需要的朋友可以參考下

背景

最近合作開發(fā)一個(gè)項(xiàng)目,項(xiàng)目部署發(fā)現(xiàn)了才跑了沒多久,就直接宕機(jī)了,查看服務(wù)器信息發(fā)現(xiàn)在某個(gè)時(shí)間端內(nèi)存猛的暴漲了非常多,由于是合作開發(fā)的項(xiàng)目,我仔細(xì)的檢查了自己的拿塊代碼,都沒啥問題,另一個(gè)開發(fā)也說自己的代碼沒啥問題。

這沒理沒據(jù)的爭(zhēng)論也不是個(gè)事,突然想起還有 pprof 這么個(gè)東西,正好能用上了。一頓操作下來,總算是找到了問題的根源。

pprof 是什么

pprofgo 中進(jìn)行性能分析的工具,可以提供可視化數(shù)據(jù)查看。

pprof 的采樣方式

  • runtime/pprof
  • net/http/pprof
  • test

這里舉例采樣內(nèi)存信息。

package main
import (
	"os"
	"runtime/pprof"
)

func main() {
	var buf = make([][1024 * 1024]byte, 0)
	for i := 0; i < 100; i++ {
		buf = append(buf, [1024 * 1024]byte{})
	}
	f, err := os.OpenFile("heapProfile", os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm)
	if err != nil {
		return 
	}
	err = pprof.WriteHeapProfile(f)
	if err != nil {
		return 
	}
	println("結(jié)束")
}

程序跑完之后會(huì)在本地生成 heapProfile 文件,命令行執(zhí)行 go tool pprof heapProfile 可進(jìn)入終端交互,可以輸入 top 等命令查看:

這里可以輸入 web 查看可視化界面,如果遇到 Could not execute dot; may need to install graphviz. 錯(cuò)誤,需要自行安裝,網(wǎng)上教程很多,本篇不提了。

順帶提一下 runtime.MemStats 結(jié)構(gòu)體字段解釋

Alloc uint64 //golang語言框架堆空間分配的字節(jié)數(shù)
TotalAlloc uint64 //從服務(wù)開始運(yùn)行至今分配器為分配的堆空間總 和,只有增加,釋放的時(shí)候不減少
Sys uint64 //服務(wù)現(xiàn)在系統(tǒng)使用的內(nèi)存
Lookups uint64 //被runtime監(jiān)視的指針數(shù)
Mallocs uint64 //服務(wù)分配內(nèi)存對(duì)象的次數(shù)
Frees uint64 //服務(wù)回收內(nèi)存對(duì)象的次數(shù)
HeapAlloc uint64 //服務(wù)分配的堆內(nèi)存字節(jié)數(shù)
HeapSys uint64 //系統(tǒng)分配的作為運(yùn)行棧的內(nèi)存
HeapIdle uint64 //申請(qǐng)但是未分配的堆內(nèi)存或者回收了的堆內(nèi)存(空閑)字節(jié)數(shù)
HeapInuse uint64 //正在使用的堆內(nèi)存字節(jié)數(shù)
HeapReleased uint64 //返回給OS的堆內(nèi)存,類似C/C++中的free。
HeapObjects uint64 //堆內(nèi)存塊申請(qǐng)的量
StackInuse uint64 //正在使用的棧字節(jié)數(shù)
StackSys uint64 //系統(tǒng)分配的作為運(yùn)行棧的內(nèi)存
MSpanInuse uint64 //用于測(cè)試用的結(jié)構(gòu)體使用的字節(jié)數(shù)
MSpanSys uint64 //系統(tǒng)為測(cè)試用的結(jié)構(gòu)體分配的字節(jié)數(shù)
MCacheInuse uint64 //mcache結(jié)構(gòu)體申請(qǐng)的字節(jié)數(shù)(不會(huì)被視為垃圾回收)
MCacheSys uint64 //操作系統(tǒng)申請(qǐng)的堆空間用于mcache的字節(jié)數(shù)
BuckHashSys uint64 //用于剖析桶散列表的堆空間
GCSys uint64 //垃圾回收標(biāo)記元信息使用的內(nèi)存
OtherSys uint64 //golang系統(tǒng)架構(gòu)占用的額外空間
NextGC uint64 //垃圾回收器檢視的內(nèi)存大小
LastGC uint64 // 垃圾回收器最后一次執(zhí)行時(shí)間。
PauseTotalNs uint64 // 垃圾回收或者其他信息收集導(dǎo)致服務(wù)暫停的次數(shù)。
PauseNs [256]uint64 //一個(gè)循環(huán)隊(duì)列,記錄最近垃圾回收系統(tǒng)中斷的時(shí)間
PauseEnd [256]uint64 //一個(gè)循環(huán)隊(duì)列,記錄最近垃圾回收系統(tǒng)中斷的時(shí)間開始點(diǎn)。
NumForcedGC uint32 //服務(wù)調(diào)用runtime.GC()強(qiáng)制使用垃圾回收的次數(shù)。
GCCPUFraction float64 //垃圾回收占用服務(wù)CPU工作的時(shí)間總和。如果有100個(gè)goroutine,垃圾回收的時(shí)間為1S,那么就占用了100S。
BySize //內(nèi)存分配器使用情況

net/http/pprof

需要引入 net/http/pprof

package main
import (
	"net/http"
	_ "net/http/pprof"
)

func main() {
	_ = http.ListenAndServe("0.0.0.0:6060", nil)
}

然后訪問服務(wù)地址 http://127.0.0.1:6060/debug/pprof 即可看到如下圖所示的調(diào)試界面:

  • allocs:查看過去所有內(nèi)存分配的樣本。
  • block:查看導(dǎo)致阻塞同步的堆棧跟蹤。
  • cmdline: 當(dāng)前程序的命令行的完整調(diào)用路徑。
  • goroutine:查看當(dāng)前所有運(yùn)行的 goroutines 堆棧跟蹤。
  • heap:查看活動(dòng)對(duì)象的內(nèi)存分配情況。
  • mutex:查看導(dǎo)致互斥鎖的競(jìng)爭(zhēng)持有者的堆棧跟蹤。
  • profile: 默認(rèn)進(jìn)行 30s 的 CPU Profiling,得到一個(gè)分析用的 profile 文件。
  • threadcreate:查看創(chuàng)建新 OS 線程的堆棧跟蹤。
  • trace:略,trace可以單獨(dú)寫一篇文章來介紹。

這里需要注意,如果需要對(duì) blockmutex 的信息進(jìn)行追蹤,需要在代碼中顯式加上以下代碼:

	runtime.SetBlockProfileRate(1) // 開啟對(duì)阻塞操作的跟蹤,block  
	runtime.SetMutexProfileFraction(1) // 開啟對(duì)鎖調(diào)用的跟蹤,mutex

gin 框架使用 pprof

gingo 社區(qū)中使用較為廣泛的一個(gè) http 服務(wù)框架,其使用 pprof 進(jìn)行性能分析,也有現(xiàn)成的輪子可以使用,引入 github.com/gin-contrib/pprof 即可,其實(shí)就是對(duì)于 net/http/pprof 的一個(gè)包裝。

package main
import (
	"github.com/gin-contrib/pprof"
	"github.com/gin-gonic/gin"
)

func main() {
	engine := gin.Default()
	pprof.Register(engine)
}

test

 	-bench=.
         進(jìn)行性能測(cè)試,“.”是正則匹配,匹配了所有的測(cè)試函數(shù)

    -benchmem
        打印出申請(qǐng)內(nèi)存的次數(shù)。一般用于簡(jiǎn)單的性能測(cè)試,不會(huì)導(dǎo)出數(shù)據(jù)文件。

    -blockprofile block.out
        將協(xié)程的阻塞數(shù)據(jù)寫入特定的文件(block.out)。如果-c,則寫成二進(jìn)制文件。

    -cpuprofile cpu.out
        將協(xié)程的CPU使用數(shù)據(jù)寫入特定的文件(cpu.out)。如果-c,則寫成二進(jìn)制文件。

    -memprofile mem.out
        將協(xié)程的內(nèi)存申請(qǐng)數(shù)據(jù)寫入特定的文件(mem.out)。如果-c,則寫成二進(jìn)制文件。

    -mutexprofile mutex.out
        將協(xié)程的互斥數(shù)據(jù)寫入特定的文件(mutex.out)。如果-c,則寫成二進(jìn)制文件。

    -trace trace.out
        將執(zhí)行調(diào)用鏈寫入特定文件(trace.out)。

test 導(dǎo)出的數(shù)據(jù)也需要通過 go tool pprof 來分析。

火焰圖

安裝

go get -u github.com/google/pprof

啟動(dòng)

pprof -http=:8080 heapProfile

訪問 http://localhost:8080 可以得到下圖:

每個(gè)塊都是可點(diǎn)擊的,可以進(jìn)行深度分析。

總結(jié)

pprofgo 中做性能分析的很強(qiáng)大的一個(gè)工具,支持內(nèi)存,cpu,鎖,goroutine 等數(shù)據(jù)采集,本篇主要是做個(gè)簡(jiǎn)單介紹,真正進(jìn)行分析的時(shí)候,需要耐心了解各種圖,數(shù)據(jù)展示的含義,一般來說還是比較好理解的。

pprof 性能分析是個(gè)很大的知識(shí)點(diǎn),本篇僅做了簡(jiǎn)單的介紹,最好自己深入理解學(xué)習(xí)一下。

參考

golang pprof 實(shí)戰(zhàn)-CPU,heap,alloc,goroutine,mutex,block

Go 語言編程之旅-pprof篇

實(shí)用go pprof使用指南

到此這篇關(guān)于go pprof 的使用的文章就介紹到這了,更多相關(guān)go pprof 使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中Gin框架的使用入門教程

    Golang中Gin框架的使用入門教程

    這篇文章主要為大家詳細(xì)介紹了Golang中Gin框架的使用教程,文中通過簡(jiǎn)單的示例為大家講解了Gin框架的安裝與使用,感興趣的小伙伴開業(yè)跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • 基于Golang設(shè)計(jì)一套可控的定時(shí)任務(wù)系統(tǒng)

    基于Golang設(shè)計(jì)一套可控的定時(shí)任務(wù)系統(tǒng)

    這篇文章主要為大家學(xué)習(xí)介紹了如何基于Golang設(shè)計(jì)一套可控的定時(shí)任務(wù)系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • go語言睡眠排序算法實(shí)例分析

    go語言睡眠排序算法實(shí)例分析

    這篇文章主要介紹了go語言睡眠排序算法,實(shí)例分析了睡眠排序算法的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-03-03
  • 一文詳解Golang中new和make的區(qū)別

    一文詳解Golang中new和make的區(qū)別

    在Go語言中,new和make是兩個(gè)用于創(chuàng)建對(duì)象的內(nèi)建函數(shù)。本文將詳細(xì)介紹new和make的區(qū)別,并通過多個(gè)方面的分析和代碼示例,幫助大家理解它們的使用場(chǎng)景
    2023-05-05
  • 深入了解Golang中Slice切片的使用

    深入了解Golang中Slice切片的使用

    本文主要為大家詳細(xì)介紹了Golang中Slice切片的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-02-02
  • Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入

    Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入

    這篇文章主要給大家介紹了關(guān)于Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • RabbitMq如何做到消息的可靠性投遞

    RabbitMq如何做到消息的可靠性投遞

    現(xiàn)在的一些互聯(lián)網(wǎng)項(xiàng)目或者是高并發(fā)的項(xiàng)目中很少有沒有引入消息隊(duì)列的。 引入消息隊(duì)列可以給這個(gè)項(xiàng)目帶來很多的好處,這篇文章主要為大家介紹了RabbitMq如何做到消息的可靠性投遞,有需要的朋友可以借鑒參考下
    2022-12-12
  • 詳解Golang如何比較兩個(gè)slice是否相等

    詳解Golang如何比較兩個(gè)slice是否相等

    開發(fā)中常會(huì)遇到需要比較兩個(gè)slice包含的元素是否完全相等的情況,我們通常會(huì)通過兩種方法去比較切片是否相等。這里通過幾個(gè)示例來看一下這兩種方法,感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助
    2022-11-11
  • 深入理解Golang channel的應(yīng)用

    深入理解Golang channel的應(yīng)用

    channel是用于 goroutine 之間的同步、通信的數(shù)據(jù)結(jié)構(gòu)。它為程序員提供了更高一層次的抽象,封裝了更多的功能,這樣并發(fā)編程變得更加容易和安全。本文通過示例為大家詳細(xì)介紹了channel的應(yīng)用,需要的可以參考一下
    2022-10-10
  • Golang分布式注冊(cè)中心實(shí)現(xiàn)流程講解

    Golang分布式注冊(cè)中心實(shí)現(xiàn)流程講解

    這篇文章主要介紹了Golang分布式注冊(cè)中心實(shí)現(xiàn)流程,注冊(cè)中心可以用于服務(wù)發(fā)現(xiàn),服務(wù)注冊(cè),配置管理等方面,在分布式系統(tǒng)中,服務(wù)的發(fā)現(xiàn)和注冊(cè)是非常重要的組成部分,需要的朋友可以參考下
    2023-05-05

最新評(píng)論