Slide 1

Slide 1 text

CHICKTECH WORKSHOP 2016.05.18 MEASURING WEBSITE PERFORMANCE WITH NEW RELIC IAN DEES • @UNDEES

Slide 2

Slide 2 text

WHAT WE DO AT NEW RELIC

Slide 3

Slide 3 text

“UNDERSTAND YOUR
 DIGITAL BUSINESS”

Slide 4

Slide 4 text

FIND, FIX, AND PREVENT
 TECHNOLOGY PROBLEMS
 SO YOU CAN BUILD STUFF

Slide 5

Slide 5 text

APM APPLICATION PERFORMANCE MONITORING

Slide 6

Slide 6 text

WHY WE BUILT APM

Slide 7

Slide 7 text

TRF_Mr_Hyde
 https://flic.kr/p/bKumAD
 CC BY

Slide 8

Slide 8 text

My web page

The time is now.

Slide 9

Slide 9 text

My web page

The time is <%= Time.now %>.

Slide 10

Slide 10 text

<% $db = connect_to_database('db.example.com', 'password'); $rows = $db.query('select * from movies;'); %>

My awesome movies

<% for i in (0...$rows.count) do %>

Movie no. <%= i %> is <%= $rows[i][0] %>

<% end %>

Slide 11

Slide 11 text

“I CAN’T KEEP TRACK OF ALL THIS
 TAG SOUP!” Web developers, ca. 2003

Slide 12

Slide 12 text

RAILS

Slide 13

Slide 13 text

class Movie < ActiveRecord::Base has_one :director has_many :performers end

Slide 14

Slide 14 text

class Movie < ActiveRecord::Base has_one :director has_many :performers end

Slide 15

Slide 15 text

“MY WEB APP IS SO SLOW!” Web developers, ca. 2007

Slide 16

Slide 16 text

App Server Database

Slide 17

Slide 17 text

APM

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

WHY APM IS IMPORTANT TODAY

Slide 20

Slide 20 text

APPS ARE EVEN MORE COMPLICATED NOW

Slide 21

Slide 21 text

Service Database Load Balancer App Server App Server

Slide 22

Slide 22 text

VARIETY OF LANGUAGES AND TECHNOLOGIES

Slide 23

Slide 23 text

WORKING ON THE BUSINESS >
 WORKING ON THE TECH

Slide 24

Slide 24 text

WHY APM IS IMPORTANT FOR YOU

Slide 25

Slide 25 text

YOU CAN SOLVE PROBLEMS MORE EFFECTIVELY

Slide 26

Slide 26 text

YOU CAN HIGHLIGHT THIS SKILL ON YOUR RESUME

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

YOU CAN HIGHLIGHT RESULTS ON YOUR RESUME

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

WE'RE HIRING, BY THE WAY HTTPS://NEWRELIC.COM/ABOUT/CAREERS

Slide 31

Slide 31 text

VARIETY OF EXPERIENCE

Slide 32

Slide 32 text

WANT TO SOLVE REAL PROBLEMS FOR PEOPLE

Slide 33

Slide 33 text

FAMILIARITY WITH APM IDEAS IS A PLUS

Slide 34

Slide 34 text

WE BUILD IT TOGETHER

Slide 35

Slide 35 text

WHAT WE'RE GOING TO DO IN THIS WORKSHOP

Slide 36

Slide 36 text

EVENTUALLY:
 A BLOG APP

Slide 37

Slide 37 text

WRITTEN IN NODE.JS

Slide 38

Slide 38 text

BACKED BY A DATABASE

Slide 39

Slide 39 text

WITH A FEW PERFORMANCE ISSUES

Slide 40

Slide 40 text

WE’RE GOING TO USE NEW RELIC TO FIND/FIX

Slide 41

Slide 41 text

TODAY: A STARTER “HELLO WORLD” APP

Slide 42

Slide 42 text

1. GET THE TOOLS

Slide 43

Slide 43 text

2. TEST THE APP

Slide 44

Slide 44 text

3. ADD NEW RELIC

Slide 45

Slide 45 text

4. SEE WHAT PROBLEMS LOOK LIKE

Slide 46

Slide 46 text

BACKGROUND CONCEPTS FIRST THINGS FIRST

Slide 47

Slide 47 text

FINDING SLOW QUERIES AN EASY WAY TO GET A QUICK WIN

