A demo for poor man's profiler
for i in seq 1 100
; do cat /proc/$pid/stack | sed 's/+.*//;' | tac | awk '{printf("%s;",$2)}END{printf("\n")}'; usleep 10000; done | sort | uniq -c | awk '{print $2, $1}' | ./flamegraph.pl > store.svg
for i in `seq 0 100`; do jstack $pid; usleep 10000; done | grep -vE '\- locked|\- waiting on' | awk '/tid=/{if (x)print x; x="";}{x=(!x)?$0:x";"$0}END{if(x)print x}' | sed 's/(//g;s/)//g;s/@[^;]*;/;/g;s/;[[:space:]]*at /;/g;' | awk '{print $0"JAVA"}' | grep 'tid=' | grep 'java.lang.Thread.State: RUNNABLE' | awk -F';' '{for(i=NF;i>=3;i--) printf "%s%s", $i, (i==3?";\n":";")}' | sort | uniq -c | grep -v ' JAVA;$' | awk '{print $2,$1}' | ./flamegraph.pl > perf.svg
./pmp --pid=$pid --attach=0 --interval=10 --sample_times=100 | ./flamegraph.pl > redis.svg
./pmp --pid=$pid --attach=1 --interval=10 --sample_times=100 | ./flamegraph.pl > redis.svg
./pmp --pid=$pid --attach=2 --interval=10 --sample_times=100 | ./flamegraph.pl > redis.svg