社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
go
的pprof
工具可以用来监测进程的运行数据,用于监控程序的性能,对内存使用和CPU使用的情况统信息进行分析。
官方提供了两个包:runtime/pprof
和net/http/pprof
,前者用于普通代码的性能分析,后者用于web服务器的性能分析
该包提供了一系列用于调试信息的方法,可以很方便的对堆栈进行调试
StartCPUProfile
:开始监控cpu。StopCPUProfile
:停止监控cpu,使用StartCPUProfile后一定要调用该函数停止监控。WriteHeapProfile
:把堆中的内存分配信息写入分析文件中测试代码
package main
import (
"flag"
"runtime/pprof"
"log"
"runtime"
"math/rand"
"os"
"time"
)
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile `file`")
var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
const (
col = 10000
row = 10000
)
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal("could not create CPU profile: ", err)
}
if err := pprof.StartCPUProfile(f); err != nil { //监控cpu
log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()
}
// 主逻辑区,进行一些简单的代码运算
x := [row][col]int{}
s := rand.New(rand.NewSource(time.Now().UnixNano()))
for i := 0; i < row; i++{
for j := 0; j < col; j++ {
x[i][j] = s.Intn(100000)
}
}
for i := 0; i < row; i++{
tmp := 0
for j := 0; j < col; j++ {
tmp += x[i][j]
}
}
if *memprofile != "" {
f, err := os.Create(*memprofile)
if err != nil {
log.Fatal("could not create memory profile: ", err)
}
runtime.GC() // GC,获取最新的数据信息
if err := pprof.WriteHeapProfile(f); err != nil { // 写入内存信息
log.Fatal("could not write memory profile: ", err)
}
f.Close()
}
}
go build
./pprof -cpuprofile cpu.prof -memprofile mem.prof // 会产生cpu分析文件和内存分析文件
然后本地运行go tool pprof cpu.prof
就可以进入命令行,使用性能分析工具查看数据
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!