Profiling PHP with Xdebug / Webgrind
-
Upload
sam-keen -
Category
Technology
-
view
64.521 -
download
1
description
Transcript of Profiling PHP with Xdebug / Webgrind
Profiling PHP Applications
Sam [email protected]: May 2009 Meeting
Summary• Huge topic, so we will settle on one aspect
of it
• Concentrate on the Code aspect of profiling
• We’ll concern ourselves more with ‘tools to get started’ rather than ‘Preferment code best practices’ (see last slide for that)
• Will introduce a ‘secret ingredient’ that makes profiling super delicious!
The Scenario
You build a killer PHP site
Works great out of the gate but then slowly degrades as more people use it until...
How do we avoid this
Or at least lesson the chance of it happening or at a minimum reduce the amount of “material” hitting the fan
when it inevitably occurs
Profiling
- should be done during development
- allows you to spot inefficiencies and bottlenecks in code rather than your clients
Photo: http://www.flickr.com/photos/chermida/2913511936/
Facilitating Profiling During Development
• Make it as easy as possible to set up and use
• This way it can become part of your daily (OK, maybe weekly) routine.
Many Aspects of Profiling
Code Db
SystemCPU/RAM
Network
First steps for Db and System/Network
Query logs: slow and index-less
top, vmstat, dstat$ dstat
@see http://dag.wieers.com/home-made/dstat
Profiling Code-Baseline-
Before you make changes, you need to get some sort of baseline of the performance of the application
Otherwise, you cannot measure improvement
So start with profiling the site as a “whole”
Web Server Profiling Tools
Web Server
Apache BenchHTTP_loadSiege
HTTP_Load
Installwget http://www.acme.com/software/http_load/http_load-12mar2006.tar.gztar -xzf http_load-12mar2006.tar.gzcd http_load-12mar2006/makesudo make install
@see eZ Publish article for coverage of the others: http://bit.ly/sKYhahttp://ez.no/developer/articles/ez_publish_performance_optimization_part_1_of_3_introduction_and_benchmarking
HTTP_LoadAfter creating for URL file (simple txt file with list o URLs (one per line) that will be randomly chosen from by http_load)
The run something like: (runs for ten seconds, with five parallel requests)
$ http_load -parallel 5 -seconds 10 urls.txt
HTTP_Load
Output$ http_load -parallel 5 -seconds 10 urls.txt90 fetches, 5 max parallel, 805770 bytes, in 10 seconds8953 mean bytes/connection8.99999 fetches/sec, 80576.9 bytes/secmsecs/connect: 241.704 mean, 958.418 max, 73.01 minmsecs/first-response: 252.075 mean, 1067.61 max, 83.833 minHTTP response codes: code 200 -- 90
Xdebug ProfilingFar more than just a profiler: * stack traces and function traces in error messages with: o full parameter display for user defined functions o function name, file name and line indications o support for member functions * memory allocation * protection for infinite recursions * profiling information for PHP scripts * code coverage analysis * debug your scripts interactively with a debug client
@see xdebug.org
Xdebug Install@see http://www.xdebug.org/docs/install
Install with peclsudo pecl install xdebug
Add this line to your php.inizend_extension="/usr/local/php/modules/xdebug.so"
Xdebug Configure;##### START XDEBUG SECTION ######;zend_extension=/usr/lib/php/extensions/xdebug.soxdebug.remote_enable=onxdebug.remote_handle=dbgpxdebug.remote_host=localhostxdebug.remote_port=9000xdebug.profiler_enable = 1xdebug.profiler_output_name = cachegrind.out.%t-%sxdebug.profiler_output_dir="/Users/sam/grind-out";##### END XDEBUG SECTION ######;
http://www.xdebug.org/docs/all_settings#profiler_output_name
Xdebug Local Setupphp.ini@ -> /usr/local/php5/lib/php.ini.zenddebugphp.ini.xdebugphp.ini.xdebug.profilephp.ini.zenddebug
~/bin (in my PATH)-rwxr-xr-x@ php-xdebug*-rwxr-xr-x@ php-xdebug-profile*-rwxr-xr-x@ php-zenddebug*
Contents of php-xdebug-profile#!/bin/shrm /usr/local/php5/lib/php.iniln -s /usr/local/php5/lib/php.ini.xdebug.profile /usr/local/php5/lib/php.inisudo apachectl restart
$ php-xdebug-profile Now running php with Xdebug PROFILE: hurray for open source
Profiling a specific page
With Xdebug profiling enabled
Simply request the web page in question using browser
Look in your xdebug.profiler_output_dir for output
cachegrind.out.1242152836-_Library_WebServer_Documents_persist_better_see_signups_php
Examine the output
• Traditionally: Kcachegrind
• Install on Linux, or Windows: easy
• Install on OSX: #&^!*&^!!
• The Kcachegrind UI...
And the Secret Ingredient
Webgrind
Webgrind is an Xdebug profiling web frontend in PHP5
@see http://code.google.com/p/webgrind/
Simple Installation on any platform that can run WebServer/PHP5 stack
and the UI...
Webgrind InstallInstall (Typical WebApp install: put the folder in your webroot and edit a config file)
1. Download to your web root
* edit config.php* be sure $storageDir is writable by web server
Extend UI
UI is HTML and js (jquery) so trivial to make changes
The victimhttp://local.persist.com/could_improve/
BaseLine$ http_load -parallel 5 -seconds 10 urls_could_improve.txt 1928 fetches, 5 max parallel, 1.92362e+07 bytes, in 10.0002 seconds9977.27 mean bytes/connection192.796 fetches/sec, 1.92358e+06 bytes/secmsecs/connect: 0.456549 mean, 9.326 max, 0.055 minmsecs/first-response: 21.7894 mean, 599.711 max, 0.862 minHTTP response codes: code 200 -- 1928
*you would also be watching CPU and RAM with something like dstat during this test to determine if we are CPU and/or memory bound (see resources on last slide)
Explore the output using WebGrind
Lots of MDB2 at the top of the list
Static Candidate (no code)
Push Work to Client
Push all this work to the client
$('dd.note').each(function(i){$(this).html($(this).text().replace(/(e\b)/ig, '<span style="color:red;font-weight:800;">$1</span>'));
});
Make Adjustments• Switch to PDO
• typically lean towards php built-ins that abstract a great deal of functionality (rather than libs built in php).
• Use static (.htm) pages if we don’t need DB
• output buffer caching another alternative
• Use js to ‘markup’ content
• fastest way a web server can do work is not to do it
changes took about 40 min of work
Re-profile
$ http_load -parallel 5 -seconds 10 urls_better.txt 5008 fetches, 5 max parallel, 3.40076e+07 bytes, in 10.0003 seconds6790.65 mean bytes/connection500.785 fetches/sec, 3.40066e+06 bytes/secmsecs/connect: 0.401153 mean, 9.334 max, 0.055 minmsecs/first-response: 8.39298 mean, 259.332 max, 0.141 minHTTP response codes: code 200 -- 5008
Improvementfetches/sec: ~250%first-response: ~275%
ResourcesProfiling articles form eZ Publish * http://ez.no/developer/articles/ez_publish_performance_optimization_part_1_of_3_introduction_and_benchmarking * http://ez.no/developer/articles/ez_publish_performance_optimization_part_2_of_3_identifying_trouble_spots_by_debugging * http://ez.no/developer/articles/ez_publish_performance_optimization_part_3_of_3_practical_cache_and_template_solutions
Profiling articles form IBM * http://www.ibm.com/developerworks/linux/library/l-tune-lamp-1/ * http://www.ibm.com/developerworks/linux/library/l-tune-lamp-2.html * http://www.ibm.com/developerworks/library/l-tune-lamp-3.html
Excellent Open Source PHP IDE which utilizes Xdebug (step through, profile, code coverage) * http://www.netbeans.org/features/php/index.html
Profiling Presentation from core PHP folks * http://talks.php.net/index.php/Performance