Plugin Memcached%20 Study

77
Memcached http://download.tangent.org/talks/Memcached%20Study.pdf Thursday, April 23, 2009

description

Plugin Memcached

Transcript of Plugin Memcached%20 Study

Page 1: Plugin Memcached%20 Study

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

Thursday, April 23, 2009

Page 2: Plugin Memcached%20 Study

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

Page 3: Plugin Memcached%20 Study

Who?

• Facebook

• Yahoo

• Amazon

• LiveJournal

• Mixi

• ...

Thursday, April 23, 2009

Page 4: Plugin Memcached%20 Study

Why?(aka why would I...)‏

Thursday, April 23, 2009

Page 5: Plugin Memcached%20 Study

Thursday, April 23, 2009

Page 6: Plugin Memcached%20 Study

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

Page 7: Plugin Memcached%20 Study

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

Page 8: Plugin Memcached%20 Study

Thursday, April 23, 2009

Page 9: Plugin Memcached%20 Study

Patrick LenzEins.dehttp://poocs.net

Thursday, April 23, 2009

Page 10: Plugin Memcached%20 Study

Grazr

Thursday, April 23, 2009

Page 11: Plugin Memcached%20 Study

Memcached

Incoming Data

Processing

100+ Nodes2gigs a Node

Thursday, April 23, 2009

Page 12: Plugin Memcached%20 Study

How

Thursday, April 23, 2009

Page 13: Plugin Memcached%20 Study

Server

• Slab Allocator

• Libevent based

• Simple Protocol (no xml)

• Server has Internal Hash Table

• Servers know nothing about each other

Thursday, April 23, 2009

Page 14: Plugin Memcached%20 Study

Clients

• Client hashes Key to Server List (distribution)‏

• Serializes the Object (server just likes byte arrays)‏

• Compresses data

Thursday, April 23, 2009

Page 15: Plugin Memcached%20 Study

Consistent Hash

Thursday, April 23, 2009

Page 16: Plugin Memcached%20 Study

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

Page 17: Plugin Memcached%20 Study

Details on the Server?

• set/get/replace/add

• append/prepend

• increment/decrement

• cas (compare and swap atomic!)‏

• stats (detail)‏

Thursday, April 23, 2009

Page 18: Plugin Memcached%20 Study

Platforms

• FreeBSD and Linux are top tier

• Windows exists

• Solaris (as of 1.2.5)‏

• OSX Good Support

Thursday, April 23, 2009

Page 19: Plugin Memcached%20 Study

Examples

Thursday, April 23, 2009

Page 20: Plugin Memcached%20 Study

Ruby

Thursday, April 23, 2009

Page 21: Plugin Memcached%20 Study

 # 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

Page 22: Plugin Memcached%20 Study

# 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

Page 23: Plugin Memcached%20 Study

# 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 == "STORED\r\n"       # 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

Page 24: Plugin Memcached%20 Study

PHP

Thursday, April 23, 2009

Page 25: Plugin Memcached%20 Study

