zoukankan      html  css  js  c++  java
  • 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
    ", err)
    		return
    	}
    	// init MySQL
    	if err := dao.InitMySQL(config.Conf.MySQLConfig); err != nil {
    		fmt.Printf("init redis failed, err:%v
    ", err)
    		return
    	}
    	// init redis
    	if err := dao.InitRedis(config.Conf.RedisConfig); err != nil {
    		fmt.Printf("init redis failed, err:%v
    ", 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 会打开可视化的函数调用情况:

  • 相关阅读:
    BZOJ1527 : [POI2005]Pun-point
    2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
    2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
    NAIPC-2016
    BZOJ2498 : Xavier is Learning to Count
    ACM ICPC Vietnam National Second Round
    XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
    XVI Open Cup named after E.V. Pankratiev. GP of Peterhof
    HDU5509 : Pattern String
    BZOJ4583 : 购物
  • 原文地址:https://www.cnblogs.com/FG123/p/12875585.html
Copyright © 2011-2022 走看看