如何用石墨分析memcache关键命中率?

时间:2014-07-23 04:56:56

标签: ruby-on-rails graphite statsd

我有一个Rails应用程序,它广泛使用缓存,我想知道应用程序中不同位置的缓存命中率。低命中率显然需要注意。但先测量一下!

为了获得真实数据,我使用了石墨+统计组合和使用custom Dalli instrumentationstatsd-instrument gem。应用中的所有键都是['place', details...]格式,因此我在石墨中获得以下指标:

  • stats.cache.place1.hits
  • stats.cache.place1.misses
  • stats.cache.place2.hits
  • stats.cache.place2.misses

现在我要显示所有命中率。我能够为一个地方提出以下公式:

divideSeries(stats.cache.place1.hits, sumSeries(stats.cache.place1.*))

效果很好,但有几十个地方,我讨厌复制它,更不用说可以出现新的地方了。

这是一个问题,石墨专家:有没有办法显示所有地方的点击率?我在文档中看到过group *函数,但是他们让我很困惑。

理想情况下,我想将我的地方分为4类:

  • 命中率高,请求很多。缓存效果很好。
  • 命中率低,请求很多。需要注意。
  • 命中率很高,请求很少。是否需要缓存?
  • 命中率低,请求很少。绝对删除缓存。

我真的很感激任何有关如何使用石墨进行此类分析的想法(我可以请求JSON格式的数据并进行自己的数学运算,但我怀疑必须采用更简单的方法)。

1 个答案:

答案 0 :(得分:3)

您可以在多个级别使用globs,因此有关所有缓存执行方式的全局视图:

divideSeries(stats.cache.*.hits, sumSeries(stats.cache.*.*))

对于您提到的4个类别the mostDeviant function might be good,这有助于找到最高/最低缓存率。

mostDeviant(5, divideSeries(stats.cache.*.hits, sumSeries(stats.cache.*.*)))

根据请求将它们分组到存储桶中,然后显示单独的派生比率更难。使用重复groupByNodehighestAverage的回调函数可能有效

highestAverage(groupByNode(groupByNode(stats.cache.*.*, 3, "sumSeries"), 2, "divideSeries"), 10)

作为旁注,对于大多数LRU(最近最少使用的)缓存逐出方案,删除缓存没有多大意义,因为它不会竞争缓存空间。