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 会打开可视化的函数调用情况:



浙公网安备 33010602011771号