需要对executor CPU进行profile,看调用栈,有没有函数性能瓶颈,想用火焰图。
1. 登录executor所在NM节点;
2. 通过ps -ef | grep appId/executor 结合 jps 找到相应executor进程,找到进程pid;
3. 通过以下脚本,获取(程序会自动定时抓取并生成)供profile用的jstack和top等文件:
#!/bin/bash
if [ $# -eq 0 ]; then
echo >&2 "Usage: jstackSeries <pid> <run_user> [ <count> [ <delay> ] ]"
echo >&2 " Defaults: count = 10, delay = 0.5 (seconds)"
exit 1
fi
pid=$1 # required
user=$2 # required
count=${3:-10} # defaults to 10 times
delay=${4:-0.5} # defaults to 0.5 seconds
while [ $count -gt 0 ]
do
top -H -b -n1 -p $pid >top.$pid.$(date +%H%M%S.%N) &
jstack -l $pid >jstack.$pid.$(date +%H%M%S.%N)
sleep $delay
let count--
echo -n "."
done
比如,将上述脚本在节点上一个目录下保存为profile.sh,命令行执行
./profile.sh 12345(pid) yarn(要抓取的进程的启动用户) 360 0.5
脚本需要4个输入参数,分别是 pid 、 进程启动用户、需要抓取的点个数、时间间隔,其中前两个为必要参数。
ps:需要注意的是,使用上述命令时,需要使用与待profile进程相同的用户,否则可能会遇到权限不对等问题;
4. 执行上述命令后,即可获取一揽子命名类似: jstack.6666.666666.66666666和top.66666.666666.666666666的用于profile文件;
5. 将上述文件夹拿到自己机器本地,假设放在了/tmp/profile 路径下,有了“基础资料”后,就可以制作火焰图了;
6. 从github上 git clone FlameGraph 项目到本地,项目地址为: https://github.com/brendangregg/FlameGraph.git
7. 在FlameGraph项目根目录下,通过命令:
./stackcollapse-jstack.pl /tmp/profile/jstack* | ./flamegraph.pl > application_666666-executor.svg
即可生成对应的火焰图,是一个svg文件。
8. 通过浏览器等方式,将svg文件打开,即可看到火焰图,然后就可以进行分析啦~