/** * 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

Page 26: Plugin Memcached%20 Study

/** 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

Page 27: Plugin Memcached%20 Study

/* 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

Page 28: Plugin Memcached%20 Study

/* 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

Page 29: Plugin Memcached%20 Study

C

Thursday, April 23, 2009

Page 30: Plugin Memcached%20 Study

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

Page 31: Plugin Memcached%20 Study

memcached_st *memc; memcached_return rc; memc= memcached_create(NULL); ...do stuff... memcached_free(memc);

Thursday, April 23, 2009

Page 32: Plugin Memcached%20 Study

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

Page 33: Plugin Memcached%20 Study

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

Page 34: Plugin Memcached%20 Study

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

Page 35: Plugin Memcached%20 Study

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

Page 36: Plugin Memcached%20 Study

Application Integration

Thursday, April 23, 2009

Page 37: Plugin Memcached%20 Study

lighttpd/mod_memcache

• Cache files from disk

• Specify mime/types

• Create Expire Times

Thursday, April 23, 2009

Page 38: Plugin Memcached%20 Study

Apache (mod_memcached)‏• CAS operations exposed

• GET/PUT/DELETE operations

• Still Alpha

• (pandoraport.com!)

Thursday, April 23, 2009

Page 39: Plugin Memcached%20 Study

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

Page 40: Plugin Memcached%20 Study

Memcached Functions for MySQL

(and Drizzle)

Thursday, April 23, 2009

Page 41: Plugin Memcached%20 Study

Overview...

• Uses UDF API and libmemcached

• Manage memcached Cluster via SQL

• Read through Cache

• Write through Cache

Thursday, April 23, 2009

Page 42: Plugin Memcached%20 Study

Thursday, April 23, 2009

Page 43: Plugin Memcached%20 Study

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

Page 44: Plugin Memcached%20 Study

Functions Available

• memc_servers_set();

• memc_servers_behavior_set()

• memc_set()

• memc_get()

• memc_append()

• memc_prepend()

Thursday, April 23, 2009

Page 45: Plugin Memcached%20 Study

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

Page 46: Plugin Memcached%20 Study

Trigger

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 | +------------------------------------------------------------------+

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 |

Thursday, April 23, 2009

Page 47: Plugin Memcached%20 Study

Memcached Replication via MySQL

INSERT INTO table_a VALUES (“key”, “value”, “values”); INSERT INTO blackhole_table VALUES (memc_delete(“key”));

Thursday, April 23, 2009

Page 48: Plugin Memcached%20 Study

Implementation

Thursday, April 23, 2009

Page 49: Plugin Memcached%20 Study

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

Page 50: Plugin Memcached%20 Study

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

Page 51: Plugin Memcached%20 Study

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

Page 52: Plugin Memcached%20 Study

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

Page 53: Plugin Memcached%20 Study

Binary Protocol

EXTRA FIELD(Command Specific)

HEADER

KEY

VALUE

24 bytes

Required

As neededSizes are defined in the header

* Values must be in network byte order.

Thursday, April 23, 2009

Page 54: Plugin Memcached%20 Study

Binary ProtocolMAGIC

(1 byte)Key Length

(2 bytes)Opcode

(1 byte)

Extra Length(1 byte)

Data Type(1 byte)

Reserved(2 bytes)

Total Body Length(4 bytes)

Opaque(4 bytes)

CAS (Compare and Swap)(8 bytes)

Thursday, April 23, 2009

Page 55: Plugin Memcached%20 Study

Response HeaderMAGIC

(1 byte)Key Length

(2 bytes)Opcode

(1 byte)

Extra Length(1 byte)

Data Type(1 byte)

Status(2 bytes)

Total Body Length(4 bytes)

Opaque(4 bytes)

CAS (Compare and Swap)(8 bytes)

Thursday, April 23, 2009

Page 56: Plugin Memcached%20 Study

Tools

Thursday, April 23, 2009

Page 57: Plugin Memcached%20 Study

Protocol

• Telnet’able (see doc/protocol.txt)‏

• Store commands are binary (no escaping)‏

• WireShark support for Binary Protocol

Thursday, April 23, 2009

Page 58: Plugin Memcached%20 Study

Thursday, April 23, 2009

Page 59: Plugin Memcached%20 Study

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

Page 60: Plugin Memcached%20 Study

libmemcached Tools

• memcp

• memrm

• memstat

• memslap (hahahhaha)‏

Thursday, April 23, 2009

Page 61: Plugin Memcached%20 Study

MRTG

• Plenty of interfaces monitored

• Old technology, been around forever

Thursday, April 23, 2009

Page 62: Plugin Memcached%20 Study

Thursday, April 23, 2009

Page 64: Plugin Memcached%20 Study

Current Connections

Thursday, April 23, 2009

Page 65: Plugin Memcached%20 Study

Requests Per Second

Thursday, April 23, 2009

Page 66: Plugin Memcached%20 Study

DTrace

• User static DTrace probes to probe application logic

• Hot keys

• hash efficiency

• lock contention

Thursday, April 23, 2009

Page 67: Plugin Memcached%20 Study

Tuning

Thursday, April 23, 2009

Page 68: Plugin Memcached%20 Study

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

Page 69: Plugin Memcached%20 Study

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

Page 70: Plugin Memcached%20 Study

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

Page 71: Plugin Memcached%20 Study

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

Page 72: Plugin Memcached%20 Study

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

Page 73: Plugin Memcached%20 Study

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

Page 74: Plugin Memcached%20 Study

1.3.* Beta

• Scalability improvements

• New stats (per-slab get/miss/etc counters)

• Binary protocol

• Memory optimizations (disable CAS support)

Thursday, April 23, 2009

Page 75: Plugin Memcached%20 Study

Binary Protocol

0

75

150

225

300

1 2 4 8 16 32 64 128

ASCII Protocol vs Binary Protocol (memcached-1.3.1 Development Branch)

task

com

plet

ion

time

(sec

s)

concurrent connections

ASCII ProtocolBinary Protocol

Thursday, April 23, 2009

Page 76: Plugin Memcached%20 Study

Future• 1.4.0 stable

• Multiple Engine Support

• Durable

• Highly Threaded

• New Slab Features

Thursday, April 23, 2009