Upload
jonathan-klein
View
5
Download
0
Embed Size (px)
DESCRIPTION
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.
Citation preview
Building Faster Websites: Optimizing the Server
Jonathan Klein
@jonathanklein
November 17, 2011
Agenda
Who Am I?
Why Server Side Performance Matters
Measuring Performance
Speeding up the Server
Improving the Database
Load Testing
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
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
Why Server Side Performance?
7
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
8
Time to first byte
Time To First Byte (TTFB) Matters
How Do We Measure It?
10
Server Side Monitoring
Lots 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
11
Or Something Simple…
<?php$start = microtime(true);
…script content…
$end = microtime(true);
do_stuff('Description', $end - $start);?>
12
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
14
Averages can be misleading
Better to look at percentiles
What Does a Scalability Problem Look Like?
19
This:
20
Or maybe this!
21
Much better!
So How Do We Do It?
23
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
24
What does “Optimize” mean?
• Look at execution plan1. Remove calls to remote servers
25
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)
26
Example
SELECT id, name, salary FROM employee WHERE salary < 25000;
NOT
SELECT id, name, salary FROM employee WHERE salary + 10000 < 35000;
27
Example
SELECT id, name, salary FROM employee WHERE salary < 25000;
NOT
SELECT id, name, salary FROM employee WHERE salary + 10000 < 35000;
28
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:
The Fastest DB Query is the One You Don’t Make
30
Memcached
• Caching layer between database and webserver
• Can hold PHP objects and arrays
31
Memcached
$m = new Memcached();$m->pconnect(‘1.2.3.4', 11211);
$m->set(‘foo’, $bar, 600);
$baz = $m->get(‘foo’);
32
Install APC
• APC – Alternative PHP Cache
1. Opcode Cache
2. User Cache
3. Awesome!
33
Opcode Cache
34
User Cache
<?php$bar = 'BAR';apc_store('foo', $bar);var_dump(apc_fetch('foo'));?>
Outputs…
string(3) "BAR"
PHP Code Optimizations
36
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…
37
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
38
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
39
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
Webserver Considerations
41
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
42
Benefits of Lighttpd/Nginx
• Event driven model:
“Unlike traditional servers, Nginx doesn't 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.
43
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
Load Testing
45
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).
46
JMeter
48
JMeter
49
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
50
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
51
Questions?
We’re Hiring!www.wayfair.com/careers
Get In Touch:www.meetup.com/Web-Performance-Boston/
[email protected]@jonathanklein