除了解决业务Bug之外,工作中通常我们还会面临两类问题:
一般我们会通过各种监控、报警系统,发现和定位问题,关于如何搭建服务监控可以参考之前的文章《Go服务监控搭建入门》。但是呢,一些特殊情况,比如创业初期或者拥有大量技术债的系统,监控可能不够完善。所以今天就来看看这种情况下,如何定位服务负载异常的原因。
首先关于「负载异常」的问题,大都肯定都知道使用top
或者htop
等命令定位到某个进程或线程,好,问题来了:
如何定位到是哪个具体的函数导致的服务负载异常呢?
perf
本文使用docker来演示perf
的用法,可以直接使用我编排好的docker compose工程(一个模拟http服务调用grpc服务的演示项目) https://github.com/TIGERB/easy-tips/blob/master/docker/go/docker-compose.yaml
启动服务
// -d daemon守护模式
docker-compose up -d
进入容器
docker exec -it http-demo sh
安装perf
// 因为我这里使用的alpine,所以用apk安装,centos安装方式 yum install perf
apk add --update perf
模拟请求
siege -c 3 -t 30S "http://localhost:6060/v1/demo"
采样进程(当前目录会生成一个perf.data文件)
perf record -F 99 -p 6 -g sleep 10
释义:
-F 频率 每秒采样多少次
-p 进程 进程id
-g 记录调用栈
sleep 采样多少秒
分析CPU采样结果
perf report -n --stdio
除此之外,查看实时top函数
perf top -p 6
如果上述的堆栈信息等还满足不了你,我们还可以基于采样过程生成的perf.data
文件生成火焰图:
perf script
命令转换上一步得到的perf.data
文件,为下面使用火焰图工具生成火焰图做准备:perf script -i yourpath/perf.data &> yourpath/perf.script
git clone git@github.com:brendangregg/FlameGraph.git && cd ./FlameGraph
stackcollapse-perf.pl
进一步处理perf.script
文件:./stackcollapse-perf.pl yourpath/perf.script &> yourpath/perf.stackcollapse
./flamegraph.pl yourpath/perf.stackcollapse > yourpath/perf.svg
关于我的常用画图软件:
1. Balsamiq Mockups 3
2. Processon