SlideShare a Scribd company logo
1 of 35
Download to read offline
Profiling PHP
             Applications


Sam Keen
@samkeen
pdxphp.org: 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

   System   Network
  CPU/RAM
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
                   Apache Bench
                   HTTP_load
                   Siege




Web Server
HTTP_Load
Install
wget http://www.acme.com/software/http_load/http_load-12mar2006.tar.gz
tar -xzf http_load-12mar2006.tar.gz
cd http_load-12mar2006/
make
sudo make install




@see eZ Publish article for coverage of the others: http://bit.ly/sKYha
http://ez.no/developer/articles/ez_publish_performance_optimization_part_1_of_3_introduction_and_benchmarking
HTTP_Load
After 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.txt
90 fetches, 5 max parallel, 805770 bytes, in 10 seconds
8953 mean bytes/connection
8.99999 fetches/sec, 80576.9 bytes/sec
msecs/connect: 241.704 mean, 958.418 max, 73.01 min
msecs/first-response: 252.075 mean, 1067.61 max, 83.833 min
HTTP response codes:
  code 200 -- 90
Xdebug Profiling
Far 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 pecl
sudo pecl install xdebug


Add this line to your php.ini
zend_extension=quot;/usr/local/php/modules/xdebug.soquot;
Xdebug Configure
;##### START XDEBUG SECTION ######;
zend_extension=/usr/lib/php/extensions/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handle=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.profiler_enable = 1
xdebug.profiler_output_name = cachegrind.out.%t-%s
xdebug.profiler_output_dir=quot;/Users/sam/grind-outquot;
;##### END XDEBUG SECTION ######;