Slide 48

Slide 48 text

DATABASE-DRIVEN WEB APPS

Slide 49

Slide 49 text

App Server Database

Slide 50

Slide 50 text

“CRUD” CREATE, READ, UPDATE, DESTROY

Slide 51

Slide 51 text

KEY IDEA: TABLES

Slide 52

Slide 52 text

EXAMPLE:
 MOVIE REVIEWS

Slide 53

Slide 53 text

HOW WOULD YOU TRACK MOVIES IN A SPREADSHEET?

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

Title Year Language OMG CAT 2005 Finnish LOL DOG 2010 Esperanto

Slide 56

Slide 56 text

App Server Database

Slide 57

Slide 57 text

SQL STRUCTURED QUERY LANGUAGE

Slide 58

Slide 58 text

Title Year Language OMG CAT 2005 Finnish LOL DOG 2010 Esperanto

Slide 59

Slide 59 text

FIND ALL MOVIES # SELECT * FROM movies; title | year | language ---------+------+----------- OMG CAT | 2005 | Finnish LOL DOG | 2010 | Esperanto (2 rows)

Slide 60

Slide 60 text

JUST THE TITLES # SELECT title FROM movies; title --------- OMG CAT LOL DOG (2 rows)

Slide 61

Slide 61 text

ONLY THE ONES IN ESPERANTO # SELECT * FROM movies WHERE language = 'Esperanto'; title | year | language ---------+------+----------- LOL DOG | 2010 | Esperanto (1 row)

Slide 62

Slide 62 text

MASHING UP DATA

Slide 63

Slide 63 text

MOVIES AND REVIEWS

Slide 64

Slide 64 text

IDEA #1:
 MOVIE TITLE IN THE REVIEW

Slide 65

Slide 65 text

Reviewer Stars Movie Siskeltron 4000 5 LOL DOG Ebert-bot 1 LOL DOG Ebert-bot 4 OMG CAT

Slide 66

Slide 66 text

WHAT KIND OF REVIEWS DID THIS MOVIE GET? # SELECT stars FROM reviews WHERE movie = 'LOL DOG'; stars ------- 5 1 (2 rows)

Slide 67

Slide 67 text

PROBLEM:
 WHAT HAPPENS WHEN
 WE CHANGE A TITLE?

Slide 68

Slide 68 text

Title Year Language OMG CAT 2005 Finnish LØL DØG 2010 Esperanto

Slide 69

Slide 69 text

Reviewer Stars Movie Siskeltron 4000 5 LOL DOG Ebert-bot 1 LOL DOG Ebert-bot 4 OMG CAT

Slide 70

Slide 70 text

IDEA #2:
 REVIEWS IN THE MOVIES

Slide 71

Slide 71 text

Title Year Language Stars OMG CAT 2005 Finnish 4 LOL DOG 2010 Esperanto 5,1

Slide 72

Slide 72 text

WHAT KIND OF REVIEWS DID THIS MOVIE GET? # SELECT stars FROM movies WHERE title = 'LOL DOG'; stars ------- 5,1 (1 row)

Slide 73

Slide 73 text

PROBLEM:
 WHERE'S THE REST
 OF THE REVIEW?

Slide 74

Slide 74 text

IDEA #3:
 REFER TO MOVIES
 BY NUMBER

Slide 75

Slide 75 text

ID Title Year Language 1 OMG CAT 2005 Finnish 2 LOL DOG 2010 Esperanto

Slide 76

Slide 76 text

Reviewer Stars Movie ID Siskeltron 4000 5 2 Ebert-bot 1 2 Ebert-bot 4 1

Slide 77

Slide 77 text

WHAT KIND OF REVIEWS DID THIS MOVIE GET? # SELECT * FROM reviews WHERE movie_id = 2; reviewer | stars | movie_id -----------------+-------+---------- Siskeltron 4000 | 5 | 2 Ebert-bot | 1 | 2 (2 rows)

Slide 78

Slide 78 text

AHA!

Slide 79

Slide 79 text

NORMALIZATION

Slide 80

Slide 80 text

HOW DO WE GET MOVIES AND REVIEWS TOGETHER?

Slide 81

Slide 81 text

STAY TUNED!

Slide 82

Slide 82 text

“N+1 PROBLEM”

Slide 83

Slide 83 text

