SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

La actualidad más candente (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 a 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 a 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
 

Último

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Último (20)

🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
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
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
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...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
[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
 

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