BTV PHP - Building Fast Websites

2,064 views

Published on

I gave this talk on 11/17/11 at the Burlington Vermont PHP group. The talk is about how to monitor and improve server side performance.

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,064
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
22
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

BTV PHP - Building Fast Websites

  1. 1. November 17, 2011Building Faster Websites: Optimizing the Server Jonathan Klein jklein@wayfair.com @jonathanklein
  2. 2. Agenda Who Am I? Why Server Side Performance Matters Measuring Performance Speeding up the Server Improving the Database Load Testing
  3. 3. Who is this Guy?• Senior Software Engineer/Performance Guy at Wayfair• Organizer - Boston Web Performance Meetup Group• Organizer - #WPOChat (monthly Twitter chat)• Wayfair Stats: 1. ~1400 requests/sec for static content 2. ~400 requests/sec for dynamic content 3. ~10 million unique visitors per month 4. On a typical Monday we serve 75,000,000 static files 3
  4. 4. Wayfair Stack Changes• Windows Server  FreeBSD• IIS  Lighttpd• Classic ASP  PHP• But we are still on MSSQL (more on that later)• http://engineering.wayfair.com 4
  5. 5. Why Server Side Performance?
  6. 6. Doesn’t 80% happen on the client?• Yes, but not if your server is slow• Users staring at a blank page• No upper limit• HUGE spikes• Plus, bots crawl fast sites more 7
  7. 7. Time to first byte Time To First Byte (TTFB) Matters 8
  8. 8. How Do We Measure It?
  9. 9. Server Side MonitoringLots of Options:• Paid: 1. Coradiant 2. dynaTrace 3. Correlsense • http://www.real-user-monitoring.com/ - Free Version• Free: 1. StatsD/Graphite 2. Access Logs 3. Nagios 4. Ganglia 5. Hosted WebPagetest 6. Selenium/dynaTrace Ajax Edition 10
  10. 10. Or Something Simple…<?php$start = microtime(true);…script content…$end = microtime(true);do_stuff(Description, $end - $start);?> 11
  11. 11. do_stuff()?• do_stuff() can do one of: 1. Log to a database (not ideal) 2. Write to a text file (eww) 3. Make a StatsD call over UDP (good) - http://codeascraft.etsy.com/2011/02/15/measure- anything-measure-everything/ 4. Choose your own adventure 12
  12. 12. Averages can be misleadingBetter to look at percentiles 14
  13. 13. What Does a Scalability Problem Look Like?
  14. 14. This: 19
  15. 15. Or maybe this! 20
  16. 16. Much better! 21
  17. 17. So How Do We Do It?
  18. 18. What can you do?• Start with the Database• Run a database trace 1. Filter: Queries > 50ms 2. Filter: Reads > 1000 3. Start with the worst ones and optimize 23
  19. 19. What does “Optimize” mean?• Look at execution plan 1. Remove calls to remote servers 24
  20. 20. Database Optimizations• Reduce Joins• Select * from  Select Foo, Bar, Baz from…• Minimize/consolidate subqueries• Add indexes where needed 1. We added one index: Procedure dropped from 3.5 sec & 4500 reads to .06 sec and 130 reads!• Be careful with where clauses (don’t calculate stuff in them) 25
  21. 21. ExampleSELECT id, name, salaryFROM employeeWHERE salary < 25000;NOTSELECT id, name, salaryFROM employeeWHERE salary + 10000 < 35000; 26
  22. 22. ExampleSELECT id, name, salaryFROM employeeWHERE salary < 25000;NOTSELECT id, name, salaryFROM employeeWHERE salary + 10000 < 35000; 27
  23. 23. Not many hard and fast rules…• Try something, look at the plan• Try something else…look at how the plan changes• This is your friend: 28
  24. 24. The Fastest DB Query is the One You Don’t Make
  25. 25. Memcached• Caching layer between database and webserver• Can hold PHP objects and arrays 30
  26. 26. Memcached$m = new Memcached();$m->pconnect(‘1.2.3.4, 11211);$m->set(‘foo’, $bar, 600);$baz = $m->get(‘foo’); 31
  27. 27. Install APC• APC – Alternative PHP Cache 1. Opcode Cache 2. User Cache 3. Awesome! 32
  28. 28. Opcode Cache 33
  29. 29. User Cache<?php$bar = BAR;apc_store(foo, $bar);var_dump(apc_fetch(foo));?>Outputs…string(3) "BAR" 34
  30. 30. PHP Code Optimizations
  31. 31. PHP Optimizations• Set the max loop value before the loop: $max = count($rows); for ($i = 0; $i < $max; $i++) { echo $i; }• require_once() is slow• Minimize use of define()• Yes, single quotes are slightly faster than double quotes, but… 36
  32. 32. PHP Optimizations have limited value• Could go on and on… 1.http://www.wmtips.com/php/tips- optimizing-php-code.htm• Minimal returns• Find the hotspots in your application and fix them 37
  33. 33. Example…• Homepage takes 5 seconds to load• Optimize PHP… 1. Reduce PHP execution time by 50%!• But wait! PHP execution was only taking 100ms 1. Saves you 50ms in load time 2. 1% of total page load 38
  34. 34. If you really need to make your code faster…• HipHop for PHP• Built by Facebook and Open Sourced• Compiles PHP into C++• Currently supports PHP 5.2• http://developers.facebook.com/blog/post/358/• https://github.com/facebook/hiphop-php 39
  35. 35. Webserver Considerations
  36. 36. Do it right• Pick the right one 1. Lighttpd/Nginx instead of Apache 2. Designed to solve the C10K problem• Lighttpd Used By: 1. Youtube 2. Wikipedia 3. Meebo 41
  37. 37. Benefits of Lighttpd/Nginx• Event driven model: “Unlike traditional servers, Nginx doesnt rely on threads to handle requests. Instead it uses a much more scalable event- driven (asynchronous) architecture. This architecture uses small, but more importantly, predictable amounts of memory under load.” - http://wiki.nginx.org/• FastCGI + spawn-fcgi 1. PHP Process Management 2. Many child processes – scale out application tier. 42
  38. 38. If you MUST use Apache• mod_deflate 1. Gzips content for faster transfer times• mod_pagespeed 1. Automatic performance improvements• KeepAlives on 1. Server won’t create a new connection for every resource 43
  39. 39. Load Testing
  40. 40. JMeter• Open Source• Generate load via a GUI or command line• Can watch req/s peak out• Easy to use (just make sure you set the correct path to Java on your computer). 45
  41. 41. JMeter 46
  42. 42. JMeter 48
  43. 43. JMeter• Watch your User Agent• Be careful hitting sites you don’t own• You might tap out your local box/network before killing the server 49
  44. 44. Conclusion• Know and watch your site• More monitoring is better• Understand what is behind the scenes – look at the full stack• Load test BEFORE things go to production – figure out when they will fall over 50
  45. 45. Questions? We’re Hiring! www.wayfair.com/careers Get In Touch:www.meetup.com/Web-Performance-Boston/ jklein@wayfair.com @jonathanklein 51

×