Ruby on rails Rails中第一次缓存获取时缓存读取速度慢

Ruby on rails Rails中第一次缓存获取时缓存读取速度慢,ruby-on-rails,caching,memcached,dalli,Ruby On Rails,Caching,Memcached,Dalli,我在rails应用程序中看到一些非常慢的缓存读取。redis(redis rails)和memcached(dalli)都产生了相同的结果 看起来这只是第一次调用Rails.cache导致速度变慢(平均500毫秒) 我正在使用skylight为我的应用程序安装仪表,并看到如下图表: 在这段代码中,我有一个Rails.cache.fetch调用,但当我对它进行基准测试时,我看到它的平均速度约为8ms,这与memcache top显示的平均调用时间相匹配 我认为这可能是dalli连接打开缓慢,但基

我在rails应用程序中看到一些非常慢的缓存读取。redis(redis rails)和memcached(dalli)都产生了相同的结果

看起来这只是第一次调用Rails.cache导致速度变慢(平均500毫秒)

我正在使用skylight为我的应用程序安装仪表,并看到如下图表:

在这段代码中,我有一个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') }
计算了平均时间,在我的一个Web服务器上运行时得到了大约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毫秒的范围


您可以发布您的Dalli/Rails缓存配置吗?您的应用服务器和缓存服务器/服务在地理位置上是否接近或分开(例如AWS us-east-1和AWS us-west-2)?你能做一个捆绑控制台并直接检查缓存吗?在这种情况下,您会看到什么样的性能?使用缓存配置和控制台性能更新。当我看到具有多个缓存调用的跟踪时,似乎只有第一次缓存读取需要花费很长时间,后续调用似乎正常。因此,带有日志尾的读取时间分布(尖尖的高性能)会向我指出一侧或另一侧的性能限制。您确定Memcached计算机上没有达到资源限制吗?或者,在这些长时间读取期间,应用服务器上的负载是什么样子的?应用服务器上的负载是相当一致的,尽管我们没有高流量,所以它本身有点尖峰。我在memcached服务器上使用elasticache,对系统统计信息知之甚少,cpu利用率不会在读取速度慢时达到峰值。我想知道这是否可能是一个网络问题,因为我正在使用memcached的t2.micro实例。我添加了另一个图表来跟踪缓存读取的调用数/s,它看起来与慢度数直接相关。也许这是网络陷入了某种困境,它似乎没有足够多的数字来做这样的事情。