Profiling PHP - PHPAmersfoort Meetup 2015-03-10

56
PROFILING PHP A DIVE INTO YOUR APPLICATION / Dennis de Greef @dennisdegreef PHPAmersfoort Meetup March 2015

Transcript of Profiling PHP - PHPAmersfoort Meetup 2015-03-10

Page 1: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

PROFILING PHPA DIVE INTO YOUR APPLICATION

/ Dennis de Greef @dennisdegreef

PHPAmersfoort Meetup March 2015

Page 2: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

WHAT IS PROFILING?

Page 3: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

WIKIPEDIAprofiling is a form of dynamic program analysis that measures,

for example, the space (memory) or time complexity of aprogram, the usage of particular instructions, or the frequency

and duration of function calls. Most commonly, profilinginformation serves to aid program optimization.

Page 4: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

SO... DYNAMIC PROGRAM ANALYSIS?

Page 5: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

YEAH...LETS FIRST LOOK AT IT'S COUNTERPART...

Page 6: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

STATIC ANALYSIS

Page 7: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

WIKIPEDIAStatic program analysis is the analysis of computer software that

is performed without actually executing programs

The term is usually applied to the analysis performed by anautomated tool, with human analysis being called program

understanding, program comprehension or code review.

Page 8: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

STATIC ANALYSIS TOOLSThere are a set of tools which perform static code analysis.

These tools can be integrated within an automated build.

PHP Mess DetectorPHP Copy/Paste DetectorPHP CodeSnifferPHP Dead Code Detector

There is a nice page containing a predefined set of tools for abuild to be found at Jenkins PHP

Page 9: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

BUT...

Page 10: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

THESE TOOLS ONLY ANALYSE HOW YOURCODE IS STRUCTURED, NOT HOW IT BEHAVES.

Page 11: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

DYNAMIC ANALYSIS

Page 12: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

WIKIPEDIAThe analysis of computer software that is performed by

executing programs on a real or virtual processor.

For dynamic program analysis to be effective, the target program must be executed with sufficient test inputs

to produce interesting behavior.

Use of software testing measures such as code coverage helpsensure that an adequate slice of the program's set of possible

behaviors has been observed.

Page 13: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

CALLSTACKA callstack is the order in which statements are exectuted.

An example commonly known, is an exception trace. This traceshows all the statements executed before an exception is

thrown.

Page 14: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

CALLGRAPHA callgraph is a visual representation of a callstack.

In large applications this graph can give you better insight onhow an application is wired.

Page 15: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

PROFILING DATAUsually, the data gathered with a profiler can be represented in

stacks or graphs.They can include information regarding memory- and cpu-usage.

Page 16: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

WHY?

Page 17: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

REASONSDebugging CPU performanceDebugging memory performanceDebugging IO performanceSee which function is called how many timesGain insight of the black box that is the application

Page 18: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

REASONSWe live in a digital age where we want everything instantly.According to a , 51 percent of onlineshoppers in the U.S claimed if a site is too slow they will notcomplete a purchase.Nowadays, search engine indexing also accounts for page load.

case study from Radware

The psychology of web performanceSEO 101: How important is site speed in 2014?

Case study from Radware

Page 19: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

WARNING!

Premature optimization is the root of all evil-- Donald Knuth

Only perform optimization when there is a need to.

Page 20: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

CAUSE OF ISSUES

Page 21: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

COMMON ISSUESNetwork slowdownDatastore slowdownExternal resources (API, Filesystems, Network sockets, etc)Bad code(tm)Didn't RTFM(tm)

Page 22: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

ACTIVE VS PASSIVE

Profiling PHP Part 1 (Davey Shafik)

Page 23: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

ACTIVE PROFILERUsed during developmentGather more information than passive profilers (like variables/values)Performance impact is biggerShould _NOT_ be used in productionExample: Xdebug

Page 24: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

PASSIVE PROFILERMinimal impact on performanceGathers less but sufficient information to diagnose issues(Only records function calls and cpu + mem)Examples: / , , XHProf UProfiler New Relic Blackfire.io

Page 25: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XDEBUG

