
Bug: 826218 Change-Id: I176e1aeb0b24b21c6b4e5ee40910dce2bce52c95 Reviewed-on: https://chromium-review.googlesource.com/1239461 Reviewed-by: Nico Weber <thakis@chromium.org> Commit-Queue: Daniel Bratell <bratell@opera.com> Cr-Commit-Position: refs/heads/master@{#593522}
176 lines
6.4 KiB
Markdown
176 lines
6.4 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
|
|
```
|
|
|
|
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`).
|
|
|
|
### google-perftools
|
|
|
|
google-perftools code is enabled when the `use_allocator` gn variable is set
|
|
to `tcmalloc` (currently the default). That will build the tcmalloc library,
|
|
including the cpu profiling and heap profiling code into Chromium. In order to
|
|
get stacktraces in release builds on 64 bit, you will need to build with some
|
|
extra flags enabled by setting `enable_profiling = true` in args.gn
|
|
|
|
In order to enable cpu profiling, run Chromium with the environment variable
|
|
`CPUPROFILE` set to a filename. For example:
|
|
|
|
CPUPROFILE=/tmp/cpuprofile out/Release/chrome
|
|
|
|
After the program exits successfully, the cpu profile will be available at the
|
|
filename specified in the CPUPROFILE environment variable. You can then analyze
|
|
it using the pprof script (distributed with google-perftools, installed by
|
|
default on Googler Linux workstations). For example:
|
|
|
|
pprof --gv out/Release/chrome /tmp/cpuprofile
|
|
|
|
This will generate a visual representation of the cpu 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.
|
|
|
|
Note that due to the current design of google-perftools' profiling tools, it is
|
|
only possible to profile the browser process. You can also profile and pass the
|
|
`--single-process` flag for a rough idea of what the render process looks like,
|
|
but keep in mind that you'll be seeing a mixed browser/renderer codepath that is
|
|
not used in production.
|
|
|
|
For further information, please refer to
|
|
http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html.
|
|
|
|
## Heap Profiling
|
|
|
|
### google-perftools
|
|
|
|
#### Turning on heap profiles
|
|
|
|
Follow the instructions for enabling profiling as described above in the
|
|
google-perftools section under CPU Profiling.
|
|
|
|
To turn on the heap profiler on a Chromium build with tcmalloc, use the
|
|
`HEAPPROFILE` environment variable to specify a filename for the heap profile.
|
|
For example:
|
|
|
|
HEAPPROFILE=/tmp/heapprofile out/Release/chrome
|
|
|
|
After the program exits successfully, the heap profile will be available at the
|
|
filename specified in the `HEAPPROFILE` environment variable.
|
|
|
|
Some tests fork short-living processes which have a small memory footprint. To
|
|
catch those, use the `HEAP_PROFILE_ALLOCATION_INTERVAL` environment variable.
|
|
|
|
#### Dumping a profile of a running process
|
|
|
|
To programmatically generate a heap profile before exit, use code like:
|
|
|
|
#include "third_party/tcmalloc/chromium/src/google/heap-profiler.h"
|
|
|
|
// "foobar" will be included in the message printed to the console
|
|
HeapProfilerDump("foobar");
|
|
|
|
For example, you might hook that up to some action in the UI.
|
|
|
|
Or you can use gdb to attach at any point:
|
|
|
|
1. Attach gdb to the process: `$ gdb -p 12345`
|
|
1. Cause it to dump a profile: `(gdb) p HeapProfilerDump("foobar")`
|
|
1. 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=`).
|
|
|
|
#### Troubleshooting
|
|
|
|
* "Hooked allocator frame not found": build with `-Dcomponent=static_library`.
|
|
`tcmalloc` gets confused when the allocator routines are in a different
|
|
`.so` than the rest of the code.
|
|
|
|
#### 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.
|