1. Launch with Conﬁdence!
Performance and Scalability
Presented by: Shawn Smiley [Lead Architect]
2. About Me
• Shawn S. Smiley
• Lead Architect at
• 15+ years experience
in Internet software
• 5+ years with Drupal
• Recently married
§ At a Glance
§ Key Clients
§ Achieve Services
Intro to Caching
§ How it Works?
What is Memcached?
When and Why You Should Use It?
§ Performance and Stats
§ Components of a Memcache Solution
§ PECL Memcache vs Memcached
Verifying and Troubleshooting
§ Minimal Install Veriﬁcation
§ When to Use It
§ Tuning Tips
Are There Alternatives?
4. Achieve at a Glance
Achieve Internet, Inc."
1767 Grand Avenue, Suite #2 | San Diego, CA 92109 | U.S.A."
Ron Huber, Chief Executive Ofﬁcer"
Achieve leverages best-in-class Open Source web application development experience, and tools to create
optimized platforms for enterprise clients. "
800.618.8777 | email@example.com"
Achieve is a
leading software development company that leverages Drupal to develop advanced
enterprise web and mobile solutions for an array of clients in varying verticals. Achieve has a
singular goal: To help you launch your advanced digital platforms with conﬁdence.
Our ethos is “it’s not magic, it’s excellence,” and our all-star developers deliver on that promise
with every new project we take on by consistently exceeding client expectations.
5. Key Clients: Media & Entertainment
6. Additional Key Clients
7. Achieve Services
Achieve builds custom enterprise IT management systems to solve the most complex business challenges.
Achieve makes integration easy so you can focus on what is most important to your business – your customers.
Optimize the performance of your web site or application to increase productivity and streamline operations.
Achieve has vast experience in creating global web solutions that far out perform the competition.
‘Going Mobile’ is no longer an option. With Achieve you won’t have to compromise design for utility.
Mobility & End User
8. Intro to Caching
9. Intro to Caching
• A cache is a system that stores the results of some
processing for repeated later use.
• Example in Drupal is the page cache.
• Utilized via the cache_set() and cache_get() Drupal API
• Caches in Drupal are Key/Value pairs.
10. Intro to Caching: How it Works?
11. Intro to Caching: How it Works?
12. What is Memcached?
13. What is Memcached?
• “Memcached is an in-memory key-value store for small
chunks of arbitrary data (strings, objects) from results of
database calls, API calls, or page rendering.” –
• A system to cache data in RAM rather than in database.
• Replaces Drupal’s default database cache.
• Just one component of your high performance scalable
14. When & Why Should You Use It?
15. Why Use Memcached?
• Improves cache read/write performance
• Reduces the number of database queries
• Reduces database load
• Can improve page load performance*
• Allows distributing the cache load to separate servers
• Moves the threshold for performance degradation to a higher
number of concurrent users.
* By itself, Memcache.d won’t provide a signiﬁcant performance improve on low traﬃc sites. The page load performance
boost comes mostly from oﬄoading work from your database server so that the system can handle more requests.
16. Performance Stats
• Performance & Scalability
• Cache read performance: 4X Faster
• Cache write performance: 60X Faster
• Actual statistics* (Drupal core vs. Memcached)
• 1000 Cache write operations: 12 seconds vs. 0.2 seconds
• 1000 Cache read operations: 0.4 seconds vs. 0.1 seconds
• DB queries: 3028 vs. 13
* Cache Read/Write stats are for performing 2,000 operations (1,000 write, 1,000 read)
* Your results will vary, tests performed on a single AWS instance with default D7 install
17. Performance Stats
18. Performance Degradation Threshold
19. When to (or not) use Memcached
• Use Memcached when:
• Signiﬁcant portion of site traﬃc is authenticated users or when
static page caching isn’t an option.
• Have adequate server resources to allocate to Memcached
without negatively impacting other services.
• Have enough traﬃc to make a diﬀerence.
• Don’t use Memcached when:
• Site is completely anonymous traﬃc
Static caching is better for this (such as Varnish or Boost)
• Low traﬃc sites that are not straining server resources
Probably won’t see any noticeable beneﬁt and have increased the
complexity of the system.
• Severely resource constrained single server hosting
Can negatively impact performance/scalability in this case.
21. Components of Memcached Solution
• Memcached Daemon (v 1.4.x)
• PHP Extension
• PECL Memcache (> 3.x)
• PECL Memcache.d (> 2.x)
• TIP: Use the setting “memcache_extension” to select
which library to use if you have both installed.
• Memcache Module
• Drupal 8, Drupal 7.9+, Pressﬂow 6, or Drupal
6 with core patch
22. PECL Memcache vs. Memcached
Stable, not as frequently updated
Newer, more features
Easy to install
More complicated install with multiple
Lower PHP memory footprint in some
Can be slightly faster in some cases
Slightly better for single server
Memcached daemon installations.
Slightly better for distributed or
clustered Memcached daemon
* Generally, we default to PECL Memcache unless a project can take
advantage of the additional features provided by PECL Memcached.
24. Minimal Install: Daemon Conﬁguration
/etc/memcached.conf (or /etc/default/memcached)
• Conﬁguration ﬁle for the memcached daemon
• Important settings:
• -m 64
Amount of memory in MB to allocate.
• -p 11211
TCP/IP Port to listen for cache requests on.
• -l 127.0.0.1
IP Address to listen for cache requests on.
25. Determining Memcached size
• Look at the data size of all cache* tables in your DB.
• Use this handy query to get the total size:
SELECT count(*) TABLES,
WHERE TABLE_SCHEMA=’dbname' AND TABLE_NAME LIKE "cache%"
• Total memory allocated to Memcached should be at least
the size returned in the “DATA” column.
• I usually like to add at least 50% to this size to start with.
26. Note about Memcached security
• Basically there are no security controls in Memcached.
• Any user or application that can establish a TCP
connection to the Memcached daemon can access all
data stored within Memcached.
• Security Best Practices:
• Always set the daemon to listen on a speciﬁc IP address/
• Use 127.0.0.1 if there is only 1 Memcached server and it is
running on the same server as the web server.
• Use iptables or other ﬁrewall to restrict access to the
Memcached TCP/IP Port(s).
27. Minimal Install: Drupal Settings.php
// Required minimum settings.
$conf['cache_backends'] = 'sites/all/modules/contrib/memcache/memcache.inc';
$conf['cache_default_class'] = 'MemCacheDrupal';
$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
// Optional, but recommended settings.
$conf['memcache_key_preﬁx'] = 'ai_'; // Remember about 250 byte key size limit.
$conf['lock_inc'] = 'sites/all/modules/contrib/memcache/memcache-lock.inc';
$conf['memcache_stampede_protection'] = TRUE;
// The following are required only if Memcached is on a diﬀerent server.
$conf['memcache_servers’] = array(’10.11.12.13:11211' => 'default');
$conf['memcache_bins’] = array('cache' => 'default');
// Only if both PECL Memcache and Memcached are installed.
$conf['memcache_extension'] = 'Memcache';
30. Minimal Install: Verifying
• Memcache Admin Module
• Adds conﬁguration page at Conﬁguration => Memcached
• Enable the option “Show Memcache statistics” to see a log of
all Memcached calls on each page.
• Devel Module
• Enable the Query Logging option.
• Memcache Admin UIs:
31. Minimal Install: Verifying - Memcache
• Enable the module “Memcache Admin”
• Conﬁg page at Conﬁguration => Memcache
• Enable the option “Show Memcache statistics” to see a log of
all Memcached calls on each page.
32. Minimal Install: Verifying - Devel
• In Devel Settings, enable “Display query log”
• Reload pages, you’ll see a list of all queries executed
• Ensure there are no calls to any “cache*” tables (other than
• Ensure there are no calls to the “semaphore” table (lock.inc)
35. Distributed Install: Overview
• When to use
• Types of distributed installs
• Conﬁguration Steps
36. Distributed Install: When To Use It
• High traﬃc sites making more cache requests than a
single instance can eﬃciently handle.
• The default conﬁg of a Memcached daemon will support up
to 1,024 simultaneous connection requests.
• Large caches where it makes sense to separate out
cache data by type or update frequency (e.g. cache_menu
is usually pretty static whereas the default cache could
be constantly changing)
• I start looking at this as an option when the memory
allocation for Memcached starts getting over 128MB.
37. Distributed Install: Types
• Distributes cache load across multiple Memcached servers.
• Allows for handling larger numbers of cache operations.
Useful for high traﬃc sites.
• NOTE: Caches are not replicated between multiple servers by
• Segments diﬀerent types of caches to diﬀerent servers.
• Useful for very large caches with varying characteristics (e.g.
segmenting mostly read-only caches from caches that are
• You can combine both of the above approaches (e.g. have
multiple bins with each bin spread across multiple servers).
38. Distributed Install: Conﬁguration
• Server conﬁguration is same as the basic install, just on
• Make sure the Memcached daemon is conﬁgured to listen on
each servers external IP address (not 127.0.0.1).
• All daemons within a cluster should be conﬁgured with the
same memory allocation.
• You can have multiple Memcached daemons running on a
single server. Just use diﬀerent ports.
39. Distributed Install: Conﬁguration
Additional settings needed in the site settings.php ﬁle
// Must be exactly the same on all web servers.
$conf['memcache_servers' = array(
'10.11.12.13:11211' => 'default',
'10.11.12.14:11211' => 'default',
'10.11.12.15:11211' => 'my_readonly_bin',
$conf['memcache_bins’] = array(
'cache' => 'default', // must specify if setting this variable.
'cache_bootstrap' => 'my_readonly_bin',
'cache_menu' => 'my_readonly_bin',
'cache_path' => 'my_readonly_bin',
// If using PECL Memcached.
$conf['memcache_options'] = array(
Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT,
40. Tuning Tips
• Watch the “Available Memory”, “Evictions” (==0), and
“reclaimed” (==0) stats to determine if memory allocation
needs to be adjusted.
• Watch “Max Connection Errors” (==0), “Accepting
Connections” (==1), “Connection Yields” (==0), and
“Listen Disabled Number” (==0) to determine when you
need to move from a single memcached server to
Tip: See this page for a description of various stat counters:
42. Are There Alternatives?
• Great for persistent or replicated caches.
• Supports additional caching options such as structured data
• More eﬃcient support for selective cache delete/expiration.
• Nice comparison to Memcache:
MongoDB Cache (https://drupal.org/project/mongodb)
• Great for extremely large caches or when a large amount of
data must be stored in a single cache key.
By adding Memcached to our hosting solution we:
• Reduced the number of database queries.
• Reduced the load on our database servers.
• Reduced the amount of time the site spends accessing
• Reduced the rendering time for page requests.
• Improved the overall scalability of the site.
44. Thank You
§ Lead Engineer"
§ Drupal: shawn_smiley"
45. Connect with Achieve
If you have any further questions or would like to get in touch with
Achieve you can do so on these various channels: