轉(zhuǎn)自:http://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.html
go中有pprof包來做代碼的性能監(jiān)控,在兩個地方有包:
net/http/pprof
runtime/pprof
其實(shí)net/http/pprof中只是使用runtime/pprof包來進(jìn)行封裝了一下,并在http端口上暴露出來
如果你的go程序是用http包啟動的web服務(wù)器,你想查看自己的web服務(wù)器的狀態(tài)。這個時候就可以選擇net/http/pprof。你只需要引入包_"net/http/pprof",然后就可以在瀏覽器中使用http://localhost:port/debug/pprof/直接看到當(dāng)前web服務(wù)的狀態(tài),包括CPU占用情況和內(nèi)存使用情況等。具體使用情況你可以看godoc的說明。
如果你的go程序不是web服務(wù)器,而是一個服務(wù)進(jìn)程,那么你也可以選擇使用net/http/pprof包,同樣引入包net/http/pprof,然后在開啟另外一個goroutine來開啟端口監(jiān)聽。
比如:
go func() { log.Println(http.ListenAndServe("localhost:6060", nil))
}()
如果你的go程序只是一個應(yīng)用程序,比如計算fabonacci數(shù)列,那么你就不能使用net/http/pprof包了,你就需要使用到runtime/pprof。具體做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。比如下面的例子:
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")func main() { flag.Parse() if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() }
…
運(yùn)行程序的時候加一個--cpuprofile參數(shù),比如fabonacci --cpuprofile=fabonacci.prof
這樣程序運(yùn)行的時候的cpu信息就會記錄到XXX.prof中了。
下一步就可以使用這個prof信息做出性能分析圖了(需要安裝graphviz)。
使用go tool pprof (應(yīng)用程序) (應(yīng)用程序的prof文件)
進(jìn)入到pprof,使用web命令就會在/tmp下生成svg文件,svg文件是可以在瀏覽器下看的。像這個樣子:
如果你的程序非常簡單,比如只有println一個語句,你用pprof.StartCPUProfile是打印不出任何東西的。
下面拿go-tour舉個例子,這是個web程序,我在代碼中加入了
_ "net/http/pprof"
在瀏覽器中我就可以直接看prof信息了
下面我們想要生成CPU狀態(tài)分析圖,調(diào)用go tool pprof http://localhost:3999/debug/pprof/profile
就會進(jìn)入30秒的profile收集時間,在這段事件內(nèi)猛刷新點(diǎn)擊go-tour瀏覽器上的頁面,盡量讓cpu占用性能產(chǎn)生數(shù)據(jù)。
(pprof) top10
Total: 3 samples
1 33.3% 33.3% 1 33.3% MHeap_AllocLocked
1 33.3% 66.7% 1 33.3% os/exec.(*Cmd).closeDescriptors
1 33.3% 100.0% 1 33.3% runtime.sigprocmask
0 0.0% 100.0% 1 33.3% MCentral_Grow
0 0.0% 100.0% 2 66.7% main.Compile
0 0.0% 100.0% 2 66.7% main.compile
0 0.0% 100.0% 2 66.7% main.run
0 0.0% 100.0% 1 33.3% makeslice1
0 0.0% 100.0% 2 66.7% net/http.(*ServeMux).ServeHTTP
0 0.0% 100.0% 2 66.7% net/http.(*conn).serve
(pprof)web
聯(lián)系客服