A little less
conversation
• Maurits Lawende
• Bert Boerland
• @projectpaas
• https://www.facebook.com/projectpaas
140
Define PerformanceDefine Performance
• SnelheidSnelheid
• BeschikbaarheidBeschikbaarheid
• StabiliteitStabiliteit
Non FunctionalNon Functional
RequirementRequirement
•Meer contentMeer content
•Meer gebruikersMeer gebruikers
•Meer hitsMeer hits
•Meer codeMeer code
•...zelfde hardware...zelfde hardware
AgendaAgenda
• Waarom performanceWaarom performance
• Wat is performanceWat is performance
• Wat doet ProjectPAASWat doet ProjectPAAS
• Hoe doet ProjectPAASHoe doet ProjectPAAS
• Tooling en tipsTooling en tips
• FreebeeFreebee
Waarom performance
Waarom performance
Waarom performance
Waarom performance
Waarom performance
Waarom performanceWaarom performance
Als je een business case hebt voor een websiteAls je een business case hebt voor een website
ben je deze kwijt als je te langzaam bent...ben je deze kwijt als je te langzaam bent...
Touch downTouch down
• Acroniemensoep:Acroniemensoep:
• RUM, HAR, EC2,CDN, WCO, FEO,RUM, HAR, EC2,CDN, WCO, FEO,
SPDYSPDY
• BS BingoBS Bingo
• Frontend, Backend, Request reduction,Frontend, Backend, Request reduction,
data URI, Sprite, closure compiler,data URI, Sprite, closure compiler,
reverse proxyreverse proxy
Time to glassTime to glass
• 0,1 seconde, voelt als instant0,1 seconde, voelt als instant
• 1.0 seconde, in de flow1.0 seconde, in de flow
• 10,0 seconde, aandachtslimiet10,0 seconde, aandachtslimiet
• ““perceptie van snelheid”perceptie van snelheid”
80% frontend80% frontend 20% backend20% backendPerformance is enkel100% relevant in de browserPerformance is enkel100% relevant in de browser
Bij mij is ‘ie wel snelBij mij is ‘ie wel snel
Want ik ben centrumWant ik ben centrum
van de wereldvan de wereld
Maar we zijn toch heelMaar we zijn toch heel
snel?snel?
Gecachde waterval
MetricsMetrics
• Als je het niet kan metenAls je het niet kan meten
kan je het niet verbeteren.kan je het niet verbeteren.
• ProjectPAAS meet 100 metrics, analyseertProjectPAAS meet 100 metrics, analyseert
en rapporteert hieroveren rapporteert hierover
FrontendFrontend
(20%)(20%)
100% browser100% browser
MiddleMiddle
(30%)(30%)
BackendBackend
(50%)(50%)
Wat doet uWat doet u
• Installeer d.o/project/paas op dev serverInstalleer d.o/project/paas op dev server
• Configureer op portaal (basic auth, 100Configureer op portaal (basic auth, 100
populaire URL’s, tijd...)populaire URL’s, tijd...)
• Wacht 6 uurWacht 6 uur
Wat doen wij?Wat doen wij?
• Controlen module werking / keyControlen module werking / key
• Starten EC2 instantie(s)Starten EC2 instantie(s)
• Meten 100+ metrics (met / zonder,Meten 100+ metrics (met / zonder,
screenshots, latency....)screenshots, latency....)
• Analyseren tegen baselineAnalyseren tegen baseline
• Doen aanbeveling in PDF (plus files)Doen aanbeveling in PDF (plus files)
• Mailen uMailen u
Tooling ‘n TipsTooling ‘n Tips
Tools voor infrastructuur
- ec2
- lamp
- python
- nodejs
- java
- drupal 7
- latex
- twig
- graphviz
- flot (graphs)
Tools voor metingen en analyse
- custom client module
- phantom
- custom proxy in python
- kyotocabinet (storage voor proxy)
- R project (statistics)
- imagemagick
- pngcrush
- optipng
- csstidy
- openssl
- libjpeg
- cairo (graphics library)
- closure compiler
- ab
- sabberworm (css analyse)
- yslow
- shadow
DNSDNS
NetworkNetwork
Nu.nl spot the SPOF
TC: 352 elementen
72 domains
72 domains
CDN / ParallelCDN / Parallel
- Vroeger meer hits
- Toen dichter bij / minder latency
- Nu met name anti dDOS
- default cookieloos
- niet default sneller
BandbreedteBandbreedte
Mbps heeftMbps heeft nietsniets met snelheid te makenmet snelheid te maken
WebWeb
Best hit is no hitBest hit is no hit
(less is more)(less is more)
(less is more)(less is more)
SPDY (compressie, binair)
Multipart response
Servers dichtbij (CDN)
Minder requests
Apache multipartApache multipart
responseresponse
Content-Type: multipart/mixed; boundary="..."
Onderseund in recente versies FF, Chrome + iE < 7
Niet hoe HTTP werkt, 'multipart requests' bestaan
niet (vraag A op, geef ABC terug)
0.000184% usage volgens Mozilla team
Geen ondersteuning in Apache / NginX
Cache expiration jungleCache expiration jungle
- Cache Control
- Expires
- Last Modified
- ETag
- Age
- Pragma
Gebruik geen HTTPS!Gebruik geen HTTPS!
Tuurlijk wel
Maar default 24-32% trager!
Apache heeft standaard 28 chipher suits
9 max nodig
HTTPS niet in varnish zonder SSL offloader
Gebruik HTTPS!Gebruik HTTPS!
SPDY
Wordt standaard HTTP/2.0?
In gebruik alle sites van google en facebook
Vereist certificaat (443) (wildcard?)
Niet te troubleshooten
LoveLove
Drupal Memory usageDrupal Memory usage
drush php-eval 
"echo
format_size(memory_get_usage());"
52.09 MB
PHP Memory usagePHP Memory usage
Integer is 4 bytes. Maar...
typedef union _zvalue_value {
long lval; // long/bools
double dval; // doubles/floats
struct { // strings
char *val; // The string
int len; // length
} str;
HashTable *ht; // arrays (hash tables)
zend_object_value obj; //objects
} zvalue_value;
struct _zval_struct {
zvalue_value value;
zend_uint refcount__gc; // for the GC, refs to this value
zend_uchar type; //item type
zend_uchar is_ref__gc; // is a ref (&)
};
PHP Memory usagePHP Memory usage
zvalue_value: 16 bytes
zval: 8 bytes
Garbage Collection: 8 bytes (PHP 5.4)
Zend Memory Managers: 16 bytes
PHP 5.3: 40 bytes
PHP 5.4: 48 bytes
PHP Memory usagePHP Memory usage
BucketsBuckets
BucketsBucketsBevat de key, pointers naar data, vorige,
volgende, eerste, laatste element..
Totaal: 96 bytes
Array van 10 int's heeft 40 bytes data.
1 zval met 10 buckets en 10 zvals voor data
Totaal: 1488 bytes (PHP 5.4)
37.2 x meer dan in C
Drupal memory usageDrupal memory usage
- Modules / include files (± 100 tot 500 KB)
- Theme registry (± 10 MB)
- Locale cache (± 1 MB)
- Static cache (± 1 MB)
- Variables (< 100 KB)
MySQL is slimMySQL is slim
Relationele databases:
DBMS bepaald hoe de data het beste opgehaald kan
worden
DBMS weet niet hoe we de data gebruiken
DOM
Pagina moet ladenPagina moet laden
binnen 2 secondebinnen 2 seconde
• MySQL zal slow query af makenMySQL zal slow query af maken
• Ook als deze 2 uur duurt...Ook als deze 2 uur duurt...
CardinaliteitCardinaliteit
Aantal verschillende waarden in een kolom.
Indexen worden meestal niet gebruikt wanneer
cardinaliteit laag is (bijv. 10% van aantal rijen). Gaat
uit van gelijke verdeling!
InnoDB doet analyse op selectivity:
hoeveel rijen blijven er over na filtering?
Union vs ORUnion vs OR
SELECT ... WHERE (a) OR (b)
SELECT ... WHERE (a)
UNION
SELECT ... WHERE (b)
TrickyTricky
- Grootste deel van de filtering in joined tables
- Order by op joined tables
- Order by i.c.m. seq. scan
- Joins op kolom zonder index
(of mogelijkheid tot het gebruik daarvan)
Free ride?Free ride?
Eerste die nu een easter-egg vindt op
projectpaas.com en hierover twittert krijgt
gratis “pluto” test!
Vragen?Vragen?
• Harder,
• Faster,
• Stronger,
• Better.
(our work is never over)

Projectpaas drupaljam 2013 rotterdam

  • 4.
    A little less conversation •Maurits Lawende • Bert Boerland • @projectpaas • https://www.facebook.com/projectpaas 140
  • 5.
    Define PerformanceDefine Performance •SnelheidSnelheid • BeschikbaarheidBeschikbaarheid • StabiliteitStabiliteit
  • 6.
    Non FunctionalNon Functional RequirementRequirement •MeercontentMeer content •Meer gebruikersMeer gebruikers •Meer hitsMeer hits •Meer codeMeer code •...zelfde hardware...zelfde hardware
  • 7.
    AgendaAgenda • Waarom performanceWaaromperformance • Wat is performanceWat is performance • Wat doet ProjectPAASWat doet ProjectPAAS • Hoe doet ProjectPAASHoe doet ProjectPAAS • Tooling en tipsTooling en tips • FreebeeFreebee
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
    Waarom performanceWaarom performance Alsje een business case hebt voor een websiteAls je een business case hebt voor een website ben je deze kwijt als je te langzaam bent...ben je deze kwijt als je te langzaam bent...
  • 14.
    Touch downTouch down •Acroniemensoep:Acroniemensoep: • RUM, HAR, EC2,CDN, WCO, FEO,RUM, HAR, EC2,CDN, WCO, FEO, SPDYSPDY • BS BingoBS Bingo • Frontend, Backend, Request reduction,Frontend, Backend, Request reduction, data URI, Sprite, closure compiler,data URI, Sprite, closure compiler, reverse proxyreverse proxy
  • 15.
    Time to glassTimeto glass • 0,1 seconde, voelt als instant0,1 seconde, voelt als instant • 1.0 seconde, in de flow1.0 seconde, in de flow • 10,0 seconde, aandachtslimiet10,0 seconde, aandachtslimiet • ““perceptie van snelheid”perceptie van snelheid”
  • 19.
    80% frontend80% frontend20% backend20% backendPerformance is enkel100% relevant in de browserPerformance is enkel100% relevant in de browser
  • 20.
    Bij mij is‘ie wel snelBij mij is ‘ie wel snel
  • 21.
    Want ik bencentrumWant ik ben centrum van de wereldvan de wereld
  • 22.
    Maar we zijntoch heelMaar we zijn toch heel snel?snel?
  • 23.
  • 24.
    MetricsMetrics • Als jehet niet kan metenAls je het niet kan meten kan je het niet verbeteren.kan je het niet verbeteren. • ProjectPAAS meet 100 metrics, analyseertProjectPAAS meet 100 metrics, analyseert en rapporteert hieroveren rapporteert hierover
  • 25.
  • 26.
    Wat doet uWatdoet u • Installeer d.o/project/paas op dev serverInstalleer d.o/project/paas op dev server • Configureer op portaal (basic auth, 100Configureer op portaal (basic auth, 100 populaire URL’s, tijd...)populaire URL’s, tijd...) • Wacht 6 uurWacht 6 uur
  • 27.
    Wat doen wij?Watdoen wij? • Controlen module werking / keyControlen module werking / key • Starten EC2 instantie(s)Starten EC2 instantie(s) • Meten 100+ metrics (met / zonder,Meten 100+ metrics (met / zonder, screenshots, latency....)screenshots, latency....) • Analyseren tegen baselineAnalyseren tegen baseline • Doen aanbeveling in PDF (plus files)Doen aanbeveling in PDF (plus files) • Mailen uMailen u
  • 35.
    Tooling ‘n TipsTooling‘n Tips Tools voor infrastructuur - ec2 - lamp - python - nodejs - java - drupal 7 - latex - twig - graphviz - flot (graphs) Tools voor metingen en analyse - custom client module - phantom - custom proxy in python - kyotocabinet (storage voor proxy) - R project (statistics) - imagemagick - pngcrush - optipng - csstidy - openssl - libjpeg - cairo (graphics library) - closure compiler - ab - sabberworm (css analyse) - yslow - shadow
  • 36.
  • 37.
  • 38.
    TC: 352 elementen 72domains 72 domains
  • 39.
    CDN / ParallelCDN/ Parallel - Vroeger meer hits - Toen dichter bij / minder latency - Nu met name anti dDOS - default cookieloos - niet default sneller
  • 41.
    BandbreedteBandbreedte Mbps heeftMbps heeftnietsniets met snelheid te makenmet snelheid te maken
  • 44.
  • 45.
    Best hit isno hitBest hit is no hit (less is more)(less is more) (less is more)(less is more) SPDY (compressie, binair) Multipart response Servers dichtbij (CDN) Minder requests
  • 46.
    Apache multipartApache multipart responseresponse Content-Type:multipart/mixed; boundary="..." Onderseund in recente versies FF, Chrome + iE < 7 Niet hoe HTTP werkt, 'multipart requests' bestaan niet (vraag A op, geef ABC terug) 0.000184% usage volgens Mozilla team Geen ondersteuning in Apache / NginX
  • 47.
    Cache expiration jungleCacheexpiration jungle - Cache Control - Expires - Last Modified - ETag - Age - Pragma
  • 48.
    Gebruik geen HTTPS!Gebruikgeen HTTPS! Tuurlijk wel Maar default 24-32% trager! Apache heeft standaard 28 chipher suits 9 max nodig HTTPS niet in varnish zonder SSL offloader
  • 49.
    Gebruik HTTPS!Gebruik HTTPS! SPDY Wordtstandaard HTTP/2.0? In gebruik alle sites van google en facebook Vereist certificaat (443) (wildcard?) Niet te troubleshooten
  • 50.
  • 51.
    Drupal Memory usageDrupalMemory usage drush php-eval "echo format_size(memory_get_usage());" 52.09 MB
  • 52.
    PHP Memory usagePHPMemory usage Integer is 4 bytes. Maar... typedef union _zvalue_value { long lval; // long/bools double dval; // doubles/floats struct { // strings char *val; // The string int len; // length } str; HashTable *ht; // arrays (hash tables) zend_object_value obj; //objects } zvalue_value; struct _zval_struct { zvalue_value value; zend_uint refcount__gc; // for the GC, refs to this value zend_uchar type; //item type zend_uchar is_ref__gc; // is a ref (&) };
  • 53.
    PHP Memory usagePHPMemory usage zvalue_value: 16 bytes zval: 8 bytes Garbage Collection: 8 bytes (PHP 5.4) Zend Memory Managers: 16 bytes PHP 5.3: 40 bytes PHP 5.4: 48 bytes
  • 54.
    PHP Memory usagePHPMemory usage BucketsBuckets BucketsBucketsBevat de key, pointers naar data, vorige, volgende, eerste, laatste element.. Totaal: 96 bytes Array van 10 int's heeft 40 bytes data. 1 zval met 10 buckets en 10 zvals voor data Totaal: 1488 bytes (PHP 5.4) 37.2 x meer dan in C
  • 55.
    Drupal memory usageDrupalmemory usage - Modules / include files (± 100 tot 500 KB) - Theme registry (± 10 MB) - Locale cache (± 1 MB) - Static cache (± 1 MB) - Variables (< 100 KB)
  • 56.
    MySQL is slimMySQLis slim Relationele databases: DBMS bepaald hoe de data het beste opgehaald kan worden DBMS weet niet hoe we de data gebruiken DOM
  • 57.
    Pagina moet ladenPaginamoet laden binnen 2 secondebinnen 2 seconde • MySQL zal slow query af makenMySQL zal slow query af maken • Ook als deze 2 uur duurt...Ook als deze 2 uur duurt...
  • 58.
    CardinaliteitCardinaliteit Aantal verschillende waardenin een kolom. Indexen worden meestal niet gebruikt wanneer cardinaliteit laag is (bijv. 10% van aantal rijen). Gaat uit van gelijke verdeling! InnoDB doet analyse op selectivity: hoeveel rijen blijven er over na filtering?
  • 59.
    Union vs ORUnionvs OR SELECT ... WHERE (a) OR (b) SELECT ... WHERE (a) UNION SELECT ... WHERE (b)
  • 60.
    TrickyTricky - Grootste deelvan de filtering in joined tables - Order by op joined tables - Order by i.c.m. seq. scan - Joins op kolom zonder index (of mogelijkheid tot het gebruik daarvan)
  • 63.
    Free ride?Free ride? Eerstedie nu een easter-egg vindt op projectpaas.com en hierover twittert krijgt gratis “pluto” test!
  • 64.
    Vragen?Vragen? • Harder, • Faster, •Stronger, • Better. (our work is never over)