PHPDay 2013 - High Performance PHP

Post on 08-May-2015

9146 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

This is a talk that I gave in Verona, Italy at PHPDay 2013 on May 18th.

Transcript

High Performance PHPPHPDay 2013Jonathan Klein@jonathanklein

Saturday, May 18, 13

Slides, Links:jkle.in/phpday

Saturday, May 18, 13

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

Saturday, May 18, 13

Agenda• Why Performance Matters

• Profiling PHP Applications

• Code Level Optimizations

• Big Wins

• Load Testing

• Takeaways

Saturday, May 18, 13

The Value of Performance

Saturday, May 18, 13

Saturday, May 18, 13

Real World Examples

http://www.phpied.com/the-performance-business-pitch/

Saturday, May 18, 13

Real World Examples• Firefox: -2.2 seconds = 15.4% more downloads

http://www.phpied.com/the-performance-business-pitch/

Saturday, May 18, 13

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

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

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

~80% of page load time takes

place on the client

Saturday, May 18, 13

...if your backend is fast

Saturday, May 18, 13

A fast page load is 2 seconds

This means you have 400ms to get that HTML off your server

Saturday, May 18, 13

But network time could be ~100ms

This means you have 400ms 300ms to build the page

Saturday, May 18, 13

< 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

< 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

< 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

< 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

Profiling PHP Applications

Saturday, May 18, 13

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

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

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

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

Etsy Conversations PHP Time

Execution Count

Saturday, May 18, 13

Search Page PHP Time (95th Percentile)

Saturday, May 18, 13

Search Page Execution Count

Saturday, May 18, 13

Stacked Search Timers

Saturday, May 18, 13

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

Saturday, May 18, 13

Saturday, May 18, 13

Saturday, May 18, 13

Saturday, May 18, 13

Saturday, May 18, 13

Lesson: Profile Your Code

Saturday, May 18, 13

Code Level Optimizations

Saturday, May 18, 13

Writing Efficient PHPSet 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

Almost Every Micro-Optimization is Worthless

Saturday, May 18, 13

http://phpbench.com/

Saturday, May 18, 13

http://phpbench.com/

Saturday, May 18, 13

http://phpbench.com/

Saturday, May 18, 13

Writing Efficient PHPSet 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

Saturday, May 18, 13

Saturday, May 18, 13

So Why Even Mention Micro-Optimizations?

Saturday, May 18, 13

http://code.flickr.net/2009/12/02/flipping-out/

Saturday, May 18, 13

strtok() to implode()

Saturday, May 18, 13

Lesson:Focus on the Big

Wins

Saturday, May 18, 13

“Premature optimization is the root of all evil”- Donald Knuth

Saturday, May 18, 13

Big Wins

Saturday, May 18, 13

Upgrade PHP

Saturday, May 18, 13

Upgrade PHP5.3 is ~20% faster than 5.2

Saturday, May 18, 13

Upgrade PHP5.3 is ~20% faster than 5.2

http://news.php.net/php.internals/36484

Saturday, May 18, 13

Upgrade PHP5.3 is ~20% faster than 5.2

http://news.php.net/php.internals/36484

Saturday, May 18, 13

Upgrade PHP5.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

Upgrade PHP5.3 is ~20% faster than 5.2

http://news.php.net/php.internals/36484

5.4 is ~20-40% faster than 5.3http://news.php.net/php.internals/57760

Saturday, May 18, 13

Upgrade PHP5.3 is ~20% faster than 5.2

http://news.php.net/php.internals/36484

5.4 is ~20-40% faster than 5.3http://news.php.net/php.internals/57760

Saturday, May 18, 13

Upgrade PHP5.3 is ~20% faster than 5.2

http://news.php.net/php.internals/36484

5.4 is ~20-40% faster than 5.3http://news.php.net/php.internals/57760

Upgrading 5.2 --> 5.4 gives a 45-70% improvement!

Saturday, May 18, 13

Upgrade PHP5.3 is ~20% faster than 5.2

http://news.php.net/php.internals/36484

5.4 is ~20-40% faster than 5.3http://news.php.net/php.internals/57760

Upgrading 5.2 --> 5.4 gives a 45-70% improvement!http://php.net/migration53

Saturday, May 18, 13

Upgrade PHP5.3 is ~20% faster than 5.2

http://news.php.net/php.internals/36484

5.4 is ~20-40% faster than 5.3http://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

Upgrade PHP5.3 is ~20% faster than 5.2

http://news.php.net/php.internals/36484

5.4 is ~20-40% faster than 5.3http://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

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

Saturday, May 18, 13

Etsy’s Upgrade to PHP 5.4

Saturday, May 18, 13

Use an Opcode Cache (APC)

Saturday, May 18, 13

Standard Page Execution

Saturday, May 18, 13

With An Opcode Cache

Saturday, May 18, 13

Opcode Cache Vanilla settings: 30-40% improvement

Turn off APC Stat: additional ~2x improvement -- Understand what is happening herehttp://www.slideshare.net/vortexau/improving-php-application-performance-with-apc-presentation

Saturday, May 18, 13

Cache Data in a Key-Value Store

Saturday, May 18, 13

APC User Cache<?php$foo = "Hello, World!";apc_store('some_key', $foo);?>

<?phpvar_dump(apc_fetch('some_key'));?>

-------- Output --------

string(12) "Hello World!"

Saturday, May 18, 13

APC User Cache

Saturday, May 18, 13

APC User Cache • Avoid fragmentation - keep utilization under 10%

Saturday, May 18, 13

APC User Cache • Avoid fragmentation - keep utilization under 10%

• Assign 1GB, only fill 100MB

Saturday, May 18, 13

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

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

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

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

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

Saturday, May 18, 13

APC vs. MemcachedAPC 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

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

Child Processes4-6 processes per CPU core.

Beyond that just add servers.

(Test your app)

Saturday, May 18, 13

Understand Framework

Overhead

Saturday, May 18, 13

http://systemsarchitect.net/performance-benchmark-of-popular-php-frameworks/

Saturday, May 18, 13

Saturday, May 18, 13

Saturday, May 18, 13

Saturday, May 18, 13

Symfony is 20x slower than raw

PHP

Saturday, May 18, 13

Load Testing

Saturday, May 18, 13

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

Saturday, May 18, 13

Saturday, May 18, 13

Saturday, May 18, 13

Saturday, May 18, 13

Saturday, May 18, 13

Be Careful

Saturday, May 18, 13

Be Careful• JMeter looks a lot like a DOS attack

Saturday, May 18, 13

Be Careful• JMeter looks a lot like a DOS attack• Make sure you know what is failing

Saturday, May 18, 13

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

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

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

Takeaways

Saturday, May 18, 13

“How Fast Is Your Site?”

Saturday, May 18, 13

This is a terrible quesiton

Saturday, May 18, 13

Why is it terrible?

Saturday, May 18, 13

Why is it terrible?• Lack of context

Saturday, May 18, 13

Why is it terrible?• Lack of context

• Are we talking about average or a percentile?

Saturday, May 18, 13

Why is it terrible?• Lack of context

• Are we talking about average or a percentile?

• Server side time or client?

Saturday, May 18, 13

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

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

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

We still have to answer it

Saturday, May 18, 13

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

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

Things to Remember

Saturday, May 18, 13

Things to Remember• Measure and monitor your application

Saturday, May 18, 13

Things to Remember• Measure and monitor your application

• Focus on big wins

Saturday, May 18, 13

Things to Remember• Measure and monitor your application

• Focus on big wins

• Run the latest (stable) version of PHP

Saturday, May 18, 13

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

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

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

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

There is a lot more to talk about

Saturday, May 18, 13

Get in Touchhttp://web-performance.meetup.com/

www.etsy.com/careers

jonathan@etsy.com

@jonathanklein

Saturday, May 18, 13

top related