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

  • 相关阅读:
    CentOS6.5卸载自带的Mysql软件
    Oracle 监听hang住
    mysql忘记root登录密码
    根据linux自带的JDK,配置JAVA_HOME目录
    nbu还原集群数据库异常问题
    Oracle11g RAC安装
    linux系统安装步骤
    oracle11g安装补丁升级
    linux系统安装Oracle11g详细步骤
    Express之Hello World示例
  • 原文地址:https://www.cnblogs.com/FG123/p/12875585.html
Copyright © 2020-2023  润新知