go性能调优之火焰图

了解到go中有pprof包来做代码的性能监控,可以查看堆栈、cpu信息等。在两个地方有包:

net/http/pprof

runtime/pprof

但是使用起来并不是特别好用(不是特别直观)。之前在接触systemtap的时候,了解到火焰图这个东西。后来了解到uber开源了一个生成火焰图的工具——go-torch。

下面整理下,之前使用分析的一个过程。

1 添加pprof代码

首先我们要在实例的main函数中添加pprof的相关的代码:

package main

import (
        ...
	_"net/http/pprof"
	"github.com/astaxie/beego"

	"os/exec"
	"net/http"
)


func main() {

	go func(){
		http.ListenAndServe(":6789", nil)
	}()

这样我们可以通过访问URL:http://<ip>:6789/debug/pprof/得到堆栈信息


通过访问URl:http://<ip>:6789/debug/pprof/profile获得函数调用CPU消耗的情况(不是特别直观,一堆文字)

2 生成火焰图工具安装

需要安装两个工具:FlameGraph脚本和go-torch

git clone https://github.com/brendangregg/FlameGraph.git

cp flamegraph.pl /usr/local/bin
或
export FlameGraph所在的path

go get -v github.com/uber/go-torch

3 测试

完成安装之后,运行测试程序和测试工具:

go-torch -u http://<ip>:6789 -t60 -p > profile-local.svg

表示采集60s的数据(默认30s),完了后会在当前目录生成一张火焰图,可以用浏览器打开:



4 如何看图

参考:https://blog.csdn.net/wwwasw/article/details/52137630

   每个框代表一个栈里的一个函数
   Y轴代表栈深度(栈桢数)。最顶端的框显示正在运行的函数,这之下的框都是调用者。在下面的函数是上面函数的父函数
   X轴代表采样总量。从左到右并不代表时间变化,从左到右也不具备顺序性
   框的宽度代表占用CPU总时间。宽的框代表的函数可能比窄的运行慢,或者被调用了更多次数。框的颜色深浅也没有任何意义
   如果是多线程同时采样,采样总数会超过总时间


猜你喜欢

转载自blog.csdn.net/idwtwt/article/details/80339076