Memcached
             http://download.tangent.org/talks/Memcached%20Study.pdf




Thursday, April 23, 2009
memcached is a high-performance, distributed memory object
                           caching system, generic in nature, b...
Who?
                     • Facebook
                     • Yahoo
                     • Amazon
                     • Liv...
Why?
                           (aka why would I...)‫‏‬




Thursday, April 23, 2009
Thursday, April 23, 2009
LiveJournal

                     • Origin of memcached
                     • 30G of cache. Terabytes of data
           ...
Mixi

                     • Memcached on dedicated servers
                     • 300 servers in production (reuse old
  ...
Thursday, April 23, 2009
Patrick Lenz
                           Eins.de
                           http://poocs.net




Thursday, April 23, 2009
Grazr



Thursday, April 23, 2009
100+ Nodes
                  2gigs a Node         Processing



                                                    Incomi...
How



Thursday, April 23, 2009
Server

                     • Slab Allocator
                     • Libevent based
                     • Simple Protocol...
Clients


                     •     Client hashes Key to Server List (distribution)‫‏‬

                     •     Serial...
Consistent Hash




Thursday, April 23, 2009
So what should I ask?

                     • How do I dump data?
                     • How is it redundant? *
          ...
Details on the Server?

                           • set/get/replace/add
                           • append/prepend
     ...
Platforms

                     • FreeBSD and Linux are top tier
                     • Windows exists
                   ...
Examples



Thursday, April 23, 2009
Ruby



Thursday, April 23, 2009
 # Set up client object

                            require 'memcache'
                            servers = ['127.0.0.1:...
# Get; fall through to Rails' MySQL load if missing

                            key = "recent_posts"
                    ...
# Ghetto locking implementation for memcache-client
                            # from http://fauna.rubyforge.org/svn/inte...
PHP



Thursday, April 23, 2009
/**
           * Initalize Memcache object and add local server 127.0.0.1 using port 11211
           */
          $cache ...
/** Look in cache, if not found, set object (misses null) **/
                       if (!$user = $cache->get($user_key)) ...
/* Get user counter value (does not handle add fail) */
                       if (!$counter = $cache->get($counter_key)) ...
/* Print out stats from memcached server */
                           print_r($cache->getStats());

                     ...
C



Thursday, April 23, 2009
libmemcached

                     • C/C++ (many language wrappers)
                     • Multiget support
              ...
memcached_st *memc;
                           memcached_return rc;
                           memc= memcached_create(NULL...
memcached_server_st *servers;
                 memcached_st *memc= memcached_create(NULL);
                 char servernam...
char *key= "foo";
                           char *value;
                           size_t value_length= 8191;
          ...
memcached_return rc;
            char *keys[]= {"fudge", "son", "food"};
            size_t key_length[]= {5, 3, 4};
     ...
Memcached foo;
                           char *value_set= "Data for server A";
                           char *master_ke...
Application Integration



Thursday, April 23, 2009
lighttpd/mod_memcache
                    • Cache files from disk
                    • Specify mime/types
                ...
Apache (mod_memcached)‫‏‬
                    • CAS operations exposed
                    • GET/PUT/DELETE operations
   ...
NGINX
                     • Support variable Time outs
                     • Based on Perl
                     • http:/...
Memcached Functions
                          for MySQL
                         (and Drizzle)



Thursday, April 23, 2009
Overview...

                     • Uses UDF API and libmemcached
                     • Manage memcached Cluster via SQL
...
Thursday, April 23, 2009
Installation

                     •     CREATE FUNCTION memc_servers_add RETURNS INT SONAME
                           "l...
Functions Available
                     • memc_servers_set();
                     • memc_servers_behavior_set()
        ...
Setting via SELECT
           select id, url, memc_set(concat('feeds', md5(url)), url) from feeds;

           select memc...
Trigger
          DROP TRIGGER IF EXISTS feed_insert;
          CREATE TRIGGER feed_insert BEFORE INSERT ON feeds FOR EACH...
Memcached Replication
                      via MySQL

                  INSERT INTO table_a VALUES (“key”, “value”, “valu...
Implementation



Thursday, April 23, 2009
Limits

                     • Key Size (250 bytes) (1.2 <)‫‏‬
                     • Data Size (under 1 megabyte)‫‏‬
    ...
LRU
                    • Least recently accessed items are up for
                           eviction

                  ...
Threads
                    • No single-threading in versions past 1.2
                    • Great for large instances (16...
Slab Allocator

                     • Memory permanently allocated from OS
                     • Classes created by chun...
Binary Protocol

                            24             HEADER                  Required
                            b...
Binary Protocol
                            MAGIC          Opcode              Key Length
                             (1 ...
Response Header
                            MAGIC          Opcode              Key Length
                             (1 ...
Tools



Thursday, April 23, 2009
Protocol

                     • Telnet’able (see doc/protocol.txt)‫‏‬
                     • Store commands are binary (n...
Thursday, April 23, 2009
memcached-tool

                     • Example minimal monitoring tool
                     • Shows details of server stat...
libmemcached Tools

                     • memcp
                     • memrm
                     • memstat
             ...
MRTG


                     • Plenty of interfaces monitored
                     • Old technology, been around forever


...
Thursday, April 23, 2009
...and others

                     • Cacti
                      • http://dealnews.com/developers/cacti/
                ...
Current Connections




Thursday, April 23, 2009
Requests Per Second




Thursday, April 23, 2009
DTrace

                     • User static DTrace probes to probe
                           application logic

          ...
Tuning



Thursday, April 23, 2009
Connections
                     • Don't fear setting -c (max conns) too high!
                     • Watch 'listen_disabl...
Memory
                     • Don't set -m (max bytes) too high
                     • -m only controls memory for stored ...
Things to remember!
                     • Memcached is great for scaling, but abuse
                           will slow ...
Shrink data!
                     • Especially if you use multiget, try to use
                           shorter keys

  ...
Future Solutions!
                     • Evaluate the binary protocol in 1.3
                     • New tricks will be pos...
1.2.8
                     • Bugfixes
                     • New stats
                      • listen_disabled_num
        ...
1.3.* Beta

                     • Scalability improvements
                     • New stats (per-slab get/miss/etc counte...
ASCII Protocol vs Binary Protocol (memcached-1.3.1 Development Branch)
         task completion time (secs)




          ...
Future
            • 1.4.0 stable
             • Multiple Engine Support
             • Durable
             • Highly Thre...
More Resources...
                     • http://danga.com/memcached/
                     • #memcached on Freenode
       ...
Upcoming SlideShare
Loading in...5
×

Plugin Memcached%20 Study

2,351

Published on

Plugin Memcached

Published in: Education, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,351
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
30
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Plugin Memcached%20 Study

  1. 1. Memcached http://download.tangent.org/talks/Memcached%20Study.pdf Thursday, April 23, 2009
  2. 2. memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. Thursday, April 23, 2009
  3. 3. Who? • Facebook • Yahoo • Amazon • LiveJournal • Mixi • ... Thursday, April 23, 2009
  4. 4. Why? (aka why would I...)‫‏‬ Thursday, April 23, 2009
  5. 5. Thursday, April 23, 2009
  6. 6. LiveJournal • Origin of memcached • 30G of cache. Terabytes of data • Writes to DB based on reads from the DB, not cache Thursday, April 23, 2009
  7. 7. Mixi • Memcached on dedicated servers • 300 servers in production (reuse old MySQL Servers) • 4/8 gigs of Memory • 15,000 qps / 400Mbps throughput Thursday, April 23, 2009
  8. 8. Thursday, April 23, 2009
  9. 9. Patrick Lenz Eins.de http://poocs.net Thursday, April 23, 2009
  10. 10. Grazr Thursday, April 23, 2009
  11. 11. 100+ Nodes 2gigs a Node Processing Incoming Data Memcached Thursday, April 23, 2009
  12. 12. How Thursday, April 23, 2009
  13. 13. Server • Slab Allocator • Libevent based • Simple Protocol (no xml) • Server has Internal Hash Table • Servers know nothing about each other Thursday, April 23, 2009
  14. 14. Clients • Client hashes Key to Server List (distribution)‫‏‬ • Serializes the Object (server just likes byte arrays)‫‏‬ • Compresses data Thursday, April 23, 2009
  15. 15. Consistent Hash Thursday, April 23, 2009
  16. 16. So what should I ask? • How do I dump data? • How is it redundant? * • How does it handle failover?* • How does it authenticate? Thursday, April 23, 2009
  17. 17. Details on the Server? • set/get/replace/add • append/prepend • increment/decrement • cas (compare and swap atomic!)‫‏‬ • stats (detail)‫‏‬ Thursday, April 23, 2009
  18. 18. Platforms • FreeBSD and Linux are top tier • Windows exists • Solaris (as of 1.2.5)‫‏‬ • OSX Good Support Thursday, April 23, 2009
  19. 19. Examples Thursday, April 23, 2009
  20. 20. Ruby Thursday, April 23, 2009
  21. 21.  # Set up client object  require 'memcache'  servers = ['127.0.0.1:43042', '127.0.0.1:43043']  CACHE = MemCache.new(servers, :namespace => 'my_app') Thursday, April 23, 2009
  22. 22. # Get; fall through to Rails' MySQL load if missing  key = "recent_posts"  # Try to get; returns nil on failure  posts = CACHE.get(key)  unless posts    # Load from DB    posts = Post.find(:all, :limit => 10, :order => 'id DESC')    # Cache the new value, which is automatically serialized    CACHE.set(key), posts, 60  end Thursday, April 23, 2009
  23. 23. # Ghetto locking implementation for memcache-client  # from http://fauna.rubyforge.org/svn/interlock/trunk/lib/interlock/lock.rb  def lock(key, lock_expiry = 30, retries = 5)    retries.times do |count|      # Try to acquire the lock      response = CACHE.add("lock:#{key}", "Locked by #{Process.pid}", lock_expiry)      if response == "STOREDrn"        # We got it        begin          # Yield the current value to the closure          value = yield(CACHE.get(key))          # Set the new value returned from the closure CACHE.set(key, value)          # We're done ('ensure' block will still run)          return value        ensure          # Release the lock          CACHE.delete("lock:#{key}")        end      else        # Exponentially back off requests if the lock can't be acquired        sleep((2**count) / 2.0)      end    end    # We waited and waited but our turn never came    raise MemCacheError, "Couldn't acquire lock for #{key}"  end Thursday, April 23, 2009
  24. 24. PHP Thursday, April 23, 2009
  25. 25. /** * Initalize Memcache object and add local server 127.0.0.1 using port 11211 */ $cache = new Memcache; $cache->addServer("127.0.0.1",11211); Thursday, April 23, 2009
  26. 26. /** Look in cache, if not found, set object (misses null) **/ if (!$user = $cache->get($user_key)) { /** * Set object with expire of 1 hour and no compression */ $cache->set($user_key,$value,NULL, $expire); $user = $value; } Thursday, April 23, 2009
  27. 27. /* Get user counter value (does not handle add fail) */ if (!$counter = $cache->get($counter_key)) { /* No counter, set to 1 */ $cache->add($counter_key,1); } else { /* Increment by 1 */ $cache->increment($counter_key); } Thursday, April 23, 2009
  28. 28. /* Print out stats from memcached server */ print_r($cache->getStats()); /* Print out extended stats from memcached server */ print_r($cache->getExtendedStats()); /* Flush memcached (bad idea in production)*/ var_dump($cache->flush()); Thursday, April 23, 2009
  29. 29. C Thursday, April 23, 2009
  30. 30. libmemcached • C/C++ (many language wrappers) • Multiget support • Async/Sync Modes (including buffered) • Supports Binary Protocol (TCP/UDP) • Read Through Cache Support Thursday, April 23, 2009
  31. 31. memcached_st *memc; memcached_return rc; memc= memcached_create(NULL); ...do stuff... memcached_free(memc); Thursday, April 23, 2009
  32. 32. memcached_server_st *servers; memcached_st *memc= memcached_create(NULL); char servername[]= "0.example.com"; servers= memcached_server_list_append(NULL, servername, 400, &rc); for (x= 0; x < 20; x++) { char buffer[SMALL_STRING_LEN]; snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x); servers= memcached_server_list_append(servers, buffer, 401, &rc); } rc= memcached_server_push(memc, servers); memcached_server_free(servers); memcached_free(memc); Thursday, April 23, 2009
  33. 33. char *key= "foo"; char *value; size_t value_length= 8191; unsigned int x; value = (char*)malloc(value_length); for (x= 0; x < value_length; x++) value[x] = (char) (x % 127); for (x= 0; x < 1; x++) { rc= memcached_set(memc, key, strlen(key), value, value_length, (time_t)0, (uint32_t)0); assert(rc == MEMCACHED_SUCCESS); } free(value); Thursday, April 23, 2009
  34. 34. memcached_return rc; char *keys[]= {"fudge", "son", "food"}; size_t key_length[]= {5, 3, 4}; uint32_t flags; char return_key[MEMCACHED_MAX_KEY]; size_t return_key_length; char *return_value; size_t return_value_length; rc= memcached_mget(memc, keys, key_length, 3); while ((return_value= memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc))) { free(return_value); } Thursday, April 23, 2009
  35. 35. Memcached foo; char *value_set= "Data for server A"; char *master_key_a= "server-a"; char *master_key_b= "server-b"; char *key= "xyz"; char *value; size_t value_length; foo.set_by_key(master_key_a, key, value_set, strlen(value_set)); value= foo.get_by_key(master_key_a, key, &value_length); assert((memcmp(value, value_set, value_length) == 0)); value= foo.get_by_key(master_key_b, key, &value_length); assert((memcmp(value, value_set, value_length) == 0)); return 0; Thursday, April 23, 2009
  36. 36. Application Integration Thursday, April 23, 2009
  37. 37. lighttpd/mod_memcache • Cache files from disk • Specify mime/types • Create Expire Times Thursday, April 23, 2009
  38. 38. Apache (mod_memcached)‫‏‬ • CAS operations exposed • GET/PUT/DELETE operations • Still Alpha • (pandoraport.com!) Thursday, April 23, 2009
  39. 39. NGINX • Support variable Time outs • Based on Perl • http://wiki.codemongers.com/ NginxHttpMemcachedModule • http://www.igvita.com/2008/02/11/nginx- and-memcached-a-400-boost/ Thursday, April 23, 2009
  40. 40. Memcached Functions for MySQL (and Drizzle) Thursday, April 23, 2009
  41. 41. Overview... • Uses UDF API and libmemcached • Manage memcached Cluster via SQL • Read through Cache • Write through Cache Thursday, April 23, 2009
  42. 42. Thursday, April 23, 2009
  43. 43. Installation • CREATE FUNCTION memc_servers_add RETURNS INT SONAME "libmemcached_functions_mysql.so"; • CREATE FUNCTION memc_set RETURNS INT SONAME "libmemcached_functions_mysql.so"; • CREATE FUNCTION memc_get RETURNS STRING SONAME "libmemcached_functions_mysql.so"; Thursday, April 23, 2009
  44. 44. Functions Available • memc_servers_set(); • memc_servers_behavior_set() • memc_set() • memc_get() • memc_append() • memc_prepend() Thursday, April 23, 2009
  45. 45. Setting via SELECT select id, url, memc_set(concat('feeds', md5(url)), url) from feeds; select memc_get(concat('feeds', md5(url))) from feeds; +-------------------------------------------------------+ | memc_get(concat('feeds', md5(url))) | +-------------------------------------------------------+ | http://feeds.feedburner.com/littlegreenfootballs/Ilds | | http://del.icio.us/rss/jacomien | | http://del.icio.us/rss/tags/rmj20 | | http://www.jihadwatch.org/index.rdf | | http://www.connotea.org/rss/user/rmj20 | | http://devblog.grazr.com/?feed=rss2x | | http://feeds.feedburner.com/littlegreenfootballs/kyeH | +-------------------------------------------------------+ Thursday, April 23, 2009
  46. 46. Trigger DROP TRIGGER IF EXISTS feed_insert; CREATE TRIGGER feed_insert BEFORE INSERT ON feeds FOR EACH ROW BEGIN SET @mm= memc_set(concat('feeds:',md5(NEW.url)), NEW.url);END | insert into feeds (url) values ('http://grazr.com/feedlist.xml'); select memc_get(concat('feeds:', md5('http://grazr.com/feedlist.xml'))); +------------------------------------------------------------------+| memc_get(concat('feeds:', md5('http://grazr.com/feedlist.xml'))) | +------------------------------------------------------------------+| http://grazr.com/feedlist.xml | +------------------------------------------------------------------+ Thursday, April 23, 2009
  47. 47. Memcached Replication via MySQL INSERT INTO table_a VALUES (“key”, “value”, “values”); INSERT INTO blackhole_table VALUES (memc_delete(“key”)); Thursday, April 23, 2009
  48. 48. Implementation Thursday, April 23, 2009
  49. 49. Limits • Key Size (250 bytes) (1.2 <)‫‏‬ • Data Size (under 1 megabyte)‫‏‬ • 32bit/64bit (maximum size of the process)‫‏‬ • Maxbytes (limits item cache, not everything!)‫‏‬ Thursday, April 23, 2009
  50. 50. LRU • Least recently accessed items are up for eviction • One LRU exists per “slab class” • LRU evictions don't need to be common • Can be common if you set expiration to 0 • Monitor evictions via 'stats items' command Thursday, April 23, 2009
  51. 51. Threads • No single-threading in versions past 1.2 • Great for large instances (16G+) • Also great for large multiget requests • Improvements in 1.3+ • Don't set too many threads • One per CPU • No more than 8 total for 1.2 Thursday, April 23, 2009
  52. 52. Slab Allocator • Memory permanently allocated from OS • Classes created by chunk size • Cannot (presently) reassign slab pages • Carefully use 'stats sizes' to test efficiency Thursday, April 23, 2009
  53. 53. Binary Protocol 24 HEADER Required bytes EXTRA FIELD (Command Specific) Sizes are defined in KEY As needed the header VALUE * Values must be in network byte order. Thursday, April 23, 2009
  54. 54. Binary Protocol MAGIC Opcode Key Length (1 byte) (1 byte) (2 bytes) Extra Length Data Type Reserved (1 byte) (1 byte) (2 bytes) Total Body Length (4 bytes) Opaque (4 bytes) CAS (Compare and Swap) (8 bytes) Thursday, April 23, 2009
  55. 55. Response Header MAGIC Opcode Key Length (1 byte) (1 byte) (2 bytes) Extra Length Data Type Status (1 byte) (1 byte) (2 bytes) Total Body Length (4 bytes) Opaque (4 bytes) CAS (Compare and Swap) (8 bytes) Thursday, April 23, 2009
  56. 56. Tools Thursday, April 23, 2009
  57. 57. Protocol • Telnet’able (see doc/protocol.txt)‫‏‬ • Store commands are binary (no escaping)‫‏‬ • WireShark support for Binary Protocol Thursday, April 23, 2009
  58. 58. Thursday, April 23, 2009
  59. 59. memcached-tool • Example minimal monitoring tool • Shows details of server stats, slabs • memcached-tool 10.0.0.1 display • memcached-tool 10.0.0.1 stats Thursday, April 23, 2009
  60. 60. libmemcached Tools • memcp • memrm • memstat • memslap (hahahhaha)‫‏‬ Thursday, April 23, 2009
  61. 61. MRTG • Plenty of interfaces monitored • Old technology, been around forever Thursday, April 23, 2009
  62. 62. Thursday, April 23, 2009
  63. 63. ...and others • Cacti • http://dealnews.com/developers/cacti/ memcached.html • Ganglia • http://ganglia.wiki.sourceforge.net/ Thursday, April 23, 2009
  64. 64. Current Connections Thursday, April 23, 2009
  65. 65. Requests Per Second Thursday, April 23, 2009
  66. 66. DTrace • User static DTrace probes to probe application logic • Hot keys • hash efficiency • lock contention Thursday, April 23, 2009
  67. 67. Tuning Thursday, April 23, 2009
  68. 68. Connections • Don't fear setting -c (max conns) too high! • Watch 'listen_disabled_num' (1.2.8+) • Audit any firewalls on the system (can run out of firewall states!) • Watch for connection overload. Probably an application bug Thursday, April 23, 2009
  69. 69. Memory • Don't set -m (max bytes) too high • -m only controls memory for stored values • Other memory is used for connection handling, LRU tracking, the hash table, etc • Especially if running under 32bit (-m 2048 bad!) • Careful of -k. Could force server to swap • Monitor server well! If you are swapping, memcached will be slow Thursday, April 23, 2009
  70. 70. Things to remember! • Memcached is great for scaling, but abuse will slow down your page rendering time • Fetching 10,000 separate keys to build a page will not be fast • Use persistent connections if possible • Don't fetch more than you need. Takes time to serialize/deserialize 100k+ of data Thursday, April 23, 2009
  71. 71. Shrink data! • Especially if you use multiget, try to use shorter keys • “fooooooooooooooooooooooo-$MD5” will take more data packets than “foo1” • Try using smaller keys anyway, saves memory if your data is small too Thursday, April 23, 2009
  72. 72. Future Solutions! • Evaluate the binary protocol in 1.3 • New tricks will be possible, such as smashing many commands into fewer packets • 'noreply' commands. Don't wait for the response if you don't have to • ('noreply' is in 1.2, but not recommended for use) Thursday, April 23, 2009
  73. 73. 1.2.8 • Bugfixes • New stats • listen_disabled_num • cmd_flush (are you flushing your cache and not realizing it? :) ) • evicted_time under 'stats items' • Only bugfixes and minor features planned for 1.2 series Thursday, April 23, 2009
  74. 74. 1.3.* Beta • Scalability improvements • New stats (per-slab get/miss/etc counters) • Binary protocol • Memory optimizations (disable CAS support) Thursday, April 23, 2009
  75. 75. ASCII Protocol vs Binary Protocol (memcached-1.3.1 Development Branch) task completion time (secs) ASCII Protocol Binary Protocol concurrent connections Binary Protocol Thursday, April 23, 2009
  76. 76. Future • 1.4.0 stable • Multiple Engine Support • Durable • Highly Threaded • New Slab Features Thursday, April 23, 2009
  77. 77. More Resources... • http://danga.com/memcached/ • #memcached on Freenode • http://tangent.org/552/libmemcached.html • http://groups.google.com/groups/ memcached • http://dev.mysql.com/doc/refman/5.1/en/ha- memcached.html Thursday, April 23, 2009
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×