Your SlideShare is downloading. ×
Profiling PHP with Xdebug / Webgrind
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.


Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Profiling PHP with Xdebug / Webgrind


Published on

Presentation given at the May 2009 meeting. …

Presentation given at the May 2009 meeting.
Introduction to using Xdebug and Webgrind to profile PHP applications

Published in: Technology

  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. Profiling PHP Applications Sam Keen @samkeen 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. 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
  • 5. Profiling - should be done during development - allows you to spot inefficiencies and bottlenecks in code rather than your clients Photo:
  • 6. 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.
  • 7. Many Aspects of Profiling Code Db System Network CPU/RAM
  • 8. First steps for Db and System/Network Query logs: slow and index-less top, vmstat, dstat $ dstat @see
  • 9. 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”
  • 10. Web Server Profiling Tools Apache Bench HTTP_load Siege Web Server
  • 11. HTTP_Load Install wget tar -xzf http_load-12mar2006.tar.gz cd http_load-12mar2006/ make sudo make install @see eZ Publish article for coverage of the others:
  • 12. 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
  • 13. 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
  • 14. 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
  • 15. Xdebug Install @see Install with pecl sudo pecl install xdebug Add this line to your php.ini zend_extension=quot;/usr/local/php/modules/xdebug.soquot;
  • 16. Xdebug Configure ;##### START XDEBUG SECTION ######; zend_extension=/usr/lib/php/extensions/ 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 ######;
  • 17. 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
  • 18. 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
  • 19. Examine the output • Traditionally: Kcachegrind • Install on Linux, or Windows: easy • Install on OSX: #&^!*&^!! • The Kcachegrind UI...
  • 20. And the Secret Ingredient
  • 21. Webgrind Webgrind is an Xdebug profiling web frontend in PHP5 @see Simple Installation on any platform that can run WebServer/PHP5 stack and the UI...
  • 22. 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
  • 23. Extend UI UI is HTML and js (jquery) so trivial to make changes
  • 24. The victim
  • 25. 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)
  • 26. Explore the output using WebGrind
  • 27. Lots of MDB2 at the top of the list
  • 28. Static Candidate (no code)
  • 29. 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>') ); });
  • 30. 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
  • 31. 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%
  • 32. Resources Profiling articles form eZ Publish * * ez_publish_performance_optimization_part_2_of_3_identifying_trouble_spots_by_debugging * ez_publish_performance_optimization_part_3_of_3_practical_cache_and_template_solutions Profiling articles form IBM * * * Excellent Open Source PHP IDE which utilizes Xdebug (step through, profile, code coverage) * Profiling Presentation from core PHP folks *