Upload
marcus-deglos
View
514
Download
4
Embed Size (px)
DESCRIPTION
Slidedeck from Drupal Dev Days Dublin 2013
Citation preview
@manarthMarcus Deglos
Performance all teh things!
BREAKING NEWSDrupal is Slow!
JUST HOW SLOW ARE WE TALKING, EXACTLY?
BENCHMARKINGA single request and response
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" version="XHTML+RDFa 1.0" dir="ltr" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/terms/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:og="http://ogp.me/ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:sioc="http://rdfs.org/sioc/ns#" xmlns:sioct="http://rdfs.org/sioc/types#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#"><head profile="http://www.w3.org/1999/xhtml/vocab"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><link rel="shortcut icon" href="http://testbed.local/misc/favicon.ico" type="image/vnd.microsoft.icon" /><meta name="Generator" content="Drupal 7 (http://drupal.org)" /> <title>Welcome to Site-Install | Site-Install</title>
Compare:- Plain old HTML- Plain old HTML, with PHP overhead- Drupal
What HTML?<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" version="XHTML+RDFa 1.0" dir="ltr" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/terms/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:og="http://ogp.me/ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:sioc="http://rdfs.org/sioc/ns#" xmlns:sioct="http://rdfs.org/sioc/types#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#"><head profile="http://www.w3.org/1999/xhtml/vocab"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><link rel="shortcut icon" href="http://testbed.local/misc/favicon.ico" type="image/vnd.microsoft.icon" /><meta name="Generator" content="Drupal 7 (http://drupal.org)" /> <title>Welcome to Site-Install | Site-Install</title>
Drupal 7’s homepage.
ApacheBench
ab -n 1000 -c 10 $url
ApacheBench
ab -n 1000 -c 10 $url
1000 requests 10 concurrentrequests
How fast?
HTML 1776
PHP 1437
Drupal 32
Requests per second(mean, averaged over 3 runs of 1000 requests)
How fast?
HTML 1776
PHP 1437
Drupal 32
Requests per second(mean, averaged over 3 runs of 1000 requests)
HOW DO WE MAKE IT FASTER?
How do we make it faster?
APCMemcach
e
Varnish
Drupal page cache
Drupal block cache
Apache tuning
Custom-compiled
PHP
MySQL tuning
Front-end optimisatio
n
ESI
How do we make it faster?
APCMemcach
e
Varnish
Drupal page cache
Drupal block cache
Apache tuning
Custom-compiled
PHP
MySQL tuning
Front-end optimisatio
n
ESI
(fairly)simple
rocketscience!
SIMPLE QUICK WINSAPC, memcache, and Drupal caches
APerfectCure?
JUST WHAT IS THIS APC THING ANYWAY?APC: an opcode cache.Welcome to the world of PHP internals
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
<?phpfunction display_data(array $data) {
$buf = '';foreach ($data as $k=>$v) {
$buf .= sprintf("%s: %s n", $k, $v);}return $buf;
}
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
1 OPEN_TAG <?php2 WHITESPACE3 FUNCTION function3 WHITESPACE3 STRING display_data3 OPEN BRACKET (3 ARRAY array3 WHITESPACE3 VARIABLE $data3 CLOSE_BRACKET )3 WHITESPACE4 OPEN_CURLY {4 WHITESPACE… …………………
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
Tokens are compiled into op-codes
Each op-code is represented by an integer.
For example:
Opcode Opcode numberCONCAT 8DECLARE_CONST 143UNSET_VAR 74
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
zend_compile_file
zend_execute
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
APC replaces this
zend_execute
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute zend_execute
The compiled opcodes foreach file are cached inmemory.No need to parse again.
Simplified workflowinclude “foo.php”
Read contents of “foo.php”
Tokenize
Convert tokens to opcodes
execute
APC Summary
You do not need to change your codeAPC cache is not shared between PHP-FPM workersApache + mod php is better than PHP-FPM/CGI.
Installing APC$ sudo apt-get install php-apcReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following NEW packages will be installed: php-apc0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/79.2 kB of archives.After this operation, 233 kB of additional disk space will be used.Selecting previously unselected package php-apc.(Reading database ... 68234 files and directories currently installed.)Unpacking php-apc (from .../php-apc_3.1.7-1_i386.deb) ...Processing triggers for libapache2-mod-php5 ... * Reloading web server config apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName [ OK ]Setting up php-apc (3.1.7-1) ...$ sudo apache2ctl restart
Installing APC$ sudo apt-get install php-apcReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following NEW packages will be installed: php-apc0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/79.2 kB of archives.After this operation, 233 kB of additional disk space will be used.Selecting previously unselected package php-apc.(Reading database ... 68234 files and directories currently installed.)Unpacking php-apc (from .../php-apc_3.1.7-1_i386.deb) ...Processing triggers for libapache2-mod-php5 ... * Reloading web server config apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName [ OK ]Setting up php-apc (3.1.7-1) ...$ sudo apache2ctl restart
Use `sudo` if you need moreprivileges than your useraccount has.
Installing APC$ sudo apt-get install php-apcReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following NEW packages will be installed: php-apc0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/79.2 kB of archives.After this operation, 233 kB of additional disk space will be used.Selecting previously unselected package php-apc.(Reading database ... 68234 files and directories currently installed.)Unpacking php-apc (from .../php-apc_3.1.7-1_i386.deb) ...Processing triggers for libapache2-mod-php5 ... * Reloading web server config apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName [ OK ]Setting up php-apc (3.1.7-1) ...$ sudo apache2ctl restart
Package manager commandmay vary according to O/S.Redhat/CentOS usually uses`yum install` instead.
Installing APC$ sudo apt-get install php-apcReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following NEW packages will be installed: php-apc0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/79.2 kB of archives.After this operation, 233 kB of additional disk space will be used.Selecting previously unselected package php-apc.(Reading database ... 68234 files and directories currently installed.)Unpacking php-apc (from .../php-apc_3.1.7-1_i386.deb) ...Processing triggers for libapache2-mod-php5 ... * Reloading web server config apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName [ OK ]Setting up php-apc (3.1.7-1) ...$ sudo apache2ctl restart
The name of the packagevaries according to distro,for example `php-pecl-apc`in some variations.
Installing APC$ sudo apt-get install php-apcReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following NEW packages will be installed: php-apc0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/79.2 kB of archives.After this operation, 233 kB of additional disk space will be used.Selecting previously unselected package php-apc.(Reading database ... 68234 files and directories currently installed.)Unpacking php-apc (from .../php-apc_3.1.7-1_i386.deb) ...Processing triggers for libapache2-mod-php5 ... * Reloading web server config apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName [ OK ]Setting up php-apc (3.1.7-1) ...$ sudo apache2ctl restart
Restart Apache for thechange to take effect.
Verifying APC is running$ php -i |grep –i apcAdditional .ini files parsed => /etc/php5/cli/conf.d/apc.ini,apcAPC Support => disabledAPC Debugging => Disabledapc.cache_by_default => On => Onapc.canonicalize => On => Onapc.coredump_unmap => Off => Offapc.enable_cli => Off => Offapc.enabled => On => Onapc.file_md5 => Off => Offapc.file_update_protection => 2 => 2apc.filters => no value => no valueapc.gc_ttl => 3600 => 3600
Verifying APC is running$ php -i |grep –i apcAdditional .ini files parsed => /etc/php5/cli/conf.d/apc.ini,apcAPC Support => disabledAPC Debugging => Disabledapc.cache_by_default => On => Onapc.canonicalize => On => Onapc.coredump_unmap => Off => Offapc.enable_cli => Off => Offapc.enabled => On => Onapc.file_md5 => Off => Offapc.file_update_protection => 2 => 2apc.filters => no value => no valueapc.gc_ttl => 3600 => 3600
Use `php –i` to show the PHPenvironment configuration
Verifying APC is running$ php -i |grep –i apcAdditional .ini files parsed => /etc/php5/cli/conf.d/apc.ini,apcAPC Support => disabledAPC Debugging => Disabledapc.cache_by_default => On => Onapc.canonicalize => On => Onapc.coredump_unmap => Off => Offapc.enable_cli => Off => Offapc.enabled => On => Onapc.file_md5 => Off => Offapc.file_update_protection => 2 => 2apc.filters => no value => no valueapc.gc_ttl => 3600 => 3600
Use `grep` to filter for configrelated just to APC. The `-i`flag is to ignore case.
Verifying APC is running$ php -i |grep –i apcAdditional .ini files parsed => /etc/php5/cli/conf.d/apc.ini,apcAPC Support => disabledAPC Debugging => Disabledapc.cache_by_default => On => Onapc.canonicalize => On => Onapc.coredump_unmap => Off => Offapc.enable_cli => Off => Offapc.enabled => On => Onapc.file_md5 => Off => Offapc.file_update_protection => 2 => 2apc.filters => no value => no valueapc.gc_ttl => 3600 => 3600
Hooray!
Verifying via the browser
Link to PHPconfiguration
Admin » Reports » Status
Verifying via the browser
Benchmarking time!
How fast?
Requests per second(mean, averaged over 3 runs of 1000 requests)
No APC 3.75
APC 3.44
Wait, WHAT?!
How fast?
Requests per second(mean, averaged over 3 runs of 1000 requests)
No APC 3.75
APC 3.44
I cheated.This is what happens whenyou don’t assign enoughmemory to APC.
How fast?
Requests per second(mean, averaged over 3 runs of 1000 requests)
No APC 3.75
APC 3.44
APC 12.49
MemcacheWhat does it do?
cache_get
if ($cache = cache_get('image_styles', 'cache')) { $styles = $cache->data;}else { // Do a load of work // And look up all sorts of things in the SLOW db.}
cache_get
if ($cache = cache_get('image_styles', 'cache')) { $styles = $cache->data;}else { // Do a load of work // And look up all sorts of things in the SLOW db.}
cache_get is pluggable.It’s a key-value store.By default it uses the DB.
cache_get in the DB.
cache_get('image_styles', 'cache’);
SELECT * from cache WHERE cid='image_styles’;
A quick summaryMemcache moves load from the DB to
memcache.Memcache stores data in memory (unlike DB
which stores it on disk). Memory is faster.Memcache is non-persistent. Don’t store data
you’re not prepared to lose.
Installing Memcache$ sudo apt-get install memcached php5-memcacheReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following package was automatically installed and is no longer required: libmemcached6Use 'apt-get autoremove' to remove them.Suggested packages: libcache-memcached-perl libmemcachedThe following NEW packages will be installed: memcached php5-memcache0 upgraded, 2 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/121 kB of archives.After this operation, 375 kB of additional disk space will be used.Selecting previously unselected package memcached.(Reading database ... 68214 files and directories currently installed.)……Setting up memcached (1.4.13-0ubuntu2) ...Starting memcached: memcached.Setting up php5-memcache (3.0.6-1) ...$ sudo /etc/init.d/memcached startStarting memcached: memcached.
Installing Memcache$ sudo apt-get install memcached php5-memcacheReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following package was automatically installed and is no longer required: libmemcached6Use 'apt-get autoremove' to remove them.Suggested packages: libcache-memcached-perl libmemcachedThe following NEW packages will be installed: memcached php5-memcache0 upgraded, 2 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/121 kB of archives.After this operation, 375 kB of additional disk space will be used.Selecting previously unselected package memcached.(Reading database ... 68214 files and directories currently installed.)……Setting up memcached (1.4.13-0ubuntu2) ...Starting memcached: memcached.Setting up php5-memcache (3.0.6-1) ...$ sudo /etc/init.d/memcached startStarting memcached: memcached.
memcached is the memcache server. It’s a standalone program, completely separate from PHP.
Installing Memcache$ sudo apt-get install memcached php5-memcacheReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following package was automatically installed and is no longer required: libmemcached6Use 'apt-get autoremove' to remove them.Suggested packages: libcache-memcached-perl libmemcachedThe following NEW packages will be installed: memcached php5-memcache0 upgraded, 2 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/121 kB of archives.After this operation, 375 kB of additional disk space will be used.Selecting previously unselected package memcached.(Reading database ... 68214 files and directories currently installed.)……Setting up memcached (1.4.13-0ubuntu2) ...Starting memcached: memcached.Setting up php5-memcache (3.0.6-1) ...$ sudo /etc/init.d/memcached startStarting memcached: memcached.
php5-memcache is the PHP extension that provides functions for PHP to exchange data with a memcache server.
Installing Memcache$ sudo apt-get install memcached php5-memcacheReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following package was automatically installed and is no longer required: libmemcached6Use 'apt-get autoremove' to remove them.Suggested packages: libcache-memcached-perl libmemcachedThe following NEW packages will be installed: memcached php5-memcache0 upgraded, 2 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/121 kB of archives.After this operation, 375 kB of additional disk space will be used.Selecting previously unselected package memcached.(Reading database ... 68214 files and directories currently installed.)……Setting up memcached (1.4.13-0ubuntu2) ...Starting memcached: memcached.Setting up php5-memcache (3.0.6-1) ...$ sudo /etc/init.d/memcached startStarting memcached: memcached.
There’s another PHP extension called php5-memcached, which does the same thing.PHP also has duplicate modules!
Installing Memcache$ sudo apt-get install memcached php5-memcacheReading package lists... DoneBuilding dependency tree Reading state information... DoneThe following package was automatically installed and is no longer required: libmemcached6Use 'apt-get autoremove' to remove them.Suggested packages: libcache-memcached-perl libmemcachedThe following NEW packages will be installed: memcached php5-memcache0 upgraded, 2 newly installed, 0 to remove and 8 not upgraded.Need to get 0 B/121 kB of archives.After this operation, 375 kB of additional disk space will be used.Selecting previously unselected package memcached.(Reading database ... 68214 files and directories currently installed.)……Setting up memcached (1.4.13-0ubuntu2) ...Starting memcached: memcached.Setting up php5-memcache (3.0.6-1) ...$ sudo /etc/init.d/memcached startStarting memcached: memcached.
Start the memcache server
Drupal config for MemcacheDownload the memcache module.Add the configuration to settings.php.
settings.php changes/** * Memcache configuration. */define('MEMCACHE_PATH', 'sites/all/modules/contrib/memcache/memcache.inc'); // Include the base cache class that memcache extends.include_once('./includes/cache.inc');// Include the memcache files.include_once(MEMCACHE_PATH); // Optionally configure a prefix; most sites won't need this.# $conf['memcache_key_prefix'] = 'foo';
// Declare memcache as a potential backend.$conf['cache_backends'][] = MEMCACHE_PATH; // Set the default cache to use memcache.$conf['cache_default_class'] = 'MemCacheDrupal';
// Form-cache must use non-volatile storage.$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
How fast?
Requests per second(mean, averaged over 3 runs of 1000 requests)
APC 12.49
Memcache 29.06
How fast?
Page cache 55
+ APC 190
+ APC +memcache 193
Requests per second(mean, averaged over 3 runs of 1000 requests)
APC 12.49
Varnish…live demo!(uh oh…)
A QUICK SUMMARY
Speeding up the snail• APC and memcache are quick wins.• Turn on page-caching and block-caching• Use Varnish for static assets• Use Varnish + ESI to cache authenticated users
Thanks for coming!
Blog: http://deglos.com Email: [email protected] Slides: http://slideshare.net/manarth Twitter: @manarth
Questions?
Build websites Develop modules Offer technical consultancy
http://techito.co.uk/