Page 26: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XDEBUGGenerates files (like Valgrind for C)Can be analysed by KCacheGrind among othersCachegrind files are relatively big in sizeAlso a developer tool for breakpoints and remote debuggingActive profiler

cachegrind

Page 27: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

ENABLE XDEBUG PROFILING# php.ini settingsxdebug.profiler_enable=1xdebug.profiler_output_dir=/path/to/store/snapshotsxdebug.profiler_enable_trigger=1

Page 28: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XDEBUG WITH KCACHEGRIND

Page 29: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XDEBUG IN PHPSTORM

Page 30: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XDEBUG IN PHPSTORM

Page 31: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XDEBUG IN PHPSTORM

Page 32: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XDEBUG IN PHPSTORM

Page 33: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHPROF

Page 34: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHPROFDeveloped by Facebook and released as open-source in 2009PECL extensionLightweight for being a passive profilerIncludes webgui for reviewing and comparing profiling data

Page 35: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

# Linux (using apt or yum)apt-get install -y php5-xhprof

# OSX (using homebrew)brew install php56-xhprof

# For Windows, use PECL or download a .dll somewhere, or compile for your own

INSTALLATION

Page 36: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

WORDPRESS EXAMPLE// index.php

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

/** Loads the WordPress Environment and Template */require( dirname( __FILE__ ) . '/wp-blog-header.php' );

$xhprof_data = xhprof_disable();

include_once 'xhprof_lib/utils/xhprof_lib.php';include_once 'xhprof_lib/utils/xhprof_runs.php';

$xhprof_runs = new XHProfRuns_Default();

$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

Page 37: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

CALLSTACK

Page 38: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

CALLGRAPH

Page 39: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

CALLGRAPH

Page 40: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

CALLGRAPH

Page 42: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHGUIWeb frontend for profile dataRequires MongoDBShows callstacksShows callgraphsCan compare different runs

Page 43: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHGUI

Page 44: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHGUI

Page 45: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHGUI COMPARE

Page 46: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHGUI COMPARE

Page 47: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHGUI COMPARE DIFFERENCE

Page 48: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

XHGUI CALLSTACK

Page 49: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

LINK0(LINK ZERO)

Page 50: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

LINK0/PROFILERFocused on XHProf and UprofilerReleased v1.0.0 last week!Has multiple persistence layers for storing profiles

MemoryFlysystemZend\Db\AdapterMongoDB (XHGui compatible)

Available on composer/packagistSymfony2 bundle available to hook into kernel eventsFully object-orientated100% code coverage (as far as that's relevant)http://github.com/link0/profiler

Page 51: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

GETTING STARTEDBootstrapping the profiler

$profiler = new \Link0\Profiler\Profiler();$profiler->start();print_r($profiler->stop());

Adding a PersistenceHandler

profiler = new \Link0\Profiler\Profiler($persistenceHandler = new \Link0\Profiler\PersistenceHandler\MemoryHandler();$ $persistenceHandler);

Flysystem example

filesystem = new \Link0\Profiler\Filesystem(persistenceHandler = new \Link0\Profiler\PersistenceHandler\FilesystemHandlerprofiler = new \Link0\Profiler\Profiler(

$filesystemAdapter = new \League\Flysystem\Adapter\Local('/tmp/profiler');$ $filesystemAdapter);$$ $persistenceHandler);

Page 52: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

DEMO TIME!OH NOES! IN A TALK?

Page 53: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

FUTURE?*EXCITING SOUNDS*

Page 54: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

SOME IDEASEnable on production with sampling (1 in 1000 reqs)Aggregate all profiles to centralized machine/clusterIntegrate into continuous deployment

Run profiling on acceptance environmentAlert when compared differences surpass threshold

Codeception integrationFind business use-cases that are slowMake a case for refactoring to the businessFocus on the customers emulated experience

Page 55: Profiling PHP - PHPAmersfoort Meetup 2015-03-10

QUESTIONS? I <3 FEEDBACKJoind.in: GitHub: Twitter: IRC: link0 on Freenode

https://joind.in/talk/view/13685http://github.com/dennisdegreef@dennisdegreef

SLIDES ARE ALSO ON JOIND.IN