我在rails应用程序中看到一些非常慢的缓存读取。 redis(redis-rails)和memcached(dalli)都产生了相同的结果。
看起来它只是第一次调用Rails.cache导致缓慢(平均500ms)。
我正在使用天窗来检测我的应用并看到如下图:
我在这段代码中有一个Rails.cache.fetch调用,但是当我对它进行基准测试时,我看到它平均大约8ms,这与memcache-top显示的平均通话时间相匹配。
我认为这可能是dalli连接开放缓慢,但基准测试并没有表现出任何缓慢。我还有什么可以检查的。
有没有人有任何好的技巧可以在rails应用程序中跟踪这类事情?
编辑#1
Memcache服务器存储在ENV [' MEMCACHE_SERVERS']中,所有服务器都在us-east-1数据中心内。
缓存配置如下:
config.cache_store = :dalli_store, nil, { expires_in: 1.day, compress: true }
我跑了类似的东西:
100000.times { Rails.cache.fetch('something') }
并计算了平均时间,并在我的一个网络服务器上运行时获得了大约8毫秒的内容。
测试我对第一个请求的理论很慢,我在我的Web服务器上打开了一个控制台,并将第一个命令作为第一个命令运行。
irb(main):002:0> Benchmark.ms { Rails.cache.fetch('someth') { 1 } }
Dalli::Server#connect my-cache.begfpc.0001.use1.cache.amazonaws.com:11211
=> 12.043342
编辑#2
好的,我把fetch分成了读写,并用statsd独立跟踪它们。看起来平均值与我的预期相符,但读取的最大时间非常尖锐,并且可以达到500毫秒的范围。
http://s16.postimg.org/5xlmihs79/Screen_Shot_2014_12_19_at_6_51_16_PM.png