
Bug: 313526654 Change-Id: Iab8b2915c0627f5830344cb8145810f7898b5409 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5337346 Reviewed-by: David Benjamin <davidben@chromium.org> Auto-Submit: Daniel Cheng <dcheng@chromium.org> Commit-Queue: Daniel Cheng <dcheng@chromium.org> Cr-Commit-Position: refs/heads/main@{#1267454}
114 lines
4.0 KiB
Markdown
114 lines
4.0 KiB
Markdown
# Linux Profiling
|
|
|
|
How to profile Chromium on Linux.
|
|
|
|
See
|
|
[Profiling Chromium and WebKit](https://sites.google.com/a/chromium.org/dev/developers/profiling-chromium-and-webkit)
|
|
for alternative discussion.
|
|
|
|
## CPU Profiling
|
|
|
|
gprof: reported not to work (taking an hour to load on our large binary).
|
|
|
|
oprofile: Dean uses it, says it's good. (As of 9/16/9 oprofile only supports
|
|
timers on the new Z600 boxes, which doesn't give good granularity for profiling
|
|
startup).
|
|
|
|
TODO(willchan): Talk more about oprofile, gprof, etc.
|
|
|
|
Also see
|
|
https://sites.google.com/a/chromium.org/dev/developers/profiling-chromium-and-webkit
|
|
|
|
### perf
|
|
|
|
`perf` is the successor to `oprofile`. It's maintained in the kernel tree, it's
|
|
available on Ubuntu in the package `linux-tools`.
|
|
|
|
To capture data, you use `perf record`. Some examples:
|
|
|
|
```shell
|
|
# captures the full execution of the program
|
|
perf record -f -g out/Release/chrome
|
|
# captures a particular pid, you can start at the right time, and stop with
|
|
# ctrl-C
|
|
perf record -f -g -p 1234
|
|
perf record -f -g -a # captures the whole system
|
|
```
|
|
|
|
> ⚠️ Note: on virtualized systems, e.g. cloudtops, the PMU counters may not
|
|
be available or may be broken. Use `-e cpu-clock` as a workaround.
|
|
Googlers, see [b/313526654](https://b.corp.google.com/issues/313526654).
|
|
|
|
Some versions of the perf command can be confused by process renames. Affected
|
|
versions will be unable to resolve Chromium's symbols if it was started through
|
|
perf, as in the first example above. It should work correctly if you attach to
|
|
an existing Chromium process as shown in the second example. (This is known to
|
|
be broken as late as 3.2.5 and fixed as early as 3.11.rc3.g36f571. The actual
|
|
affected range is likely much smaller. You can download and build your own perf
|
|
from source.)
|
|
|
|
The last one is useful on limited systems with few cores and low memory
|
|
bandwidth, where the CPU cycles are shared between several processes (e.g.
|
|
chrome browser, renderer, plugin, X, pulseaudio, etc.)
|
|
|
|
To look at the data, you use:
|
|
|
|
perf report
|
|
|
|
This will use the previously captured data (`perf.data`).
|
|
|
|
## Heap Profiling
|
|
|
|
#### Dumping a profile of a running process
|
|
|
|
To programmatically generate a heap profile before exit, you can use gdb to
|
|
attach at any point:
|
|
|
|
1. Attach gdb to the process: `$ gdb -p 12345`
|
|
2. Cause it to dump a profile: `(gdb) p HeapProfilerDump("foobar")`
|
|
3. The filename will be printed on the console you started Chrome from; e.g.
|
|
"`Dumping heap profile to heap.0001.heap (foobar)`"
|
|
|
|
#### Analyzing dumps
|
|
|
|
You can then analyze dumps using the `pprof` script (distributed with
|
|
google-perftools, installed by default on Googler Linux workstations; on Ubuntu
|
|
it is called `google-pprof`). For example:
|
|
|
|
pprof --gv out/Release/chrome /tmp/heapprofile
|
|
|
|
This will generate a visual representation of the heap profile as a postscript
|
|
file and load it up using `gv`. For more powerful commands, please refer to the
|
|
pprof help output and the google-perftools documentation.
|
|
|
|
(pprof is slow. Googlers can try the not-open-source cpprof; Evan wrote an open
|
|
source alternative [available on github](https://github.com/martine/hp).)
|
|
|
|
#### Sandbox
|
|
|
|
Sandboxed renderer subprocesses will fail to write out heap profiling dumps. To
|
|
work around this, turn off the sandbox (via `export CHROME_DEVEL_SANDBOX=`).
|
|
|
|
#### More reading
|
|
|
|
For further information, please refer to
|
|
http://google-perftools.googlecode.com/svn/trunk/doc/heapprofile.html.
|
|
|
|
## Paint profiling
|
|
|
|
You can use Xephyr to profile how chrome repaints the screen. Xephyr is a
|
|
virtual X server like Xnest with debugging options which draws red rectangles to
|
|
where applications are drawing before drawing the actual information.
|
|
|
|
export XEPHYR_PAUSE=10000
|
|
Xephyr :1 -ac -screen 800x600 &
|
|
DISPLAY=:1 out/Debug/chrome
|
|
|
|
When ready to start debugging issue the following command, which will tell
|
|
Xephyr to start drawing red rectangles:
|
|
|
|
kill -USR1 `pidof Xephyr`
|
|
|
|
For further information, please refer to
|
|
http://cgit.freedesktop.org/xorg/xserver/tree/hw/kdrive/ephyr/README.
|