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)
}

  

启动服务,在浏览器输入:http://localhost:10000/debug/pprof/heap?debug=1 进入pprof

 

3. golang程序cpu性能分析
 在浏览器输入:http://localhost:10000/debug/pprof/ ,进入pprof调试页:

点击profile会下载相应的profile文件,执行 go tool pprof (可执行的二进制文件) profile 进入profile:

 

 使用top指令即可查看当前profile文件中的cpu占用率:

 

安装Graphviz后,在pprof输入 web 会打开可视化的函数调用情况:

 

posted @ 2020-06-24 01:02  HarvardFly  阅读(1175)  评论(0编辑  收藏  举报