除了解决业务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.scriptgit clone git@github.com:brendangregg/FlameGraph.git && cd ./FlameGraphstackcollapse-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