http://www.xdebug.org/docs/all_settings#profiler_output_name
Xdebug Local Setup
php.ini@ -> /usr/local/php5/lib/php.ini.zenddebug
php.ini.xdebug
php.ini.xdebug.profile
php.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/sh
rm /usr/local/php5/lib/php.ini
ln -s /usr/local/php5/lib/php.ini.xdebug.profile /usr/local/php5/lib/php.ini
sudo 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 Install
Install (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 victim
http://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 seconds
9977.27 mean bytes/connection
192.796 fetches/sec, 1.92358e+06 bytes/sec
msecs/connect: 0.456549 mean, 9.326 max, 0.055 min
msecs/first-response: 21.7894 mean, 599.711 max, 0.862 min
HTTP 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(/(eb)/ig,
        '<span style=quot;color:red;font-weight:800;quot;>$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 seconds
6790.65 mean bytes/connection
500.785 fetches/sec, 3.40066e+06 bytes/sec
msecs/connect: 0.401153 mean, 9.334 max, 0.055 min
msecs/first-response: 8.39298 mean, 259.332 max, 0.141 min
HTTP response codes:
  code 200 -- 5008

Improvement
fetches/sec: ~250%
first-response: ~275%
Resources
Profiling 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

More Related Content

What's hot

What's hot (20)

Nahlédněte za oponu VersionPressu
Nahlédněte za oponu VersionPressuNahlédněte za oponu VersionPressu
Nahlédněte za oponu VersionPressu
 
X-Debug in Php Storm
X-Debug in Php StormX-Debug in Php Storm
X-Debug in Php Storm
 
Autotests introduction - Codeception + PHP Basics
Autotests introduction - Codeception + PHP BasicsAutotests introduction - Codeception + PHP Basics
Autotests introduction - Codeception + PHP Basics
 
Martin Aspeli Extending And Customising Plone 3
Martin Aspeli   Extending And Customising Plone 3Martin Aspeli   Extending And Customising Plone 3
Martin Aspeli Extending And Customising Plone 3
 
Quick flask an intro to flask
Quick flask   an intro to flaskQuick flask   an intro to flask
Quick flask an intro to flask
 
Xdebug - Your first, last, and best option for troubleshooting PHP code
Xdebug - Your first, last, and best option for troubleshooting PHP codeXdebug - Your first, last, and best option for troubleshooting PHP code
Xdebug - Your first, last, and best option for troubleshooting PHP code
 
WebPagetest Power Users - Velocity 2014
WebPagetest Power Users - Velocity 2014WebPagetest Power Users - Velocity 2014
WebPagetest Power Users - Velocity 2014
 
Developers, Be a Bada$$ with WP-CLI
Developers, Be a Bada$$ with WP-CLIDevelopers, Be a Bada$$ with WP-CLI
Developers, Be a Bada$$ with WP-CLI
 
Simple webapps with nginx, uwsgi emperor and bottle
Simple webapps with nginx, uwsgi emperor and bottleSimple webapps with nginx, uwsgi emperor and bottle
Simple webapps with nginx, uwsgi emperor and bottle
 
AppengineJS
AppengineJSAppengineJS
AppengineJS
 
WebSockets Everywhere: the Future Transport Protocol for Everything (Almost)
WebSockets Everywhere: the Future Transport Protocol for Everything (Almost)WebSockets Everywhere: the Future Transport Protocol for Everything (Almost)
WebSockets Everywhere: the Future Transport Protocol for Everything (Almost)
 
WebPagetest - Good, Bad & Ugly
WebPagetest - Good, Bad & UglyWebPagetest - Good, Bad & Ugly
WebPagetest - Good, Bad & Ugly
 
Odoo development workflow with pip and virtualenv
Odoo development workflow with pip and virtualenvOdoo development workflow with pip and virtualenv
Odoo development workflow with pip and virtualenv
 
Philipp Von Weitershausen Plone Age Mammoths, Sabers And Caveen Cant The...
Philipp Von Weitershausen   Plone Age  Mammoths, Sabers And Caveen   Cant The...Philipp Von Weitershausen   Plone Age  Mammoths, Sabers And Caveen   Cant The...
Philipp Von Weitershausen Plone Age Mammoths, Sabers And Caveen Cant The...
 
20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part I20151229 wnmp & phalcon micro app - part I
20151229 wnmp & phalcon micro app - part I
 
SDPHP - Percona Toolkit (It's Basically Magic)
SDPHP - Percona Toolkit (It's Basically Magic)SDPHP - Percona Toolkit (It's Basically Magic)
SDPHP - Percona Toolkit (It's Basically Magic)
 
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
Leverage HTTP to deliver cacheable websites - Codemotion Rome 2018
 
Leverage HTTP to deliver cacheable websites - Thijs Feryn - Codemotion Rome 2018
Leverage HTTP to deliver cacheable websites - Thijs Feryn - Codemotion Rome 2018Leverage HTTP to deliver cacheable websites - Thijs Feryn - Codemotion Rome 2018
Leverage HTTP to deliver cacheable websites - Thijs Feryn - Codemotion Rome 2018
 
Zenoss: Buildout
Zenoss: BuildoutZenoss: Buildout
Zenoss: Buildout
 
Release with confidence
Release with confidenceRelease with confidence
Release with confidence
 

Similar to Profiling PHP with Xdebug / Webgrind

Porting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsPorting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability Systems
Marcelo Pinheiro
 
Site Performance - From Pinto to Ferrari
Site Performance - From Pinto to FerrariSite Performance - From Pinto to Ferrari
Site Performance - From Pinto to Ferrari
Joseph Scott
 

Similar to Profiling PHP with Xdebug / Webgrind (20)

Magento Performance Optimization 101
Magento Performance Optimization 101Magento Performance Optimization 101
Magento Performance Optimization 101
 
ApacheConNA 2015: What's new in Apache httpd 2.4
ApacheConNA 2015: What's new in Apache httpd 2.4ApacheConNA 2015: What's new in Apache httpd 2.4
ApacheConNA 2015: What's new in Apache httpd 2.4
 
High Performance Web Sites
High Performance Web SitesHigh Performance Web Sites
High Performance Web Sites
 
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven PignataroJoomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
Web Performance, Scalability, and Testing Techniques - Boston PHP Meetup
Web Performance, Scalability, and Testing Techniques - Boston PHP MeetupWeb Performance, Scalability, and Testing Techniques - Boston PHP Meetup
Web Performance, Scalability, and Testing Techniques - Boston PHP Meetup
 
What's New and Newer in Apache httpd-24
What's New and Newer in Apache httpd-24What's New and Newer in Apache httpd-24
What's New and Newer in Apache httpd-24
 
Introduction to Magento Optimization
Introduction to Magento OptimizationIntroduction to Magento Optimization
Introduction to Magento Optimization
 
Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012
 
Heavy Web Optimization: Backend
Heavy Web Optimization: BackendHeavy Web Optimization: Backend
Heavy Web Optimization: Backend
 
Lonestar php scalingmagento
Lonestar php scalingmagentoLonestar php scalingmagento
Lonestar php scalingmagento
 
Why we choose Symfony2
Why we choose Symfony2Why we choose Symfony2
Why we choose Symfony2
 
SaltConf14 - Ben Cane - Using SaltStack in High Availability Environments
SaltConf14 - Ben Cane - Using SaltStack in High Availability EnvironmentsSaltConf14 - Ben Cane - Using SaltStack in High Availability Environments
SaltConf14 - Ben Cane - Using SaltStack in High Availability Environments
 
Porting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability SystemsPorting Rails Apps to High Availability Systems
Porting Rails Apps to High Availability Systems
 
Meetup Performance
Meetup PerformanceMeetup Performance
Meetup Performance
 
Meetup Performance
Meetup PerformanceMeetup Performance
Meetup Performance
 
Scaling PHP apps
Scaling PHP appsScaling PHP apps
Scaling PHP apps
 
Site Performance - From Pinto to Ferrari
Site Performance - From Pinto to FerrariSite Performance - From Pinto to Ferrari
Site Performance - From Pinto to Ferrari
 
Joomla! Performance on Steroids
Joomla! Performance on SteroidsJoomla! Performance on Steroids
Joomla! Performance on Steroids
 
Web Front End Performance
Web Front End PerformanceWeb Front End Performance
Web Front End Performance
 

Recently uploaded

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Recently uploaded (20)

Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Profiling PHP with Xdebug / Webgrind

  • 1. Profiling PHP Applications Sam Keen @samkeen pdxphp.org: May 2009 Meeting
  • 2. 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!
  • 3. The Scenario You build a killer PHP site Works great out of the gate but then slowly degrades as more people use it until...
  • 4.
  • 5. 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
  • 6. 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/
  • 7. 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.
  • 8. Many Aspects of Profiling Code Db System Network CPU/RAM
  • 9. 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
  • 10. 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”
  • 11. Web Server Profiling Tools Apache Bench HTTP_load Siege Web Server
  • 12. HTTP_Load Install wget http://www.acme.com/software/http_load/http_load-12mar2006.tar.gz tar -xzf http_load-12mar2006.tar.gz cd http_load-12mar2006/ make sudo make install @see eZ Publish article for coverage of the others: http://bit.ly/sKYha http://ez.no/developer/articles/ez_publish_performance_optimization_part_1_of_3_introduction_and_benchmarking
  • 13. HTTP_Load After 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
  • 14. HTTP_Load Output $ http_load -parallel 5 -seconds 10 urls.txt 90 fetches, 5 max parallel, 805770 bytes, in 10 seconds 8953 mean bytes/connection 8.99999 fetches/sec, 80576.9 bytes/sec msecs/connect: 241.704 mean, 958.418 max, 73.01 min msecs/first-response: 252.075 mean, 1067.61 max, 83.833 min HTTP response codes: code 200 -- 90
  • 15. Xdebug Profiling Far 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
  • 16. Xdebug Install @see http://www.xdebug.org/docs/install Install with pecl sudo pecl install xdebug Add this line to your php.ini zend_extension=quot;/usr/local/php/modules/xdebug.soquot;
  • 17. Xdebug Configure ;##### START XDEBUG SECTION ######; zend_extension=/usr/lib/php/extensions/xdebug.so xdebug.remote_enable=on xdebug.remote_handle=dbgp xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.profiler_enable = 1 xdebug.profiler_output_name = cachegrind.out.%t-%s xdebug.profiler_output_dir=quot;/Users/sam/grind-outquot; ;##### END XDEBUG SECTION ######; http://www.xdebug.org/docs/all_settings#profiler_output_name
  • 18. Xdebug Local Setup php.ini@ -> /usr/local/php5/lib/php.ini.zenddebug php.ini.xdebug php.ini.xdebug.profile php.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/sh rm /usr/local/php5/lib/php.ini ln -s /usr/local/php5/lib/php.ini.xdebug.profile /usr/local/php5/lib/php.ini sudo apachectl restart $ php-xdebug-profile Now running php with Xdebug PROFILE: hurray for open source
  • 19. 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
  • 20. Examine the output • Traditionally: Kcachegrind • Install on Linux, or Windows: easy • Install on OSX: #&^!*&^!! • The Kcachegrind UI...
  • 21.
  • 22. And the Secret Ingredient
  • 23. 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...
  • 24.
  • 25. Webgrind Install Install (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
  • 26. Extend UI UI is HTML and js (jquery) so trivial to make changes
  • 28. BaseLine $ http_load -parallel 5 -seconds 10 urls_could_improve.txt 1928 fetches, 5 max parallel, 1.92362e+07 bytes, in 10.0002 seconds 9977.27 mean bytes/connection 192.796 fetches/sec, 1.92358e+06 bytes/sec msecs/connect: 0.456549 mean, 9.326 max, 0.055 min msecs/first-response: 21.7894 mean, 599.711 max, 0.862 min HTTP 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)
  • 29. Explore the output using WebGrind
  • 30. Lots of MDB2 at the top of the list
  • 31. Static Candidate (no code)
  • 32. Push Work to Client Push all this work to the client $('dd.note').each(function(i){ $(this).html($(this).text().replace(/(eb)/ig, '<span style=quot;color:red;font-weight:800;quot;>$1</span>') ); });
  • 33. 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
  • 34. Re-profile $ http_load -parallel 5 -seconds 10 urls_better.txt 5008 fetches, 5 max parallel, 3.40076e+07 bytes, in 10.0003 seconds 6790.65 mean bytes/connection 500.785 fetches/sec, 3.40066e+06 bytes/sec msecs/connect: 0.401153 mean, 9.334 max, 0.055 min msecs/first-response: 8.39298 mean, 259.332 max, 0.141 min HTTP response codes: code 200 -- 5008 Improvement fetches/sec: ~250% first-response: ~275%
  • 35. Resources Profiling 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