Scaling Rails: a system-wide approach to performance optimization

111
Scaling Rails a system-wide approach to performance optimization February 2010 FEUP Exploratory Case Study: http://escolinhas.pt

description

Second keynote on my master's thesis. It's a state of the art review.

Transcript of Scaling Rails: a system-wide approach to performance optimization

Page 1: Scaling Rails: a system-wide approach to performance optimization

Scaling Railsa system-wide approach to performance optimization

February 2010

FEUP

Exploratory Case Study: http://escolinhas.pt

Page 2: Scaling Rails: a system-wide approach to performance optimization

< Problem >

Scaling Rails: a system-wide approach to performance optimization2

Page 3: Scaling Rails: a system-wide approach to performance optimization

Web 2.0

Scaling Rails: a system-wide approach to performance optimization3

Page 4: Scaling Rails: a system-wide approach to performance optimization

Better web

Better tools

Scaling Rails: a system-wide approach to performance optimization4

Page 5: Scaling Rails: a system-wide approach to performance optimization

Ruby on Rails

Scaling Rails: a system-wide approach to performance optimization5

Page 6: Scaling Rails: a system-wide approach to performance optimization

Popularity brings USERS

USERS need scalability

Scaling Rails: a system-wide approach to performance optimization6

Page 7: Scaling Rails: a system-wide approach to performance optimization

Rails doesn’t scale

Scaling Rails: a system-wide approach to performance optimization7

Page 8: Scaling Rails: a system-wide approach to performance optimization

Twitter

Scaling Rails: a system-wide approach to performance optimization8

Page 9: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization9

Page 10: Scaling Rails: a system-wide approach to performance optimization

Twitter abandoning Rails?

Scaling Rails: a system-wide approach to performance optimization10

Page 11: Scaling Rails: a system-wide approach to performance optimization

“FWIW: Twitter currently has no plans to

abandon RoR. Lots of our code is not in

RoR, already, though. Maybe that's why

people are confused.”

Scaling Rails: a system-wide approach to performance optimization11

- Evan Williams, Twitter CEO

Page 12: Scaling Rails: a system-wide approach to performance optimization

YellowPages

Scaling Rails: a system-wide approach to performance optimization12

Page 13: Scaling Rails: a system-wide approach to performance optimization

More users?

“Just throw hardware at it.”

Scaling Rails: a system-wide approach to performance optimization13

Page 14: Scaling Rails: a system-wide approach to performance optimization

Rails doesn’t scale

Scaling Rails: a system-wide approach to performance optimization14

Page 15: Scaling Rails: a system-wide approach to performance optimization

Hulu

Scaling Rails: a system-wide approach to performance optimization15

Page 16: Scaling Rails: a system-wide approach to performance optimization

Scribd

Scaling Rails: a system-wide approach to performance optimization16

Page 17: Scaling Rails: a system-wide approach to performance optimization

They scaled

They gave keynotes on

HOW

Scaling Rails: a system-wide approach to performance optimization17

Page 18: Scaling Rails: a system-wide approach to performance optimization

What’s missing here?

Scaling Rails: a system-wide approach to performance optimization18

Page 19: Scaling Rails: a system-wide approach to performance optimization

No general approaches to scaling

Scaling Rails: a system-wide approach to performance optimization19

Page 20: Scaling Rails: a system-wide approach to performance optimization

Problem Overview

Scaling Rails: a system-wide approach to performance optimization20

Page 21: Scaling Rails: a system-wide approach to performance optimization

Rails doesn’t scale?

Twitter

YellowPages

Rails doesn’t scale?

Hulu

Scribd

General approaches to scaling?

Scaling Rails: a system-wide approach to performance optimization21

< Problem Overview >

Page 22: Scaling Rails: a system-wide approach to performance optimization

< Motivation >

Scaling Rails: a system-wide approach to performance optimization22

Page 23: Scaling Rails: a system-wide approach to performance optimization

WEB

Scaling Rails: a system-wide approach to performance optimization23

WEB

WEB

WEB

WEB

Page 24: Scaling Rails: a system-wide approach to performance optimization

USERS

Scaling Rails: a system-wide approach to performance optimization24

USERS

USERS

USERS

USERS

Page 25: Scaling Rails: a system-wide approach to performance optimization

IMPORTANCE

Scaling Rails: a system-wide approach to performance optimization25

IMPORTANCE

IMPORTANCE

IMPORTANCE

IMPORTANCE

Page 26: Scaling Rails: a system-wide approach to performance optimization

Better web

Scaling Rails: a system-wide approach to performance optimization26

Page 27: Scaling Rails: a system-wide approach to performance optimization

