339e724ae6
there might be coolwsds launched from another service which doesn't match -u coolwsd, so use -t coolwsd instead to capture all of them then their output might be interleaved, so switch to another log format that retains the name[pid] and stable sort on that column so we have all the matching lines for a name[pid] contiguous but ordered within that by time. After the sort, cut to drop the columns that are additional over the 'cat' format. Signed-off-by: Caolán McNamara <caolan.mcnamara@collabora.com> Change-Id: Id1d1c37001249ff348d6c09c005fb0836133258c
54 lines
2.5 KiB
Bash
Executable file
54 lines
2.5 KiB
Bash
Executable file
#! /bin/bash
|
|
#
|
|
# get a flamegraph of an online session
|
|
# a) sends SIGUSR1 to get kitbrokers to dump info to logs
|
|
# b) scans likely logs for that info and scrapes out the
|
|
# document, users and pids
|
|
# c) prompts for which pid to profile
|
|
# d) profiles, then generates flamegraph on ctrl+c
|
|
if ! test `id -u` = 0; then
|
|
echo "not root, if this doesn't work try sudo profile-cool"
|
|
fi
|
|
if ! which flamegraph.pl > /dev/null 2>&1; then
|
|
REAL_USER_HOME="$(getent passwd $SUDO_USER | cut -d: -f6)"
|
|
PATH=$PATH:$HOME/FlameGraph:$REAL_USER_HOME/FlameGraph
|
|
fi
|
|
if ! which flamegraph.pl > /dev/null 2>&1; then
|
|
echo "no flamegraph.pl found"
|
|
echo "On fedora install systemwide with: sudo dnf install flamegraph"
|
|
echo "Otherwise install locally manually into ~/FlameGraph"
|
|
echo " e.g. git clone https://github.com/brendangregg/FlameGraph ~/FlameGraph"
|
|
exit 1
|
|
fi
|
|
# a deployment will log to journal, take current time to grep logs from that time point
|
|
date=`date +%s`
|
|
# a local dev build dumps to /tmp/coolwsd.log by default, take current size to grep from that size point
|
|
if [ -e /tmp/coolwsd.log ]; then
|
|
locallogsize=`du -b /tmp/coolwsd.log|cut -f1`
|
|
fi
|
|
echo using pkill -SIGUSR1 kitbroker to dump info
|
|
pkill -SIGUSR1 kitbroker
|
|
echo Waiting 1 second for results
|
|
sleep 1
|
|
echo ---systemd journal---
|
|
# We might have multiple coolwsds and we want the output from all of them.
|
|
# But we want lines from each pid to be grouped together, and each group
|
|
# of lines to be in chronological order.
|
|
# So use short-unix to retain the name[pid], stable sort on that key
|
|
# then use cut to remove the columns we only included to get the desired
|
|
# order
|
|
journalctl --since @$date -t "coolwsd" -o short-unix | sort -s -k3,3 | cut -d " " -f 4- | grep -P "\Wpid:|\WjailedUrl:|\WviewId:.*userExtraInfo:"
|
|
if [ -e /tmp/coolwsd.log ]; then
|
|
echo ---local dev log---
|
|
tail -c +$locallogsize /tmp/coolwsd.log | grep -P "\Wpid:|\WjailedUrl:|\WviewId:.*userExtraInfo:"
|
|
fi
|
|
echo -n "enter pid to measure performance of: "
|
|
read kitpid
|
|
echo now running perf to record performance data, press ctrl+c when ready to generate output
|
|
trap ' ' INT
|
|
# note a) perf version 6.4.4 doesn't unmangle c++ names correctly for me, while 6.2.6 does
|
|
perf record -F50 --call-graph dwarf,65528 --pid $kitpid
|
|
# note b) perf version 5.14.21 is agonizingly slow without --no-inline, while 6.2.6 seems ok
|
|
perf script --no-inline | stackcollapse-perf.pl > perf-$kitpid.log
|
|
flamegraph.pl perf-$kitpid.log > perf-$kitpid.svg
|
|
echo generated flamegraph output svg: perf-$kitpid.svg
|