Created
September 11, 2023 05:26
-
-
Save trishume/0384b1f65e8cf6802aba01e2480d8a77 to your computer and use it in GitHub Desktop.
perf script to chrome trace
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
set -eu | |
TIMESTAMP=`date '+%Y-%m-%d-%H:%M:%S'`; | |
perf buildid-cache --add /usr/local/lib/librfxencode.so.0 | |
perf buildid-cache --add /usr/local/lib/xrdp/libxrdp.so.0 | |
perf buildid-cache --add /usr/lib/xorg/modules/libxorgxrdp.so | |
perf buildid-cache --add `which xrdp` | |
perf probe --del 'sdt_librfxcodec:*' || true | |
perf probe sdt_librfxcodec:rfx_compose_message_tileset_start | |
perf probe sdt_librfxcodec:rfx_compose_message_tileset_tile | |
perf probe sdt_librfxcodec:rfx_compose_message_tileset_end | |
perf probe sdt_librfxcodec:process_enc_rfx_send | |
perf probe --del 'sdt_libxrdp:*' || true | |
perf probe sdt_libxrdp:xrdp_rdp_send_fastpath | |
perf probe sdt_libxrdp:xrdp_rdp_send_fastpath_compratio | |
perf probe --del 'sdt_xorgxrdp:*' || true | |
perf probe sdt_xorgxrdp:rdpCapture2 | |
perf probe sdt_xorgxrdp:rdpCapture2_firstrows | |
perf probe sdt_xorgxrdp:rdpCapture2_scrolldet | |
perf probe sdt_xorgxrdp:rdpCapture2_scrollmap | |
perf probe sdt_xorgxrdp:rdpCapture2_scrollextentx | |
perf probe sdt_xorgxrdp:rdpCapture2_scrollextenty | |
perf probe sdt_xorgxrdp:rdpCapture2_scrolled | |
perf probe sdt_xorgxrdp:rdpPutImage | |
perf probe --del 'probe_librfxencode:*' || true | |
perf probe -x /usr/local/lib/librfxencode.so.0 'rfxcodec_encode+0' | |
perf probe -x /usr/local/lib/librfxencode.so.0 'rfxcodec_encode%return' | |
perf probe --del 'probe_libxrdp:*' || true | |
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_fastpath_process_input_event+0' | |
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_fastpath_process_input_event%return' | |
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'compress_rdp+0' | |
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'compress_rdp%return' | |
# perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_rdp_send_fastpath+0' | |
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_rdp_send_fastpath%return' | |
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_rdp_send_data+0' | |
perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_rdp_send_data%return' | |
# perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_fastpath_send+0' | |
# perf probe -x /usr/local/lib/xrdp/libxrdp.so.0 'xrdp_fastpath_send%return' | |
perf probe --del 'probe_libcommon:*' || true | |
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_tcp_send+0' | |
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_tcp_send%return' | |
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_tls_send+0' | |
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_tls_send%return' | |
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_set_tls_mode+0' | |
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_set_tls_mode%return' | |
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_shutdown_tls_mode+0' | |
perf probe -x /usr/local/lib/xrdp/libcommon.so.0 'trans_shutdown_tls_mode%return' | |
perf probe --del 'probe_libxorgxrdp:*' || true | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCapture+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCapture%return' | |
# perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpPutImage+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpPutImage%return' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpClientConAddAllReg+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpClientConAddAllBox+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpClientConAddDirtyScreenBox+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpClientConAddDirtyScreenReg+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCopyArea+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCopyArea%return' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCompositeRects+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpCompositeRects%return' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpPolyFillRect+0' | |
perf probe -x /usr/lib/xorg/modules/libxorgxrdp.so 'rdpPolyFillRect%return' | |
# exit 0 | |
DIR=~/perf/xrdp-${TIMESTAMP} | |
echo $DIR | |
mkdir $DIR | |
cd $DIR | |
ctrl_c() { | |
echo "cleaning up" | |
rm ~/perf/latest | |
ln -s $DIR ~/perf/latest | |
chown -R $SUDO_USER ~/perf | |
exit | |
} | |
trap ctrl_c INT TERM | |
perf record -e 'sdt_librfxcodec:*,sdt_libxrdp:*,sdt_xorgxrdp:*,probe_librfxencode:*,probe_libxrdp:*,probe_libxorgxrdp:*,probe_libcommon:*,sched:sched_switch' -a |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "json" | |
REGEX = /^\s*(?<proc>\S+)\s+(?<tid>-?[0-9]+) \[(?<cpu>[0-9]+)\]\s+(?<time>[0-9]+\.[0-9]+):\s+(?<cat>\S+):(?<event>\S+?)(?:_start|)(?<end>__return|_end|): (?:\(.*\)(?: |$))?(?<args>.*)$/ | |
evs = [] | |
ARGF.each_line do |line| | |
# puts line | |
line = line.gsub("JS Helper", "JSHelper") | |
line = line.gsub("Bluez D-Bus thr", "BluezDbusthr") | |
line = line.gsub("dconf worker", "dconfworker") | |
line = line.gsub("rs:main Q:Reg", "dconfworker") | |
if m = line.match(REGEX) | |
# p m | |
evs << m | |
else | |
STDERR.puts "no match: #{line.inspect}" | |
exit 1 | |
end | |
end | |
# END_REGEX = /(?:__return|_end)$/ | |
spans = {} | |
evs.each do |m| | |
if m[:end] != "" | |
spans[m[:event]] = true | |
end | |
end | |
$started = false | |
$opened = {} | |
def print_ev(e) | |
return if e[:name].include?('swapper') | |
if e[:ph] == 'E' && !$opened[e[:tid]] | |
return | |
elsif e[:ph] == 'B' | |
$opened[e[:tid]] = true | |
end | |
if $started | |
print "," | |
else | |
$started = true | |
end | |
puts JSON.dump(e) | |
end | |
puts "[" | |
evs.each do |m| | |
ts = (m[:time].to_f*1_000_000).to_i | |
if m[:event] == "sched_switch" | |
if a = m[:args].match(/^prev_comm=(?<from>\S+) .* next_comm=(?<to>\S+) /) | |
# p [m[:cpu].to_i, a[:from], a[:to]] | |
e1 = {'name': a[:from], 'cat': 'cpu', 'ph': 'E', 'ts': ts, 'pid': 0, 'tid': m[:cpu].to_i, "args": {}} | |
e2 = {'name': a[:to], 'cat': 'cpu', 'ph': 'B', 'ts': ts, 'pid': 0, 'tid': m[:cpu].to_i, "args": {}} | |
print_ev(e1) | |
print_ev(e2) | |
else | |
p ["not matched", m[:args]] | |
end | |
else | |
ph = 'I' | |
if m[:end] != "" | |
ph = 'E' | |
elsif spans[m[:event]] | |
ph = 'B' | |
end | |
# n = m[:event].gsub(/^\S+:/,'') | |
n = m[:event] | |
args = m[:args].empty? ? {} : { ph => m[:args]} | |
e = {'name': n, 'cat': m[:proc], 'ph': ph, 'ts': ts, 'pid': 1, 'tid': m[:tid].to_i, "args": args} | |
print_ev(e) | |
end | |
end | |
puts "]" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment