Slide 1

Slide 1 text

High Performance PHP PHPDay 2013 Jonathan Klein @jonathanklein Saturday, May 18, 13

Slide 2

Slide 2 text

Slides, Links: jkle.in/phpday Saturday, May 18, 13

Slide 3

Slide 3 text

Some Etsy Stats • 1.4 billion page views/month • Almost $1B in sales last year • Over 1M lines of PHP Saturday, May 18, 13

Slide 4

Slide 4 text

Agenda • Why Performance Matters • Profiling PHP Applications • Code Level Optimizations • Big Wins • Load Testing • Takeaways Saturday, May 18, 13

Slide 5

Slide 5 text

The Value of Performance Saturday, May 18, 13

Slide 6

Slide 6 text

Saturday, May 18, 13

Slide 7

Slide 7 text

Real World Examples http://www.phpied.com/the-performance-business-pitch/ Saturday, May 18, 13

Slide 8

Slide 8 text

Real World Examples • Firefox: -2.2 seconds = 15.4% more downloads http://www.phpied.com/the-performance-business-pitch/ Saturday, May 18, 13

Slide 9

Slide 9 text

Real World Examples • Firefox: -2.2 seconds = 15.4% more downloads • Shopzilla: -5 seconds = 7-12% increase in revenue http://www.phpied.com/the-performance-business-pitch/ Saturday, May 18, 13

Slide 10

Slide 10 text

Real World Examples • Firefox: -2.2 seconds = 15.4% more downloads • Shopzilla: -5 seconds = 7-12% increase in revenue • Google: +400ms = 0.76% fewer searches http://www.phpied.com/the-performance-business-pitch/ Saturday, May 18, 13

Slide 11

Slide 11 text

Real World Examples • Firefox: -2.2 seconds = 15.4% more downloads • Shopzilla: -5 seconds = 7-12% increase in revenue • Google: +400ms = 0.76% fewer searches • Amazon: +100ms = -1% revenue http://www.phpied.com/the-performance-business-pitch/ Saturday, May 18, 13

Slide 12

Slide 12 text

~80% of page load time takes place on the client Saturday, May 18, 13

Slide 13

Slide 13 text

...if your backend is fast Saturday, May 18, 13

Slide 14

Slide 14 text

A fast page load is 2 seconds This means you have 400ms to get that HTML off your server Saturday, May 18, 13

Slide 15

Slide 15 text

But network time could be ~100ms This means you have 400ms 300ms to build the page Saturday, May 18, 13

Slide 16

Slide 16 text

< 100ms feels instant < 1 sec feels like flow < 10 sec to keep user’s attention http://www.nngroup.com/articles/response-times-3-important-limits/ Saturday, May 18, 13

Slide 17

Slide 17 text

< 100ms feels instant < 1 sec feels like flow < 10 sec to keep user’s attention Full Page Load – 2 Seconds http://www.nngroup.com/articles/response-times-3-important-limits/ Saturday, May 18, 13

Slide 18

Slide 18 text

< 100ms feels instant < 1 sec feels like flow < 10 sec to keep user’s attention Full Page Load – 2 Seconds Base HTML – 400ms http://www.nngroup.com/articles/response-times-3-important-limits/ Saturday, May 18, 13

Slide 19

Slide 19 text

< 100ms feels instant < 1 sec feels like flow < 10 sec to keep user’s attention Full Page Load – 2 Seconds Base HTML – 400ms Server Generation Time – 300ms http://www.nngroup.com/articles/response-times-3-important-limits/ Saturday, May 18, 13

Slide 20

Slide 20 text

Profiling PHP Applications Saturday, May 18, 13

Slide 21

Slide 21 text

Monitoring/Tracing • Paid: • Tracelytics (bought by AppNeta) • AppDynamics (building a PHP solution) • dynaTrace (building a PHP solution) • New Relic (has a free option) • Free: • StatsD/Graphite • xhprof Saturday, May 18, 13

Slide 22

Slide 22 text

Monitoring/Tracing • Paid: • Tracelytics (bought by AppNeta) • AppDynamics (building a PHP solution) • dynaTrace (building a PHP solution) • New Relic • Free: • StatsD/Graphite • xhprof Saturday, May 18, 13

Slide 23

Slide 23 text

StatsD (UDP packets) $start = microtime(true); /* script content */ $end = microtime(true); StatsD::timing('foo.bar', $end - $start); More Info: http://goo.gl/LbDPE Saturday, May 18, 13

Slide 24

Slide 24 text

Graphite • Written by Orbitz • Real-time graphing engine for StatsD data (among other things) • http://graphite.wikidot.com/ • Architecture: http://www.aosabook.org/en/ graphite.html Saturday, May 18, 13

Slide 25

Slide 25 text

Etsy Conversations PHP Time Execution Count Saturday, May 18, 13

Slide 26

Slide 26 text

Search Page PHP Time (95th Percentile) Saturday, May 18, 13

Slide 27

Slide 27 text

Search Page Execution Count Saturday, May 18, 13

Slide 28

Slide 28 text

Stacked Search Timers Saturday, May 18, 13

Slide 29

Slide 29 text

xhprof • PHP Extension (need to install) • http://pecl.php.net/package/xhprof • Code level tracing • Significant overhead, use in DEV only! • Add ?xhprof=1 to URL • Results in browser Saturday, May 18, 13

Slide 30

Slide 30 text

Saturday, May 18, 13

Slide 31

Slide 31 text

Saturday, May 18, 13

Slide 32

Slide 32 text

Saturday, May 18, 13

Slide 33

Slide 33 text

Saturday, May 18, 13

Slide 34

Slide 34 text

Saturday, May 18, 13

Slide 35

Slide 35 text

Lesson: Profile Your Code Saturday, May 18, 13

Slide 36

Slide 36 text

Code Level Optimizations Saturday, May 18, 13

Slide 37

Slide 37 text

Writing Efficient PHP Set max value before 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... Saturday, May 18, 13

Slide 38

Slide 38 text

Almost Every Micro-Optimization is Worthless Saturday, May 18, 13

Slide 39

Slide 39 text

http://phpbench.com/ Saturday, May 18, 13

Slide 40

Slide 40 text

http://phpbench.com/ Saturday, May 18, 13

Slide 41

Slide 41 text

http://phpbench.com/ Saturday, May 18, 13

Slide 42

Slide 42 text

Writing Efficient PHP Set max value before loop: $max = count($rows); for ($i = 0; $i < $max; $i++) { echo $i; } Okay, this one is pretty good Saturday, May 18, 13

Slide 43

Slide 43 text

Saturday, May 18, 13

Slide 44

Slide 44 text

Saturday, May 18, 13

Slide 45

Slide 45 text

So Why Even Mention Micro-Optimizations? Saturday, May 18, 13

Slide 46

Slide 46 text

http://code.flickr.net/2009/12/02/flipping-out/ Saturday, May 18, 13

Slide 47

Slide 47 text

strtok() to implode() Saturday, May 18, 13

Slide 48

Slide 48 text

Lesson: Focus on the Big Wins Saturday, May 18, 13

Slide 49

Slide 49 text

“Premature optimization is the root of all evil” - Donald Knuth Saturday, May 18, 13

Slide 50

Slide 50 text

Big Wins Saturday, May 18, 13

Slide 51

Slide 51 text

Upgrade PHP Saturday, May 18, 13

Slide 52

Slide 52 text

Upgrade PHP 5.3 is ~20% faster than 5.2 Saturday, May 18, 13

Slide 53

Slide 53 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 Saturday, May 18, 13

Slide 54

Slide 54 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 Saturday, May 18, 13

Slide 55

Slide 55 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 5.4 is ~20-40% faster than 5.3 Saturday, May 18, 13

Slide 56

Slide 56 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 5.4 is ~20-40% faster than 5.3 http://news.php.net/php.internals/57760 Saturday, May 18, 13

Slide 57

Slide 57 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 5.4 is ~20-40% faster than 5.3 http://news.php.net/php.internals/57760 Saturday, May 18, 13

Slide 58

Slide 58 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 5.4 is ~20-40% faster than 5.3 http://news.php.net/php.internals/57760 Upgrading 5.2 --> 5.4 gives a 45-70% improvement! Saturday, May 18, 13

Slide 59

Slide 59 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 5.4 is ~20-40% faster than 5.3 http://news.php.net/php.internals/57760 Upgrading 5.2 --> 5.4 gives a 45-70% improvement! http://php.net/migration53 Saturday, May 18, 13

Slide 60

Slide 60 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 5.4 is ~20-40% faster than 5.3 http://news.php.net/php.internals/57760 Upgrading 5.2 --> 5.4 gives a 45-70% improvement! http://php.net/migration53 http://php.net/migration54 Saturday, May 18, 13

Slide 61

Slide 61 text

Upgrade PHP 5.3 is ~20% faster than 5.2 http://news.php.net/php.internals/36484 5.4 is ~20-40% faster than 5.3 http://news.php.net/php.internals/57760 Upgrading 5.2 --> 5.4 gives a 45-70% improvement! http://php.net/migration53 http://php.net/migration54 Saturday, May 18, 13

Slide 62

Slide 62 text

PHP 5.4 is 5 Times Faster than PHP 4 http://static.zend.com/topics/White-paper-PHP4-PHP5.pdf Saturday, May 18, 13

Slide 63

Slide 63 text

Etsy’s Upgrade to PHP 5.4 Saturday, May 18, 13

Slide 64

Slide 64 text

Use an Opcode Cache (APC) Saturday, May 18, 13

Slide 65

Slide 65 text

Standard Page Execution Saturday, May 18, 13

Slide 66

Slide 66 text

With An Opcode Cache Saturday, May 18, 13

Slide 67

Slide 67 text

Opcode Cache Vanilla settings: 30-40% improvement Turn off APC Stat: additional ~2x improvement -- Understand what is happening here http://www.slideshare.net/vortexau/improving-php-application-performance-with-apc-presentation Saturday, May 18, 13

Slide 68

Slide 68 text

Cache Data in a Key-Value Store Saturday, May 18, 13

Slide 69

Slide 69 text

APC User Cache -------- Output -------- string(12) "Hello World!" Saturday, May 18, 13

Slide 70

Slide 70 text

APC User Cache Saturday, May 18, 13

Slide 71

Slide 71 text

APC User Cache • Avoid fragmentation - keep utilization under 10% Saturday, May 18, 13

Slide 72

Slide 72 text

APC User Cache • Avoid fragmentation - keep utilization under 10% • Assign 1GB, only fill 100MB Saturday, May 18, 13

Slide 73

Slide 73 text

APC User Cache • Avoid fragmentation - keep utilization under 10% • Assign 1GB, only fill 100MB • Compress objects that are > 10KB before storing Saturday, May 18, 13

Slide 74

Slide 74 text

APC User Cache • Avoid fragmentation - keep utilization under 10% • Assign 1GB, only fill 100MB • Compress objects that are > 10KB before storing • Reduce garbage collection in the source of apc_store() Saturday, May 18, 13

Slide 75

Slide 75 text

APC User Cache • Avoid fragmentation - keep utilization under 10% • Assign 1GB, only fill 100MB • Compress objects that are > 10KB before storing • Reduce garbage collection in the source of apc_store() • Consider CDB Saturday, May 18, 13

Slide 76

Slide 76 text

APC User Cache • Avoid fragmentation - keep utilization under 10% • Assign 1GB, only fill 100MB • Compress objects that are > 10KB before storing • Reduce garbage collection in the source of apc_store() • Consider CDB • http://engineering.wayfair.com/moving-constants-out-of-apc- and-into-cdb/ Saturday, May 18, 13

Slide 77

Slide 77 text

Memcached • Usually a separate server • In-memory key-value store • Extremely simple and fast • http://memcached.org/ Saturday, May 18, 13

Slide 78

Slide 78 text

APC vs. Memcached APC User Cache Memcached Local to the Server Shared Network Resource Good for small objects Large or small objects Good for mostly read workloads Can read and write quickly Only one instance Can be clustered Saturday, May 18, 13

Slide 79

Slide 79 text

Fix All Errors • PHP 5.3: E_ALL | E_STRICT • PHP 5.4: E_ALL • Can also do error_reporting(-1); Saturday, May 18, 13

Slide 80

Slide 80 text

Child Processes 4-6 processes per CPU core. Beyond that just add servers. (Test your app) Saturday, May 18, 13

Slide 81

Slide 81 text

HipHop for PHP • Developed/Open Sourced by Facebook • Now a VM + JIT compilation • 5x improvement in throughput over PHP 5.2 • http://developers.facebook.com/blog/post/2010/02/02/ hiphop-for-php--move-fast/ • https://www.facebook.com/notes/facebook-engineering/ speeding-up-php-based-development-with-hiphop-vm/ 10151170460698920 • https://github.com/facebook/hiphop-php Saturday, May 18, 13

Slide 82

Slide 82 text

Understand Framework Overhead Saturday, May 18, 13

Slide 83

Slide 83 text

http://systemsarchitect.net/performance-benchmark-of-popular-php-frameworks/ Saturday, May 18, 13

Slide 84

Slide 84 text

Saturday, May 18, 13

Slide 85

Slide 85 text

Saturday, May 18, 13

Slide 86

Slide 86 text

Saturday, May 18, 13

Slide 87

Slide 87 text

Symfony is 20x slower than raw PHP Saturday, May 18, 13

Slide 88

Slide 88 text

Load Testing Saturday, May 18, 13

Slide 89

Slide 89 text

JMeter • Open Source • Generate load via a GUI or command line • Can watch req/s degrade with more users • Easy to use Saturday, May 18, 13

Slide 90

Slide 90 text

Saturday, May 18, 13

Slide 91

Slide 91 text

Saturday, May 18, 13

Slide 92

Slide 92 text

Saturday, May 18, 13

Slide 93

Slide 93 text

Saturday, May 18, 13

Slide 94

Slide 94 text

Saturday, May 18, 13

Slide 95

Slide 95 text

Be Careful Saturday, May 18, 13

Slide 96

Slide 96 text

Be Careful • JMeter looks a lot like a DOS attack Saturday, May 18, 13

Slide 97

Slide 97 text

Be Careful • JMeter looks a lot like a DOS attack • Make sure you know what is failing Saturday, May 18, 13

Slide 98

Slide 98 text

Be Careful • JMeter looks a lot like a DOS attack • Make sure you know what is failing • Look at monitoring while test is running Saturday, May 18, 13

Slide 99

Slide 99 text

Be Careful • JMeter looks a lot like a DOS attack • Make sure you know what is failing • Look at monitoring while test is running • Run in Production Saturday, May 18, 13

Slide 100

Slide 100 text

Be Careful • JMeter looks a lot like a DOS attack • Make sure you know what is failing • Look at monitoring while test is running • Run in Production • Run a test, make a change, run it again Saturday, May 18, 13

Slide 101

Slide 101 text

Takeaways Saturday, May 18, 13

Slide 102

Slide 102 text

“How Fast Is Your Site?” Saturday, May 18, 13

Slide 103

Slide 103 text

This is a terrible quesiton Saturday, May 18, 13

Slide 104

Slide 104 text

Why is it terrible? Saturday, May 18, 13

Slide 105

Slide 105 text

Why is it terrible? • Lack of context Saturday, May 18, 13

Slide 106

Slide 106 text

Why is it terrible? • Lack of context • Are we talking about average or a percentile? Saturday, May 18, 13

Slide 107

Slide 107 text

Why is it terrible? • Lack of context • Are we talking about average or a percentile? • Server side time or client? Saturday, May 18, 13

Slide 108

Slide 108 text

Why is it terrible? • Lack of context • Are we talking about average or a percentile? • Server side time or client? • Who is measuring it? Saturday, May 18, 13

Slide 109

Slide 109 text

Why is it terrible? • Lack of context • Are we talking about average or a percentile? • Server side time or client? • Who is measuring it? • When is it being measured? Saturday, May 18, 13

Slide 110

Slide 110 text

Why is it terrible? • Lack of context • Are we talking about average or a percentile? • Server side time or client? • Who is measuring it? • When is it being measured? • Real users or synthetic? Saturday, May 18, 13

Slide 111

Slide 111 text

We still have to answer it Saturday, May 18, 13

Slide 112

Slide 112 text

Pick Tight SLAs “The homepage of our site will load in <300ms at the 80th percentile, measured by sampling 10% of our real users over a 24 hour period every day at 8AM.” Saturday, May 18, 13

Slide 113

Slide 113 text

Pick Tight SLAs “The homepage of our site will load in <300ms at the 80th percentile, measured by sampling 10% of our real users over a 24 hour period every day at 8AM.” Saturday, May 18, 13

Slide 114

Slide 114 text

Things to Remember Saturday, May 18, 13

Slide 115

Slide 115 text

Things to Remember • Measure and monitor your application Saturday, May 18, 13

Slide 116

Slide 116 text

Things to Remember • Measure and monitor your application • Focus on big wins Saturday, May 18, 13

Slide 117

Slide 117 text

Things to Remember • Measure and monitor your application • Focus on big wins • Run the latest (stable) version of PHP Saturday, May 18, 13

Slide 118

Slide 118 text

Things to Remember • Measure and monitor your application • Focus on big wins • Run the latest (stable) version of PHP • Make sure you are using APC correctly Saturday, May 18, 13

Slide 119

Slide 119 text

Things to Remember • Measure and monitor your application • Focus on big wins • Run the latest (stable) version of PHP • Make sure you are using APC correctly • It’s always the database (stay in this room) Saturday, May 18, 13

Slide 120

Slide 120 text

Things to Remember • Measure and monitor your application • Focus on big wins • Run the latest (stable) version of PHP • Make sure you are using APC correctly • It’s always the database (stay in this room) • Caching is your friend Saturday, May 18, 13

Slide 121

Slide 121 text

Things to Remember • Measure and monitor your application • Focus on big wins • Run the latest (stable) version of PHP • Make sure you are using APC correctly • It’s always the database (stay in this room) • Caching is your friend • Know what system resources you depend on Saturday, May 18, 13

Slide 122

Slide 122 text

There is a lot more to talk about Saturday, May 18, 13

Slide 123

Slide 123 text

Get in Touch http://web-performance.meetup.com/ www.etsy.com/careers jonathan@etsy.com @jonathanklein Saturday, May 18, 13