BIG-O NOTATION ▸O(n)
 
 read as “O of n,” which stands for “on the order of n”

Slide 84

Slide 84 text

ORDERS OF COMPLEXITY

Slide 85

Slide 85 text

TRF_Mr_Hyde / https://flic.kr/p/9NuvP4 / CC BY

Slide 86

Slide 86 text

EXAMPLE:
 SORTING A LIST

Slide 87

Slide 87 text

HOW MANY STEPS?

Slide 88

Slide 88 text

BUBBLE SORT

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

] 1

Slide 91

Slide 91 text

] 1

Slide 92

Slide 92 text

] 2

Slide 93

Slide 93 text

] 2

Slide 94

Slide 94 text

] 3

Slide 95

Slide 95 text

] 3

Slide 96

Slide 96 text

3

Slide 97

Slide 97 text

] 4

Slide 98

Slide 98 text

] 4

Slide 99

Slide 99 text

] 5

Slide 100

Slide 100 text

] 5

Slide 101

Slide 101 text

5

Slide 102

Slide 102 text

] 6

Slide 103

Slide 103 text

] 6

Slide 104

Slide 104 text

6

Slide 105

Slide 105 text

Items Steps Total 4 3 + 2 + 1 6

Slide 106

Slide 106 text

Items Steps Total 2 1 1 3 2 + 1 3 4 3 + 2 + 1 6 5 4 + 3 + 2 + 1 10 6 5 + 4 + 3 + 2 + 1 15

Slide 107

Slide 107 text

Number of steps needed for n items = 1 + 2 + 3 + … + (n - 1) = ½ ⨉ n ⨉ (n − 1) = ½n2 − ½n


Slide 108

Slide 108 text

What order of complexity is this? ½n2 − ½n ½n2 − ½n ½n2 − ½n so, it's O(n2)

Slide 109

Slide 109 text

THESE ARE ALL THE SAME ORDER:

Slide 110

Slide 110 text

Time Items n2

Slide 111

Slide 111 text

Time Items n2 + 2

Slide 112

Slide 112 text

Time Items 2n2

Slide 113

Slide 113 text

Time Items n2 + n

Slide 114

Slide 114 text

BIG-O ANALYSIS ONE OF THE MOST POWERFUL TOOLS IN COMPUTING!

Slide 115

Slide 115 text

HELPS YOU PREDICT HOW YOUR PROGRAM IS GOING TO SCALE

Slide 116

Slide 116 text

DATABASE EXAMPLE

Slide 117

Slide 117 text

MOVIES AND REVIEWS

Slide 118

Slide 118 text

No content

Slide 119

Slide 119 text

MOVIES AND REVIEWS # SELECT * FROM movies; id | title | year | language ----+---------+------+----------- 1 | OMG CAT | 2005 | Finnish 2 | LOL DOG | 2010 | Esperanto (2 rows) # SELECT * FROM reviews; reviewer | stars | movie_id -----------------+-------+---------- Siskeltron 4000 | 5 | 2 Ebert-bot | 1 | 2 Ebert-bot | 4 | 1 (3 rows)

Slide 120

Slide 120 text

THE HARD WAY:
 LOOP THROUGH MOVIES

Slide 121

Slide 121 text

MOVIES AND REVIEWS movies = db.query('SELECT * FROM movies;') movies.each do |movie| puts movie.title reviews = db.query('SELECT * FROM REVIEWS WHERE movie_id = ' + movie.id) reviews.each do |review| puts review.reviewer + ' gave it ' + review.stars + ' star(s)' end end

Slide 122

Slide 122 text

MOVIES AND REVIEWS movies = db.query('SELECT * FROM movies;') movies.each do |movie| puts movie.title reviews = db.query('SELECT * FROM REVIEWS WHERE movie_id = ' + movie.id) reviews.each do |review| puts review.reviewer + ' gave it ' + review.stars + ' star(s)' end end

Slide 123

Slide 123 text

MOVIES AND REVIEWS movies = db.query('SELECT * FROM movies;') movies.each do |movie| puts movie.title reviews = db.query('SELECT * FROM REVIEWS WHERE movie_id = ' + movie.id) reviews.each do |review| puts review.reviewer + ' gave it ' + review.stars + ' star(s)' end end

Slide 124

Slide 124 text

