Skip to content

Profiling

Josh Watzman edited this page Mar 19, 2015 · 7 revisions

HHVM has several options for profiling your PHP (and Hack!) code and figuring out where it's spending its time. You may want to also look into tuning HHVM itself.

XHProf / Hotprofiler

HHVM natively supports the xhprof extension. This is good for producing parent-child pairs of function calls. The data collected are inclusive wall and CPU times. There are some libraries available for manipulating this data.

Although the earliest and least fancy of tools in Facebook's historical performance tuning story, this got us an extremely long way. We'd record 1:N requests, throw them into a DB, and have offline scripts (similar to those provided in the library above) aggregate those into 10m rollups per endpoint, then aggregate those into 1h rollups, 1d rollups, etc. It's not in wide use at FB to this day only since it's notion of "function call" doesn't deal well with Hack's async functions.

Strobelight

You can use the Linux perf tool to look at HHVM performance. HHVM can spit out metadata for perf to use so that its stack traces can look into even JITted code. This is extremely good for profiling HHVM itself (as opposed to the code running on it), as well as looking into complex systems interactions. However, since it's kernel-based, getting any sort of PHP metadata, such as even which endpoint a trace is running, is very difficult.

TODO we should document how to use this. It might require recompiling the kernel?!

Xenon

The newest of the tools. A configuration option controls how often a snapshot of the current execution backtrace is taken (usually every few minutes). PHP code, usually a shutdown function, can then look and see if that request had a profile taken, and if so write it to a DB. In aggregate, these "flashes" of profiling information tell which functions it's more likely execution time will be spent, i.e., which functions are more expensive.

There are a bunch of things you can do with this data, especially since it gives a full backtrace, and the PHP shutdown function logging it can provide arbitrary metadata with the trace. Facebook has some fancy visualization tools to walk up and down aggregated traces, which are sadly not open source. Wikimedia also has some tooling built around Xenon, to aggregate its traces into flame graphs.

Because it's a flash profiler, the data collected are all effectively about wall time. You might want to filter out IO heavy functions.

Clone this wiki locally