Better tools

Scaling Rails: a system-wide approach to performance optimization27

Page 28: Scaling Rails: a system-wide approach to performance optimization

UX involves reasonable response

times and service uptime

Scaling Rails: a system-wide approach to performance optimization28

Page 29: Scaling Rails: a system-wide approach to performance optimization

Most recent tools are great

Scaling Rails: a system-wide approach to performance optimization29

Page 30: Scaling Rails: a system-wide approach to performance optimization

“Ruby on Rails is a breakthrough in lowering the

barriers of entry to programming. Powerful web

applications that formerly might have taken

weeks or months to develop can be produced in

a matter of days.”

Scaling Rails: a system-wide approach to performance optimization30

- Tim O'Reilly, Founder of O'Reilly Media

Page 31: Scaling Rails: a system-wide approach to performance optimization

Everything can be improved

There is no perfect tool

There are always pitfalls

Scaling Rails: a system-wide approach to performance optimization31

Page 32: Scaling Rails: a system-wide approach to performance optimization

What’s really motivating?

Scaling Rails: a system-wide approach to performance optimization32

Page 33: Scaling Rails: a system-wide approach to performance optimization

Fixing pitfalls on great tools

Improving UX for everyone

Scaling Rails: a system-wide approach to performance optimization33

Page 34: Scaling Rails: a system-wide approach to performance optimization

Motivation Overview

Scaling Rails: a system-wide approach to performance optimization34

Page 35: Scaling Rails: a system-wide approach to performance optimization

Web keeps growing

More users, importance

Web 2.0

User Experience

Also dependant on:

Response times and availability

Recent tools are great

There are always pitfalls

Fixing pitfalls on great tools

Improving UX for everyone

Scaling Rails: a system-wide approach to performance optimization35

< Motivation Overview >

Page 36: Scaling Rails: a system-wide approach to performance optimization

< Goals >

Scaling Rails: a system-wide approach to performance optimization36

Page 37: Scaling Rails: a system-wide approach to performance optimization

What about scaling?

Scaling Rails: a system-wide approach to performance optimization37

Page 38: Scaling Rails: a system-wide approach to performance optimization

Everything is easy

Scaling should also be easy

Scaling Rails: a system-wide approach to performance optimization38

Page 39: Scaling Rails: a system-wide approach to performance optimization

Creation of

Scaling Rails: a system-wide approach to performance optimization39

Page 40: Scaling Rails: a system-wide approach to performance optimization

Guidelines and conventions

for high performance

Rails applications

Scaling Rails: a system-wide approach to performance optimization40

Page 41: Scaling Rails: a system-wide approach to performance optimization

Optimal Rails-oriented

configurations for every involved

component

Scaling Rails: a system-wide approach to performance optimization41

Page 42: Scaling Rails: a system-wide approach to performance optimization

Patches to improve the

components performance from a

Rails-perspective

Scaling Rails: a system-wide approach to performance optimization42

Page 43: Scaling Rails: a system-wide approach to performance optimization

Objectives Overview

Scaling Rails: a system-wide approach to performance optimization43

Page 44: Scaling Rails: a system-wide approach to performance optimization

Scaling should be easy

Creation of:

Generic guidelines and conventions

Optimal configurations

Patches for all components

All from a performance-oriented philosophy centered

in Ruby on Rails!

Scaling Rails: a system-wide approach to performance optimization44

< Objectives Overview >

Page 45: Scaling Rails: a system-wide approach to performance optimization

< State of the Art >

Scaling Rails: a system-wide approach to performance optimization45

Page 46: Scaling Rails: a system-wide approach to performance optimization

< Operating Systems >

Scaling Rails: a system-wide approach to performance optimization46

Page 47: Scaling Rails: a system-wide approach to performance optimization

Most used OS in servers: Linux

Scaling Rails: a system-wide approach to performance optimization47

Page 48: Scaling Rails: a system-wide approach to performance optimization

BSD faster than Linux

Scaling Rails: a system-wide approach to performance optimization48

Page 49: Scaling Rails: a system-wide approach to performance optimization

Linux faster than BSD

Scaling Rails: a system-wide approach to performance optimization49

Page 50: Scaling Rails: a system-wide approach to performance optimization

Linux Ruby 1.8 2x faster

than Windows Ruby 1.8

Scaling Rails: a system-wide approach to performance optimization50

Page 51: Scaling Rails: a system-wide approach to performance optimization

Linux Ruby 1.9 70% faster

than Windows Ruby 1.9

Scaling Rails: a system-wide approach to performance optimization51

Page 52: Scaling Rails: a system-wide approach to performance optimization

Rails widely deployed in Linux

Scaling Rails: a system-wide approach to performance optimization52

Page 53: Scaling Rails: a system-wide approach to performance optimization

< Ruby >

Scaling Rails: a system-wide approach to performance optimization53

Page 54: Scaling Rails: a system-wide approach to performance optimization

Ruby 1.8 is the most widely used

Scaling Rails: a system-wide approach to performance optimization54

Page 55: Scaling Rails: a system-wide approach to performance optimization

JRuby is the fastest implementation

Scaling Rails: a system-wide approach to performance optimization55

Page 56: Scaling Rails: a system-wide approach to performance optimization

Ruby 1.8 will soon be outdated

Scaling Rails: a system-wide approach to performance optimization56

Page 57: Scaling Rails: a system-wide approach to performance optimization

Ruby 1.9 will soon be outdated

Scaling Rails: a system-wide approach to performance optimization57

Page 58: Scaling Rails: a system-wide approach to performance optimization

Ruby 1.9 has only one interpreter

Scaling Rails: a system-wide approach to performance optimization58

Page 59: Scaling Rails: a system-wide approach to performance optimization

Ruby MRI 1.9

Scaling Rails: a system-wide approach to performance optimization59

Page 60: Scaling Rails: a system-wide approach to performance optimization

Ruby MRI 1.9

Rails bottleneck: GC

Scaling Rails: a system-wide approach to performance optimization60

Page 61: Scaling Rails: a system-wide approach to performance optimization

< Web servers >

Scaling Rails: a system-wide approach to performance optimization61

Page 62: Scaling Rails: a system-wide approach to performance optimization

Webrick

Scaling Rails: a system-wide approach to performance optimization62

Page 63: Scaling Rails: a system-wide approach to performance optimization

Webrick

Pioneer, slow

Scaling Rails: a system-wide approach to performance optimization63

Page 64: Scaling Rails: a system-wide approach to performance optimization

Mongrel

Scaling Rails: a system-wide approach to performance optimization64

Page 65: Scaling Rails: a system-wide approach to performance optimization

Mongrel

Much faster, excellent HTML parser

Scaling Rails: a system-wide approach to performance optimization65

Page 66: Scaling Rails: a system-wide approach to performance optimization

Thin

Scaling Rails: a system-wide approach to performance optimization66

Page 67: Scaling Rails: a system-wide approach to performance optimization

Thin

Mongrel’s HTML parser

Scaling Rails: a system-wide approach to performance optimization67

Page 68: Scaling Rails: a system-wide approach to performance optimization

Thin

New I/O back-end: EventMachine

Scaling Rails: a system-wide approach to performance optimization68

Page 69: Scaling Rails: a system-wide approach to performance optimization

Thin

Faster than those before

Scaling Rails: a system-wide approach to performance optimization69

Page 70: Scaling Rails: a system-wide approach to performance optimization

Passenger

Scaling Rails: a system-wide approach to performance optimization70

Page 71: Scaling Rails: a system-wide approach to performance optimization

Passenger

Not self-contained

Scaling Rails: a system-wide approach to performance optimization71

Page 72: Scaling Rails: a system-wide approach to performance optimization

Passenger

Module for Apache/Nginx

Scaling Rails: a system-wide approach to performance optimization72

Page 73: Scaling Rails: a system-wide approach to performance optimization

Passenger

Good performance, great at scaling

Scaling Rails: a system-wide approach to performance optimization73

Page 74: Scaling Rails: a system-wide approach to performance optimization

Thin is the fastest

Passenger scales better

Scaling Rails: a system-wide approach to performance optimization74

Page 75: Scaling Rails: a system-wide approach to performance optimization

< Database >

Scaling Rails: a system-wide approach to performance optimization75

Page 76: Scaling Rails: a system-wide approach to performance optimization

MySQL

Scaling Rails: a system-wide approach to performance optimization76

Page 77: Scaling Rails: a system-wide approach to performance optimization

PostgreSQL

Scaling Rails: a system-wide approach to performance optimization77

Page 78: Scaling Rails: a system-wide approach to performance optimization

MySQL is faster and more popular

Scaling Rails: a system-wide approach to performance optimization78

Page 79: Scaling Rails: a system-wide approach to performance optimization

Schema-less databases

Scaling Rails: a system-wide approach to performance optimization79

Page 80: Scaling Rails: a system-wide approach to performance optimization

Schema-less databases

Said to have better performance than SQL

Scaling Rails: a system-wide approach to performance optimization80

Page 81: Scaling Rails: a system-wide approach to performance optimization

MongoDB

Scaling Rails: a system-wide approach to performance optimization81

Page 82: Scaling Rails: a system-wide approach to performance optimization

CouchDB

Scaling Rails: a system-wide approach to performance optimization82

Page 83: Scaling Rails: a system-wide approach to performance optimization

Benchmarks are scarce

Scaling Rails: a system-wide approach to performance optimization83

Page 84: Scaling Rails: a system-wide approach to performance optimization

Major improvement in all DB:

Caching, caching, caching!

Scaling Rails: a system-wide approach to performance optimization84

Page 85: Scaling Rails: a system-wide approach to performance optimization

< Rails >

Scaling Rails: a system-wide approach to performance optimization85

Page 86: Scaling Rails: a system-wide approach to performance optimization

Rails 2.3

Scaling Rails: a system-wide approach to performance optimization86

Page 87: Scaling Rails: a system-wide approach to performance optimization

Many performance pitfalls

improved in Rails 3

Scaling Rails: a system-wide approach to performance optimization87

Page 88: Scaling Rails: a system-wide approach to performance optimization

Rails 3

Beta release in February

Scaling Rails: a system-wide approach to performance optimization88

Page 89: Scaling Rails: a system-wide approach to performance optimization

Immediate need: form helpers, i18n

Scaling Rails: a system-wide approach to performance optimization89

Page 90: Scaling Rails: a system-wide approach to performance optimization

< Application >

Scaling Rails: a system-wide approach to performance optimization90

Page 91: Scaling Rails: a system-wide approach to performance optimization

Porting to Ruby 1.9 (from 1.8)

Scaling Rails: a system-wide approach to performance optimization91

Page 92: Scaling Rails: a system-wide approach to performance optimization

Porting to Rails 3 (from 2.3)

Scaling Rails: a system-wide approach to performance optimization92

Page 93: Scaling Rails: a system-wide approach to performance optimization

Check code for common pitfalls

Eager loading

Fetching records in batches

Database Indexes

Caching

Scaling Rails: a system-wide approach to performance optimization93

Page 94: Scaling Rails: a system-wide approach to performance optimization

< Methodology >

Scaling Rails: a system-wide approach to performance optimization94

Page 95: Scaling Rails: a system-wide approach to performance optimization

State of the Art narrows options down

Scaling Rails: a system-wide approach to performance optimization95

Page 96: Scaling Rails: a system-wide approach to performance optimization

Benchmarking

Controlled tests to choose the best

software for each component

Scaling Rails: a system-wide approach to performance optimization96

Page 97: Scaling Rails: a system-wide approach to performance optimization

Tweaking

Try out different configurations and

architectures

Scaling Rails: a system-wide approach to performance optimization97

Page 98: Scaling Rails: a system-wide approach to performance optimization

Testing

Measuring of results, finding bottlenecks

Scaling Rails: a system-wide approach to performance optimization98

Page 99: Scaling Rails: a system-wide approach to performance optimization

Developing

Improving over bottlenecks

Scaling Rails: a system-wide approach to performance optimization99

Page 100: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization100

Benchmarking

Tweaking

Testing

Developing

and

Improving

Page 101: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization101

Recipe: repeat for all components

Page 102: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization102

Rails perspective!

Page 103: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization103

Escolinhas

Page 104: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization104

Page 105: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization105

Butterfly Effect

Page 106: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization106

Page 107: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization107

Consider sensitive dependencies

Page 108: Scaling Rails: a system-wide approach to performance optimization

< Work schedule >

Scaling Rails: a system-wide approach to performance optimization108

Page 109: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization109

Page 110: Scaling Rails: a system-wide approach to performance optimization

Scaling Rails: a system-wide approach to performance optimization110

Activity Start Date Duration (weeks)

OS testing and choosing 15/02/2010 1

OS kernel testing and tuning 22/02/2010 1

Web server testing and bottleneck research 01/03/2010 1

Web server bottleneck improvements 08/03/2010 1

Ruby interpreter testing and bottleneck research 15/03/2010 1

Ruby interpreter bottleneck improvements 22/03/2010 1.5

DB testing and bottleneck research 31/03/2010 1

DB bottleneck improvements 07/04/2010 1

Rails bottleneck research 14/04/2010 1

Rails bottleneck improvements 21/04/2010 2.5

Escolinhas analysis and bottleneck research 10/05/2010 1

Escolinhas improvements 07/05/2010 3

Writing of dissertation report 07/06/2010 4

Page 111: Scaling Rails: a system-wide approach to performance optimization

< Thank you >

http://snaprails.tumblr.com

Gonçalo S. SilvaAdvisor: Ademar Aguiar

http://goncalossilva.comhttp://twitter.com/goncalossilva