Skip to content

Instantly share code, notes, and snippets.

@imchao9
Forked from sericaia/perf-flame-graph-notes.md
Created February 25, 2017 16:17
Show Gist options
  • Save imchao9/9859b06f2765c654629e0a18069c44a3 to your computer and use it in GitHub Desktop.
Save imchao9/9859b06f2765c654629e0a18069c44a3 to your computer and use it in GitHub Desktop.
Quick steps of how to create a flame graph using perf

The prep-script.sh will setup the latest Node and install the latest perf version on your Linux box.

When you want to generate the flame graph, run the following (folder locations taken from install script):

sudo sysctl kernel.kptr_restrict=0
# May also have to do the following:
# (additional reading http://unix.stackexchange.com/questions/14227/do-i-need-root-admin-permissions-to-run-userspace-perf-tool-perf-events-ar )
sudo sysctl kernel.perf_event_paranoid=0

perf record -i -g -e cycles:u -- ~/sources/node/node --perf-basic-prof script.js

perf script | egrep -v "( __libc_start| LazyCompile | v8::internal::| Builtin:| Stub:| LoadIC:|\[unknown\]| LoadPolymorphicIC:)" | sed 's/ LazyCompile:[*~]\?/ /' | ~/sources/FlameGraph/stackcollapse-perf.pl > out.perf-folded

~/sources/FlameGraph/flamegraph.pl out.perf-folded > node-flame.svg

The data munging is to help expose the most important bits. There is still some play that I'm working with, but right now it seems to be working.

Alternatives:

perf script | egrep -v "( __libc_start|node::Start\(| LazyCompile | Builtin:| Stub:| LoadIC:|\[unknown\]| LoadPolymorphicIC:)" | ../FlameGraph/stackcollapse-perf.pl | grep "uv_run" > out.perf-folded

perf script | egrep -v "( __libc_start|node::Start\(| LazyCompile | v8::internal::| Builtin:| Stub:| LoadIC:|\[unknown\]| LoadPolymorphicIC:)" | ../FlameGraph/stackcollapse-perf.pl | grep "uv_run" > out.perf-folded
#!/bin/bash
sh /etc/lsb-release
wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key|sudo apt-key add -
apt-add-repository "deb http://llvm.org/apt/${DISTRIB_CODENAME}/ llvm-toolchain-${DISTRIB_CODENAME} main"
apt-get update
apt-get -y upgrade
apt-get -y install make build-essential linux-tools-common elfutils libelf-dev flex bison libunwind8 libunwind8-dev libaudit-dev libdw-dev binutils-dev libnuma-dev libslang2-dev asciidoc llvm-3.6 clang-3.6 lldb-3.6 libllvm3.6 subversion libc6-dev-i386 libgtk2.0-dev libperl-dev python-dev git tmux nginx gdb apache2-utils
ln -s /usr/bin/clang-3.6 /usr/bin/clang
ln -s /usr/bin/clang++-3.6 /usr/bin/clang++
ln -s /usr/bin/lldb-3.6 /usr/bin/lldb
echo 'export CC=clang' > ~/.bash_aliases
echo 'export CXX=clang++' >> ~/.bash_aliases
echo 'export GYP_DEFINES="clang=1"' >> ~/.bash_aliases
. ~/.bash_aliases
chmod 777 /usr/share/nginx/html
ln -s /usr/share/nginx/html www
mkdir sources
cd sources
wget https://github.com/joyent/node/archive/v0.11.13.tar.gz
tar xvf v0.11.13.tar.gz
rm v0.11.13.tar.gz
mv node-0.11.13 node
cd node
./configure --gdb
make
make install
cd ~/sources
wget https://github.com/brendangregg/FlameGraph/archive/master.tar.gz
tar xvf master.tar.gz
rm master.tar.gz
mv FlameGraph-master FlameGraph
#cd ~/sources
#wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.15.6.tar.gz
#tar xvf linux-3.15.6.tar.gz
#rm linux-3.15.6.tar.gz
#cd linux-3.15.6/tools/perf/
#make -f Makefile.perf install prefix=/usr
@imchao9
Copy link
Author

imchao9 commented Feb 25, 2017

taken from https://yunong.io/2015/11/23/generating-node-js-flame-graphs/

$ uname -a
Linux demo 3.2.0-74-virtual #109-Ubuntu SMP Tue Dec 9 17:04:48 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ node --version
v5.0.0
$ node --perf-basic-prof-only-functions demo.js&
$ sudo perf record -F 99 -p pgrep -n node -g -- sleep 30
[ perf record: Woken up 3 times to write data ]
[ perf record: Captured and wrote 0.531 MB perf.data (~23181 samples) ]
$ ls /tmp/*.map
/tmp/perf-13083.map
$ sudo chown root /tmp/perf-13083.map
$ sudo perf script > nodestacks
$ git clone --depth 1 http://github.com/brendangregg/FlameGraph
$ cd FlameGraph
$ ./stackcollapse-perf.pl < ../nodestacks | ./flamegraph.pl --colors js > ../node-flamegraph.svg

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment