In this session we will present an overview from the point of view 'system that implementative on how to get the best performance from your drupal application.
We will also show examples of use cases for drupal scalable infrastructure.
DRUPAL PERFORMANCE E SCALABILITÀ
STEFANO MAINARDI - STEFANO@TWINBIT.IT
MARCO GIACOMASSI - MARCO@TWINBIT.IT
About Stefano
• Drupal developer since 2007
• Twinbit co-founder
• ILDN founder
• I’m a geek and i love Open Source software
@stefanomainardi
stefano@twinbit.it
About Marco
• web and open source consultant and developer
• interested in knowledge management, GIS, and integration of
systems with CMS
• Twinbit co-founder
@marcogiaco
marco@twinbit.it
Agenda
• Why speed is so important
• Tips for frontend optimization
• Tips for backend optimization
• Q&A time (we hope!)
Amazon's calculated that a
page load slowdown of just
one second could cost it
$1.6 billion in sales each
year.
Source: http://www.tagman.com/mdp-blog/2012/03/just-one-second-delay-in-page-load-can-cause-7-loss-in-customer-conversions/
Google has calculated that
by slowing its search results
by just four tenths of a
second they could lose 8
million searches per day
Source: http://www.tagman.com/mdp-blog/2012/03/just-one-second-delay-in-page-load-can-cause-7-loss-in-customer-conversions/
Start there.
80-90%of the end-user response time is spent on the frontend.
Source: http://www.stevesouders.com/blog/2012/02/10/the-performance-golden-rule/
1. When we request a URL a DNS lookup is done
2. Download the html and start reads from top
3. CSS Block rendering. The browser starts rendering
once it has all the style declarations
4. Javascript blocks downloads. Make sure to serve
js at last
5. Circa 4/8 assets (images / js / css /fonts) are downloaded
in parallel from the same domain
www.twinbit.it ? IP = 188.40.59.145
How does a browser work?
Our goals
1. Put CSS on top (it blocks rendering)
2. Put JS on bottom (it blocks downloads)
3. Minimize the number of requests (CSS / js / images, fonts)
4. Send less data as possible
5. Spread your assets over several domains (CDN)
Use aggregation
Advanced CSS/JS Aggregation module
http://drupal.org/project/advagg
Fully cached CSS/JS assets allow for zero file I/O if the
Aggregated file already exists. Results in better page generation
performance
On demand generation of CSS/JS Aggregates. If the file doesn't
exist it will be generated on demand.
Gzip support. All aggregated files can be pre-compressed into
a .gz file and served from Apache. This is faster then gzipping
the file on each request.
Use aggregation
Advanced CSS/JS Aggregation module
http://drupal.org/project/advagg
built-in support for !
!
HTTP Parallel Request & Threading Library
https://drupal.org/project/httprl
Image requests
1. Sprites: One file for all UI elements (1 request)
2. Use automatic tools like Compass
for generate sprites
http://compass-style.org/help/tutorials/spriting/
3. Optimize imageshttps://drupal.org/project/imageapi_optimize
4. Use font-based icons https://drupal.org/project/fontello
Monitor your application
YSlow
Chrome and Firefox developer tools, are your
best friends
Google page speed tools
or use external services like
New relic
and know the tools
Anonymous vs authenticated
Identify the type of your application in
order to
apply appropriate caching policies.
!
The more static the application is the
more it will be served by the “client-
side” caches.
!
Highly dynamic application will need
efficient “application-side” caching.
Reverse proxy
A proxy server that retrieves resources on behalf of a client from
one or more servers. These resources are then returned to the
client as though they originated from the server itself.
!
Varnish is widely adopted, open source and natively supported
by Drupal 7.x
● from 300x to 1000x faster
● serves static pages and assets
● powerful configuration language
● ESI (https://drupal.org/project/esi)
● can act as load balancer
More links
https://drupal.org/node/1054886
https://drupal.org/project/varnish
https://www.varnish-cache.org/trac/wiki/VarnishAndDrupal
!
Web servers
Drupal configuration / coding
!
● use static caching $foo = &drupal_static(__FUNCTION__);
● use cache_set/cache_get
● disable unneeded modules
● avoid variable_set() in frontend pages
and cache invalidation
● keep app logic away from template, use
hook_preprocess functions
● don’t reinvent the wheel! api.drupal.org
is your best friend!
● keep drupal performance configuration
in settings.php
!
System
!
● configure Apache MaxClients
○ ((System RAM) – (RAM used by other processes)) /
(httpd process size) = MaxClients
○ KeepAliveTimeout < 5 sec
!
● use APC
○ apc.stat ~ 0
○ apc._num_files_hint > 1000
!
● use Nginx if no proxy or CND
More links
https://groups.drupal.org/high-performance
!
● VM-C1: 1 cpu, 2 GB ram
● VM-C2: 2 cpu, 4 GB ram
● VM-C3: 4 cpu, 8 GB ram
Web servers: more is much better
Session management
Drupal is saving sessions to database. This can be used in a cluster
but we want to save database queries.
!
To do this we can use different solutions:
!
!
!
! Memcache Redis MongoDB
pros very easy and
fast
very fast native replication
cons no native
replication
no native replication cluster configuration
Drupal
compatibility
mature medium medium
Application caching
Drupal has several caches, by default stored in database. To avoid
loading the database we can still use different solutions:
!
● memcache / redis
● mongodb
!
!
More links
https://drupal.org/project/memcache
https://drupal.org/project/mongodb
http://www.mongodb.org/
!
!
!
Database
MySQL
!
● 3% core queries goes to slaves
● tag queries to be slave query (also using query_alter)
● tag queries to be slave query also using views UI
!
Tune innodb buffer size
!
SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS
FROM (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB' and
table_schema = ‘drupal_db’) A;
!
!
Use MySQL query cache!
Control servers
● control server: monitoring software (munin), phpmyadmin,
configuration engine (Puppet)
!
● staging server: should contain a copy of the production
environment. This is used for testing and deploying.
!
● file storage: user files
Interesting tools:
!
http://gatling-tool.org/
http://newrelic.com/
!
!
!
!
!
!
Performances
Anon users:
!
●proxy (varnish): 2000 req/s anonymous users
●60 apache processes per cpu core, 1 req/s per process
!
Auth users:
!
●web server (apache): 14 apache processes per cpu core in virtual env, 1 req/s per process
(consider clustering overhead). Could be much better using other hypervisors, with WMWARE
we reached18/20)
●web server (apache): 40MB per process
Example
Target utenti
(numero di sessioni utente aperte sul
sistema in un giorno)
300000
Peso medio hit in KB 100
Page hits per utente
(numero di pagine visitate da un utente)
10
Tot hits/giorno 3M