golang调试性能分析
golang程序的CPU及内存使用情况性能分析
1.runtime.MemStats查看内存占用情况
//读取当前内存信息的方法 func printMemStats() { //定义一个 runtime.MemStats对象 var ms runtime.MemStats //通过对象的属性 查询内存的信息 //1 将内存中的数据加载到 ms对象中 runtime.ReadMemStats(&ms) //2 将ms对象信息打印出来 log.Printf( "====> Alloc:%d(bytes), HeapIdle:%d(bytes), "+ "HeapReleased:%d(bytes), HeapInuse:%d(bytes), "+ "GCSys:%d(bytes), Sys:%d(bytes)", ms.Alloc, ms.HeapIdle, ms.HeapReleased, ms.HeapInuse, ms.GCSys, ms.Sys, ) } func test() { //slice 是一个动态扩容的, 用slice来做堆内存的一个申请 mySlice := make([]int, 8) log.Println(" --> loop begin...") for i := 0; i < 32*1000*1000; i++ { mySlice = append(mySlice, i) if i == 16*1000*1000 { printMemStats() } } log.Println(" --> loop end...") } func main() { log.Println("Start ...") printMemStats() test() //强制调用GC回收 log.Println("force GC...") runtime.GC() log.Println("Done..") printMemStats() //开辟一个协程,定期的打印当前的内存信息 go func() { for { printMemStats() time.Sleep(10 * time.Second) } }() //主线程 睡眠等待 select {} }
Alloc:golang语言框架堆空间分配的字节数
HeapIdle:申请但是未分配的堆内存或者回收了的堆内存(空闲)字节数
HeapReleased:返回给OS的堆内存
HeapInuse uint64:正在使用的堆内存字节数
GCSys uint64:垃圾回收标记元信息使用的内存
Sys uint64:服务现在系统使用的内存
2. pprof分析golang内存
package main import ( "fmt" "log" "net/http" _ "net/http/pprof" "runtime" "strconv" ) func main() { go func() { log.Println(http.ListenAndServe("0.0.0.0:10000", nil)) }() err := config.InitFromIni("conf/conf.ini") if err != nil { panic(err) } // init logger if err := logger.InitLogger(config.Conf.LogConfig); err != nil { fmt.Printf("init logger failed, err:%v\n", err) return } // init MySQL if err := dao.InitMySQL(config.Conf.MySQLConfig); err != nil { fmt.Printf("init redis failed, err:%v\n", err) return } // init redis if err := dao.InitRedis(config.Conf.RedisConfig); err != nil { fmt.Printf("init redis failed, err:%v\n", err) return } logger.Logger.Info("start project...") address := ":" + strconv.Itoa(config.Conf.ServerConfig.Port) r := routers.SetupRouter() // 初始化路由 r.Run(address) }
3. golang程序cpu性能分析
在浏览器输入:http://localhost:10000/debug/pprof/ ,进入pprof调试页:
点击profile会下载相应的profile文件,执行 go tool pprof (可执行的二进制文件) profile 进入profile:
使用top指令即可查看当前profile文件中的cpu占用率:
安装Graphviz后,在pprof输入 web 会打开可视化的函数调用情况: