This document summarizes a presentation about optimizing server-side performance. It discusses measuring performance metrics like time to first byte, optimizing databases through techniques like adding indexes and reducing joins, using caching with Memcached and APC, choosing fast web servers like Nginx and Lighttpd, and using load testing tools like JMeter to test performance before deployment. The presentation was given by a senior engineer at Wayfair to discuss their experiences optimizing their platform.
1. November 17, 2011
Building Faster Websites:
Optimizing the Server
Jonathan Klein
jklein@wayfair.com
@jonathanklein
2. 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
3
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
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
7
8. Time to first byte
Time To First Byte (TTFB) Matters
8
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
12
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
23
24. What does “Optimize” mean?
• Look at execution plan
1. Remove calls to remote servers
24
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)
25
26. Example
SELECT id, name, salary
FROM employee
WHERE salary < 25000;
NOT
SELECT id, name, salary
FROM employee
WHERE salary + 10000 < 35000;
26
27. Example
SELECT id, name, salary
FROM employee
WHERE salary < 25000;
NOT
SELECT id, name, salary
FROM employee
WHERE salary + 10000 < 35000;
27
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:
28
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…
36
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
37
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
38
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
39
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
41
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.
42
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
43
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).
45
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
49
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
50
51. Questions?
We’re Hiring!
www.wayfair.com/careers
Get In Touch:
www.meetup.com/Web-Performance-Boston/
jklein@wayfair.com
@jonathanklein
51