Go:性能优化

时间:Feb. 20, 2020 分类:

目录:

性能优化

性能优化主要有几个方面

  • CPU CPU的使用情况
  • 内存 程序内存的使用情况
  • goruntine 不在运行状态的情况是否存在死锁,调用关系

go语言内置了获取程序运行的库

  • runtime/pprof 采集工具类应用运行输出分析
  • net/http/pprof 采集服务型应用运行输出分析

pprof开启之后,每隔10ms就会采集一下当前堆栈信息,获取函数占用的CPU和内存资源,对数据进行采样和分析,生成数据报告

runtime/pprof

直接引入即可

import runtime/pprof

CPU性能分析

开启CPU性能分析

pprof.StartCPUProfile(w io.Writer)

关闭CPU性能分析

pprof.StopCPUProfile()

应用结束后会产生文件用于保存profiling数据,使用go tool pprof进行CPU性能分析

内存性能分析

pprof.WriteHeapProfile(w io.Writer)

也同样是go tool pprof进行性能分析,默认是使用-inuse_space参数,可以使用-inuse-objects查看内存分配对象

go tool pprof

使用方式

go tool pprof [binary] [source]
  • binary 是应用的二进制文件,用来解析各种符号;
  • source 表示profile数据的来源,可以是本地的文件,也可以是http地址

示例有问题的代码


实行性能分析

$ go run main.go -cpu 
File: main
Type: cpu
Time: Feb 20, 2020 at 12:43am (CST)
Duration: 20.40s, Total samples = 18.22s (89.33%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) 

进入交互界面

(pprof) top5
Showing nodes accounting for 18.22s, 100% of 18.22s total
      flat  flat%   sum%        cum   cum%
     7.72s 42.37% 42.37%      7.72s 42.37%  runtime.chanrecv
     6.04s 33.15% 75.52%     13.76s 75.52%  runtime.selectnbrecv
     4.46s 24.48%   100%     18.22s   100%  main.logicCode
  • flat 当前函数占用CPU耗时
  • flat% 当前函数占用CPU耗时的百分比
  • sum% 占用CPU耗时的累计百分比
  • cum 当前函数加上调用当前函数占用CPU耗时
  • cum% 当前函数加上调用当前函数占用CPU耗时的百分比
  • 最后一列 函数名称

可以使用list <函数名>的方式查看函数的耗时情况

(pprof) list logicCode
Total: 18.22s
ROUTINE ======================== main.logicCode in /root/go_code/src/runtimme_pprof/main.go
     4.46s     18.22s (flat, cum)   100% of Total
         .          .     10:
         .          .     11:func logicCode() {
         .          .     12:    var c chan int
         .          .     13:    for {
         .          .     14:        select {
     4.46s     18.22s     15:            case v := <- c:
         .          .     16:                fmt.Printf("recv from chan, value: %v\n", v)
         .          .     17:            default:
         .          .     18:            
         .          .     19:        }
         .          .     20:    }

可以发现CPU资源都是被case v := <- c,因为default没有内容,可以在default分支添加time.Sleep(time.Second)