libreoffice-online/scripts/profile-cool
Caolán McNamara 339e724ae6 make profiling script find all coolwsds
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
2024-03-22 13:16:59 +01:00

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