The document discusses caching strategies for Rails applications to improve performance. It recommends caching late in the development process after optimizing code. Different caching mechanisms are described from page caching to object caching. Memcached is recommended for caching and supports features like expiration and versioning. Examples of large companies using caching and Memcached like Facebook are provided.
1. Caching,
Memcached,
and Rails
Mike Perham
http://mikeperham.com
Wednesday, March 25, 2009
2. Me
Maintainer of memcache-client, shipped with Rails
Hardcore performance nerd
Wednesday, March 25, 2009
3. Performance
Let me Tell you a Story...
Wednesday, March 25, 2009
4. Performance Tuning
Remove unnecessary Functionality
Tune necessary Functionality
ONLY THEN, add caching last
ALWAYS track before/after timings
Wednesday, March 25, 2009
5. Caching
Cache the results of expensive operations
Why is this memoization dumb?
Wednesday, March 25, 2009
6. Why Dumb?
SCALABILITY!
FRESHNESS!
Wednesday, March 25, 2009
7. Rails
Built in support for memcached since Rails 2.1
config/environments/production.rb:
Wednesday, March 25, 2009
8. Request
Varnish Apache Rails DB
Memcached
Standard Toolset for Rails 2.3
Further == Slower
Wednesday, March 25, 2009
9. Caching Mechanisms
HTTP Proxy
FASTER
Page
Action
Fragment
SLOWER
Object
Wednesday, March 25, 2009
10. HTTP Proxy
HTTP/URL caching with Varnish
Expires, Etag, Cache-Control headers
5-10k req/sec!
Wednesday, March 25, 2009
11. Page Caching
ERB --> Static HTML
Uh oh, uses the filesystem!
Apache = 1-5k req/sec
Wednesday, March 25, 2009
12. Action Caching
Runs filters (e.g. authorization)
Can use any cache strategy
File, memory, memcached
Wednesday, March 25, 2009
13. Fragment Caching
Parts of the page are unique per user
Fragment cache the various UI boxes
Dynamically assemble HTML from the cache
Wednesday, March 25, 2009
14. Object Caching
Built-in AR support for “smart” keys
Rails.cache.fetch(post.cache_key) { expensive_calc(post) }
“#{table_name}/#{self.id}-#{self.updated_at.to_i}”
Support for complex dependencies
Wednesday, March 25, 2009
15. Expiration
“There are only two hard things in Computer
Science: naming and cache invalidation”
Explicit
expire_page :controller => ‘users’, :action => ‘index’
expire_action :controller => ‘users’, :action => ‘index’
Rails.cache.delete(‘key’)
Observers
Wednesday, March 25, 2009
17. Memcached
Giant Hash of Fixed Size
Time-based expiration
LRU eviction
Operations: GET, SET, APPEND, INCR, CAS
Limited to 1MB per value, 250 chars per key
Wednesday, March 25, 2009
18. Facebook
100s of servers w/ 28TB of RAM
5 billion page views/day
400k req/sec from memcached
Wednesday, March 25, 2009
22. Advanced
Spread your cache across a farm of memcached
Use the memcaches_page plugin
Use AJAX for user-specific widgets
Wednesday, March 25, 2009
23. Advice
Cache late in the development cycle, after tuning!
Memcached gives you time-based expiration,
versioning and multi-machine support.
Cache as early in the request as possible!
Varnish Apache Rails DB
Wednesday, March 25, 2009
24. THANK YOU!
HTTP://MIKEPERHAM.COM
MPERHAM@GMAIL.COM
QUESTIONS?
Wednesday, March 25, 2009