golang 效能分析 2

2021-09-27 07:45:17 字數 2974 閱讀 9522

總覽:執行緒數量,阻塞呼叫,記憶體分析 ,協程分析等

pprof cpu和記憶體分析說明

一般採集cpu樣板資料**,這裡我只寫一種,至於其他的記憶體和trace採集,可以參考:

此文章介紹了各種採集樣板資料原理,以及展示方式

import  (

"runtime/pprof"

"log"

)func main()

defer f.close()

pprof.startcpuprofile(f)

defer pprof.stopcpuprofile()

}

go run main.go,即可看到cpu.out

方法1:

獲取cpu分析png圖:go tool pprof -png cpu.out > cpu.png

方法二:

進入命令列:go tool pprof cpu.out

top命令:檢視cpu和記憶體消耗排行版

list:檢視某個函式的**,以及該函式每行**的指標資訊,如果函式名不明確,會進行模糊匹配,比如list main會列出main.main

traces:列印所有呼叫棧,以及呼叫棧的指標資訊

其他命令可以通過help檢視

網路一般都是預設引入包

)這種方式一般適用範圍很小,看下pprof預設幹了什麼?

)func init()

1:檔案中的http.handle("/debug/pprof/", http.handlerfunc(index)) 放到handle配置中(此handle包含了所有的分析函式)

2: 瀏覽器訪問http://host:port/debug/pprof/

方法1:

1:檔案中的http.handle("/debug/pprof/profile", http.handlerfunc(profile))放到handle配置中

3:設定10s收集一次cpu資訊:curl 'http//host:port/debug/pprof/profile?seconds=10' -o cpu.out

4:獲取cpu分析png圖:go tool pprof -png cpu.out > cpu.png

方法二:

1,2跟上面想同

3:進入命令列:go tool pprof cput.out

top命令:檢視cpu和記憶體消耗排行版

list:檢視某個函式的**,以及該函式每行**的指標資訊,如果函式名不明確,會進行模糊匹配,比如list main會列出main.main

traces:列印所有呼叫棧,以及呼叫棧的指標資訊

help檢視其他命令

記憶體洩露情況:

1:goroutine本身的棧所占用的空間造成記憶體洩露。

2:goroutine中的變數所占用的堆記憶體導致堆記憶體洩露,這一部分是能通過heap profile體現出來的。

記憶體profiling記錄的是堆記憶體分配的情況,以及呼叫棧資訊,並不是程序完整的記憶體情況。

棧記憶體的分配是在呼叫棧結束後會被釋放的記憶體,所以並不在記憶體profile中。

因為記憶體profiling是基於抽樣和它跟蹤的是已分配的記憶體,而不是使用中的記憶體,(比如有些記憶體已經分配,看似使用,但實際以及不使用的記憶體,比如記憶體洩露的那部分),所以不能使用記憶體profiling衡量程式總體的記憶體使用情況。

heap能幫助我們發現記憶體問題,但不一定能發現記憶體洩露問題,記憶體主要被哪些**占用了,程式存在記憶體問題

1:主要看監控系統:隨著時間的推進,記憶體的佔用率在不斷的提高,這是記憶體洩露的最明顯現象

2:能夠對比兩個profile檔案的差別,觀察

go tool pprof -base heap.out heap2.out

1:設定10s收集一次資訊:curl 'http//host:port/debug/pprof/heap?seconds=10' -o heap.out

2:獲取heap分析png圖:go tool pprof -png heap.out > heap.png

1:設定10s收集一次資訊:curl 'http//host:port/debug/pprof/trace?seconds=10' -o trace.out

2: 獲取trace分析:go tool trace -http="localhost:port" trace.out

5: 訪問:http://localhost:port

cpu消耗比較高當然,自己增加伺服器

如果cpu和記憶體消耗都不高的情況下

最大的可能是gc占用時間比較高,這個時候trace資訊很有用了,通過訪問trace中url

查詢traces資訊,可以看到主要是哪些物件占用了大量記憶體,可以從這部分**入手

根據我的經驗,json.unmarshal的時候,採用的是反射原理,缺省會簡歷大量的臨時物件

如果json資料報很多,那麼會很快產生gc,而golang的gc預設是暫停整個程式執行的,所以

這種情況,要麼修改gc條件比如:export gogc=200,記憶體增大到3倍,才開始gc

要麼減少json反序列化

golang學習筆記 pprof效能分析2

golang自帶非常強大的效能分析工具,它可以在go程式的執行中以精緻的細節顯示所有執行時事件,今天我們就了解一下go tool trace的強大之處。go tool trace 顯示了非常之多的資訊,為了簡單起見,我們先概括的看一下他顯示了些什麼,下面是我生成的所有trace目錄,具體的如圖上所示...

golang 效能分析 pprof

如果是使用了http包的路由,則只需要import net http pprof 即可 mutex mutex導致爭用的goroutine堆疊 總的分析思路就是通過top和traces找出關鍵函式,再通過list檢視函式 找到關鍵 行並確認優化方案 top檢視占用最高的num項 traces列印匹配...

golang除錯效能分析

golang程式的cpu及記憶體使用情況效能分析 1.runtime.memstats檢視記憶體占用情況 讀取當前記憶體資訊的方法 func printmemstats func test log.println loop end.func main 主線程 睡眠等待 alloc golang語言框...