Proactive WPO

Transcription

Proactive WPO
Proactive WPO
@marcelduran
[email protected]
about:me
I'm not here
I'm from here on
V is for Vigilante
http://usa-moscow.blogspot.com/2010/09/more-hot-water.html
Performance Radar
http://www.flickr.com/photos/benfrantzdale/1056282822/
“if you can’t measure it, you can’t improve it”
— Lord Kelvin
worst case: no instruments
http://www.flickr.com/photos/timothyhackworth/753783003/
build
test
reactive
deploy
review
users
better case: RUM
http://www.flickr.com/photos/pj/6116201547/
/logn
com
.
b
u
h
git
orm
al/
b
oo
m
er
an
g
Real User Measurements
http://lognormal.com/features/
build
test
reactive
deploy
monitor
users
YSlow manually
YSlow automation
http://www.flickr.com/photos/snazzyguy/3381047684/
+
+
much better: RUM + YSlow (CI)
http://donq.com/recipes/rum-sour
build
test
proactive
wpo
deploy
monitor
users
+174k users
+3.3mi downloads
Top 25 2bi add-ons downloaded
jul/07
~171k users
jul/07
mar/11
jul/07
mar/11
jun/11
~86k users
jul/07
mar/11
jun/11
aug/11
jul/07
oct/11
mar/11
jun/11
aug/11
jul/07
oct/11
mar/11
dec/11
jun/11
aug/11
first 24 hours
437
37
so far
919
jul/07
oct/11
mar/11
dec/11
feb/12
jun/11
aug/11
77
th
5 anniversary
http://www.flickr.com/photos/spool32/5045502202
jul/07
oct/11
dec/11
mar/11
jun/11
feb/12
apr/12
aug/11
jul/07
oct/11
dec/11
mar/11
jun/11
aug/11
feb/12
apr/12
jun/12
YSlow Command Line
$ npm install yslow -g
$ yslow --help
Usage: yslow [options] [file ...]
Options:
-h, --help
-V, --version
-i, --info <info>
-f, --format <format>
-r, --ruleset <ruleset>
-b, --beacon <url>
-d, --dict
-v, --verbose
output usage information
output the version number
specify the information to display/log
(basic|grade|stats|comps|all) [basic]
specify the output results format
(json|xml|plain) [json]
specify the YSlow performance ruleset to be used
(ydefault|yslow1|yblog) [ydefault]
specify an URL to log the results
include dictionary of results fields
output beacon response information
Examples:
yslow file.har
yslow -i grade -f xml -b http://server.com/beacon file1.har file2.har
yslow -info all --format plain /tmp/*.har
yslow -i basic --rulseset yslow1 -d < file.har
curl example.com/file.har | yslow -i grade -b http://server.com/beacon -v
{
"log": {
"version": "1.1",
"pages": [
{
"startedDateTime": "2012-08-16T18:27:29.000+00:00",
"id": "page_1_0",
"pageTimings": {
"onLoad": 13701,
...
HAR file
$
$
$
$
$
yslow file.har
yslow file1.har file2.har file3.har
yslow my-har-files/*.har
yslow < file.har
curl http://foo.com/file.har | yslow
-f, --format <format>
(json|xml|plain)
$ yslow foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9, i: 'ydefault', lt: 981 }
$ yslow --format xml foo.com.har
<?xml version="1.0" encoding="UTF-8"?>
<results>
<w>98725</w>
<o>89</o>
<u>http://www.foo.com/</u>
<r>9</r>
<i>ydefault</i>
<lt>981</lt>
</results>
$ yslow --format plain foo.com.har
size: 96.4K (98725 bytes)
overall score: B (89)
url: http://www.foo.com/
# of requests: 9
ruleset: ydefault
page load time: 981
-i, --info <info> (basic|grade|stats|comps|all)
$ yslow foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9, i: 'ydefault', lt: 981 }
$ yslow --info grade foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9, i: 'ydefault', lt: 981,
g: { ynumreq: { score: 92, components: [] },
ycdn:
{ score: 80, components: ['a.com', 'b.com'] },
...
yfavicon: { score: 100, components: [] }
}
}
$ yslow --info stats foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9,
stats: { doc:
{ r: 1, w: 18419
css:
{ r: 2, w: 20951
image:
{ r: 3, w: 29553
js:
{ r: 2, w: 10852
cssimage: { r: 1, w: 18950
}
}
i: 'ydefault', lt: 981,
},
},
},
},
}
$ yslow --info comps foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9, i: 'ydefault', lt: 981,
comps: [
{type:'doc', url:'foo.com', size:1841, resp:41, gzip:613},
{type:'css', url:'bar.css', size:3062, resp:98, gzip:989},
...
{type:'js', url:'baz.js', size:2445, resp:86, gzip:834}
]
}
$ yslow --info all foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9, i: 'ydefault', lt: 981,
g: {
ynumreq: { score: 92, components: [] },
... }
stats: {
doc: { r: 1, w: 18419 }, css: { r: 2, w: 20951 },
... }
comps: [
{type:'doc', url:'foo.com', size:1841, resp:41, gzip:613},
... ]
}
-d, --dict
$ yslow -i basic --dict foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9, i: 'ydefault', lt: 981,
dictionary: {
w: 'size',
o: 'overall score',
u: 'url',
r: 'total number of requests',
i: 'id of the ruleset used',
lt: 'page load time',
grades: '100 >= A >= 90 > B >= 80 > C >= 70 > D >= 60
> E >= 50 > F >= 0 > N/A = -1'
}
}
-r, --ruleset <ruleset>
(ydefault | yslow1 | yblog)
Minimize HTTP Requests
Use a Content Delivery Network
Avoid empty src or href
Add an Expires or a Cache-Control Header
Gzip Components
Put StyleSheets at the Top
Put Scripts at the Bottom
Avoid CSS Expressions
Make JavaScript and CSS External
Reduce DNS Lookups
Minify JavaScript and CSS
Avoid Redirects
Remove Duplicate Scripts
Configure ETags
Make AJAX Cacheable
Use GET for AJAX Requests
Reduce the Number of DOM Elements
No 404s
Reduce Cookie Size
Use Cookie-Free Domains for Components
Avoid Filters
Do Not Scale Images in HTML
Make favicon.ico Small and Cacheable
ydefault
(aka YSlow V2)
23 rules
Minimize HTTP Requests
Use a Content Delivery Network
Add an Expires or a Cache-Control Header
Gzip Components
Put StyleSheets at the Top
Put Scripts at the Bottom
Avoid CSS Expressions
Make JavaScript and CSS External
Reduce DNS Lookups
Minify JavaScript and CSS
Avoid Redirects
Remove Duplicate Scripts
Configure ETags
yslow1
(aka YSlow V1/classic)
13 rules
Minimize HTTP Requests
Avoid empty src or href
Gzip Components
Put StyleSheets at the Top
Put Scripts at the Bottom
Avoid CSS Expressions
Reduce DNS Lookups
Minify JavaScript and CSS
Avoid Redirects
Remove Duplicate Scripts
Reduce the Number of DOM Elements
No 404s
Avoid Filters
Do Not Scale Images in HTML
Make favicon.ico Small and Cacheable
yblog
(aka small site/blog)
15 rules
-b, --beacon <url>
-v, --verbose
$ yslow --beacon http://server.com/ foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9, i: 'ydefault', lt: 981 }
$ yslow -b http://server.com/ --verbose foo.com.har
{ w: 98725, o: 89, u: 'foo.com', r: 9, i: 'ydefault', lt: 981,
beacon: {
status: 200,
headers: {
"content-type": 'text/html; charset=utf-8',
"date": 'Thu, 02 Aug 2012 17:23:33 GMT',
"content-length": '3',
"connection": 'close'
},
body: 'ok\n'
}
}
Case: Y! Continuous
Deployment
before
after
No Performance Test Suite
before
after
!
O
BO
YSlow for PhantomJS
http://www.flickr.com/photos/pedroferrer/3615212504
$ phantomjs yslow.js http://yslow.org
-f, --format <format>
( json | xml | plain | tap | junit )
$ phantomjs yslow.js -i basic --format tap http://yslow.org
TAP version 13
1..1
ok 1 B (88) overall score
$ phantomjs yslow.js -i grade --format tap http://yslow.org
TAP version 13
1..24
ok 1 B (88) overall score
not ok 2 C (72) ynumreq: Make fewer HTTP requests
--message: This page has 7 external Javascript scripts
...
ok 3 C (70) ycdn: Use a Content Delivery Network (CDN)
--message: There are 3 static components not on CDN.
offenders:
- "yslow.org: 1 component, 8.0K (8.0K GZip)"
- "fonts.googleapis.com: 1 component, 1.0K (1.0K GZip)"
- "widgets.twimg.com: 1 component, 0.8K"
...
ok 4 A (100) yemptysrc: Avoid empty src or href
not ok 5 F (12) yexpires: Add Expires headers
--message: There are 5 static components without a far-future expiration date.
offenders:
- "http://yslow.org/stylesheets/styles-min.css"
...
$ phantomjs yslow.js -i basic --format junit http://yslow.org
<?xml version="1.0" encoding="UTF-8" ?>
<testsuites>
<testsuite name="YSlow" tests="1" failures="1">
<testcase name="overall score" status="C (79)">
<failure/>
</testcase>
</testsuite>
</testsuites>
-t, --threshold <score>
( [0-100] | [A-F] | {json} )
default: 80
-t B
-t 75
-t '{"overall": "C", "ycdn": "F"}'
-t '{"ycdn": "F", "yexpires": 75}'
-u, --ua "<user agent>"
e.g: -u "Mozilla/4.0 (compatible; MSIE 6)"
-vp, --viewport <WxH>
e.g: -vp 640x960
-ch, --headers <JSON>
e.g: -ch '{"Cookie": "foo=bar"}'
-c, --console <level>
(0: none | 1: msg | 2: msg+line+source)
YSlow + CI = BFF
node.js server
remote HAR file
curl 'http://yslow.nodester.com/?har=http://server.com/foo.har'
local HAR file upload
curl http://yslow.nodester.com/ -F '[email protected]'
HAR {json} string
curl http://yslow.nodester.com/ -d 'har={"log":{"version":"1.1", ... }}'
+
+
curl "
http://yslow.nodester.com/
?har=http%3A%2F%2Fwww.webpagetest.org%2Fexport.php%3Ftest%3D120627_MC_5WD
&i=grade
&b=http%3A%2F%2Fwww.showslow.com%2Fbeacon%2Fyslow%2F
&v=1
"
A A A A
High Performance
...
+
+
best: RUM + (YSlow + WPT) CI
http://donq.com/recipes/rum-sour/
WebPageTest
test
build
proactive
wpo
monitor
perf
users
deploy
prod
branch A branch B
...
performance boxes
prod
branch A
branch B
vs
X+100ms
X-50ms
Xms
branches comparison
http://marcelduran.com/webpagetest-api
github.com/marcelduran/webpagetest-api
+
vs
+
+
谢谢
yslow.org
@yslow
/getyslow
slides icons: http://www.iconfinder.com/

Similar documents