Raw Caching Performance in Ruby/Rails
Last week, I set up memcached with a Rails application in hopes of further improving performance after getting a recommendation to pursue it. We’re already using many Rails low-level caches and fragment caches throughout the application because of its complex role management system. Those are stored in NFS on a NetApp filer, and I was hoping switching to memcached would speed things up. Unfortunately, my http request performance tests (using ab) did not back this up: using file caching on NFS with the NetApp was about 20% faster than memcached from my tests.
I brought this up to Jon, who suggested we run performance tests on the caching mechanism only rather than testing caching via full http requests, given how many layers of the stack are involved and influence the overall performance number. From the console, I ran the following:
$ script/console # This app is on Rails 2.3
> require 'benchmark'
> Rails.cache.delete("test")
> Rails.cache.fetch("test") { [SomeKlass.first, SomeKlass.last] }
> # to emulate what would potentially be stored with low-level cache
> Benchmark.bm(15) { |x| x.report("times:") { 10000.times do; Rails.cache.fetch("test"); end } }
We ran the console test with a few different caching configurations, with the results shown below. The size of the cached data here was ~2KB.
cache_store | avg time/request |
---|---|
:mem_cache_store | 0.00052 sec |
:file_store, tmpfs (local virtual memory RAM disk) | 0.00020 sec |
:file_store, local ext4 filesystem | 0.00017 sec |
:file_store, NetApp filer NFS over gigabit Ethernet | 0.00022 sec |
I also ran the console test with a much larger cache size of 822KB, with much different results:
cache_store | avg time/request |
---|---|
:mem_cache_store | 0.00022 sec |
:file_store, tmpfs (local virtual memory RAM disk) | 0.01685 sec |
:file_store, local ext4 filesystem | 0.01639 sec |
:file_store, NetApp filer NFS over gigabit Ethernet | 0.01591 sec |
Conclusion
It’s interesting to note here that the file-system caching outperformed memcached on the smaller cache, but memcached far outperformed the file-system caching on the larger cache. Ultimately, this difference is negligible compared to additional Rails optimization I applied after these tests, which I’ll explain in a future blog post.
Comments