| # 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. |