MOVIES AND REVIEWS movies = db.query('SELECT * FROM movies;') movies.each do |movie| puts movie.title reviews = db.query('SELECT * FROM REVIEWS WHERE movie_id = ' + movie.id) reviews.each do |review| puts review.reviewer + ' gave it ' + review.stars + ' star(s)' end end

Slide 125

Slide 125 text

MOVIES AND REVIEWS movies = db.query('SELECT * FROM movies;') movies.each do |movie| puts movie.title reviews = db.query('SELECT * FROM REVIEWS WHERE movie_id = ' + movie.id) reviews.each do |review| puts review.reviewer + ' gave it ' + review.stars + ' star(s)' end end

Slide 126

Slide 126 text

MOVIES AND REVIEWS movies = db.query('SELECT * FROM movies;') movies.each do |movie| puts movie.title reviews = db.query('SELECT * FROM REVIEWS WHERE movie_id = ' + movie.id) reviews.each do |review| puts review.reviewer + ' gave it ' + review.stars + ' star(s)' end end

Slide 127

Slide 127 text

Number of queries needed for n movies: = 1 query to get the list of movies + (n movies ⨉ 1 query for a single movie’s reviews) = n + 1


Slide 128

Slide 128 text

THINGS THAT HAPPEN FOR EVERY MOVIE: ▸ Your app builds a SQL query ▸ Your app sends the query over the network ▸ The database parses the query ▸ The database finds the answers on disk ▸ The database formats a SQL response ▸ The database sends the response over the network ▸ Your app decodes the response

Slide 129

Slide 129 text

N + 1 QUERIES TO LOAD THE PAGE 1000 movies ⨉ 1 review query for each movie = 1000 queries + 1 for the list of movie titles = 1001 queries

Slide 130

Slide 130 text

TIME FOR 1 PAGE LOAD Assume 0.01 second for a single query 1001 queries ⨉ 0.01 seconds for each query = 10.01 seconds to show your web page

Slide 131

Slide 131 text

WHAT IF WE COULD SEND JUST ONE BIG QUERY?

Slide 132

Slide 132 text

THINGS THAT HAPPEN FOR EVERY MOVIE JUST ONCE: ▸ Your app builds a SQL query ▸ Your app sends the query over the network ▸ The database parses the query ▸ The database finds the answers on disk ▸ The database formats a SQL response ▸ The database sends the response over the network ▸ Your app decodes the response

Slide 133

Slide 133 text

THESE BITS ARE SLOWER: ▸ Your app builds a SQL query ▸ Your app sends the query over the network ▸ The database parses the query ▸ The database finds the answers on disk ▸ The database formats a SQL response ▸ The database sends the response over the network ▸ Your app decodes the response

Slide 134

Slide 134 text

SO LET’S SAY A BIG QUERY TAKES 100X LONGER

Slide 135

Slide 135 text

(IT WON’T, BUT LET’S BE PESSIMISTS)

Slide 136

Slide 136 text

TIME FOR 1 PAGE LOAD (WITH ONE BIG QUERY) Assume the “give me everything” query takes: 100 times longer ⨉ 0.01 seconds = 1 second to show your web page …a 10x speedup!

Slide 137

Slide 137 text

HOW TO WRITE
 ONE BIG QUERY?

Slide 138

Slide 138 text

SQL JOINS THE DETAIL BEHIND THE SCENES

Slide 139

Slide 139 text

MOVIES AND REVIEWS # SELECT * FROM movies; id | title | year | language ----+---------+------+----------- 1 | OMG CAT | 2005 | Finnish 2 | LOL DOG | 2010 | Esperanto (2 rows) # SELECT * FROM reviews; reviewer | stars | movie_id -----------------+-------+---------- Siskeltron 4000 | 5 | 2 Ebert-bot | 1 | 2 Ebert-bot | 4 | 1 (3 rows)

Slide 140

Slide 140 text

WE WANT A MASHUP:

Slide 141

Slide 141 text

Reviewer Stars Title Siskeltron 4000 5 LOL DOG Ebert-bot 1 LOL DOG Ebert-bot 4 OMG CAT

Slide 142

Slide 142 text

JOIN

Slide 143

Slide 143 text

MOVIES THAT HAVE REVIEWS # SELECT reviews.reviewer, reviews.stars, movies.title FROM reviews INNER JOIN movies ON (reviews.movie_id = movies.id); reviewer | stars | title -----------------+-------+--------- Siskeltron 4000 | 5 | LOL DOG Ebert-bot | 1 | LOL DOG Ebert-bot | 4 | OMG CAT (3 rows)

