How to profile Chromium on Linux.
See Profiling Chromium and WebKit for alternative discussion.
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
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:
# 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 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.
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.
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:
- Attach gdb to the process:
$ gdb -p 12345
- Cause it to dump a profile:
(gdb) p HeapProfilerDump("foobar")
- The filename will be printed on the console you started Chrome from; e.g.
"
Dumping heap profile to heap.0001.heap (foobar)
"
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.)
Sandboxed renderer subprocesses will fail to write out heap profiling dumps. To
work around this, turn off the sandbox (via export CHROME_DEVEL_SANDBOX=
).
- "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.
For further information, please refer to http://google-perftools.googlecode.com/svn/trunk/doc/heapprofile.html.
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.