Slide 144

Slide 144 text

MOVIES THAT HAVE REVIEWS # SELECT reviews.reviewer, reviews.stars, movies.title FROM reviews INNER JOIN movies ON (reviews.movie_id = movies.id); reviewer | stars | title -----------------+-------+--------- Siskeltron 4000 | 5 | LOL DOG Ebert-bot | 1 | LOL DOG Ebert-bot | 4 | OMG CAT (3 rows)

Slide 145

Slide 145 text

MOVIES THAT HAVE REVIEWS # SELECT reviews.reviewer, reviews.stars, movies.title FROM reviews INNER JOIN movies ON (reviews.movie_id = movies.id); reviewer | stars | title -----------------+-------+--------- Siskeltron 4000 | 5 | LOL DOG Ebert-bot | 1 | LOL DOG Ebert-bot | 4 | OMG CAT (3 rows)

Slide 146

Slide 146 text

MOVIES THAT HAVE REVIEWS # SELECT reviews.reviewer, reviews.stars, movies.title FROM reviews INNER JOIN movies ON (reviews.movie_id = movies.id); reviewer | stars | title -----------------+-------+--------- Siskeltron 4000 | 5 | LOL DOG Ebert-bot | 1 | LOL DOG Ebert-bot | 4 | OMG CAT (3 rows)

Slide 147

Slide 147 text

MOVIES THAT HAVE REVIEWS # SELECT reviews.reviewer, reviews.stars, movies.title FROM reviews INNER JOIN movies ON (reviews.movie_id = movies.id); reviewer | stars | title -----------------+-------+--------- Siskeltron 4000 | 5 | LOL DOG Ebert-bot | 1 | LOL DOG Ebert-bot | 4 | OMG CAT (3 rows)

Slide 148

Slide 148 text

YOUR APP FRAMEWORK WILL HAVE SHORTCUTS

Slide 149

Slide 149 text

RAILS WITH AN N+1 class Movie < ActiveRecord::Base has_many reviews end movies = Movie.all # ...then, get reviews for each movie...

Slide 150

Slide 150 text

N+1 FIXED class Movie < ActiveRecord::Base has_many reviews end movies = Movie.includes(:reviews) # ...then, get reviews for each movie...

Slide 151

Slide 151 text

FIXING N+1 CAN BE YOUR SUPERPOWER

Slide 152

Slide 152 text

NEXT TIME, YOU’LL DO JUST THAT

Slide 153

Slide 153 text

TIME FOR A BREAK!

Slide 154

Slide 154 text

LEGALESE This document and the information herein (including any information that may be incorporated by reference) is provided for informational purposes only and should not be construed as an offer, commitment, promise or obligation on behalf of New Relic, Inc. (“New Relic”) to sell securities or deliver any product, material, code, functionality, or other feature. Any information provided hereby is proprietary to New Relic and may not be replicated or disclosed without New Relic’s express written permission. Such information may contain forward-looking statements within the meaning of federal securities laws. Any statement that is not a historical fact or refers to expectations, projections, future plans, objectives, estimates, goals, or other characterizations of future events is a forward-looking statement. These forward-looking statements can often be identified as such because the context of the statement will include words such as “believes,” “anticipates,” “expects” or words of similar import. Actual results may differ materially from those expressed in these forward-looking statements, which speak only as of the date hereof, and are subject to change at any time without notice. Existing and prospective investors, customers and other third parties transacting business with New Relic are cautioned not to place undue reliance on this forward-looking information. The achievement or success of the matters covered by such forward-looking statements are based on New Relic’s current assumptions, expectations, and beliefs and are subject to substantial risks, uncertainties, assumptions, and changes in circumstances that may cause the actual results, performance, or achievements to differ materially from those expressed or implied in any forward-looking statement. Further information on factors that could affect such forward-looking statements is included in the filings we make with the SEC from time to time. Copies of these documents may be obtained by visiting New Relic’s Investor Relations website at ir.newrelic.com or the SEC’s website at www.sec.gov. New Relic assumes no obligation and does not intend to update these forward-looking statements, except as required by law. New Relic makes no warranties, expressed or implied, in this document or otherwise, with respect to the information provided.