1

我在我的一个库中使用 Guava 缓存,并且我公司的其他一些服务(由其他团队管理)正在使用该库。从我的图书馆我cache stats每次都在记录50000。以下是我在记录时看到的输出

Cache Stats= CacheStats{hitCount=3296628, missCount=1353372, loadSuccessCount=1353138, loadExceptionCount=0, totalLoadTime=2268064327604, evictionCount=1325410}
Cache Stats= CacheStats{hitCount=3334167, missCount=1365834, loadSuccessCount=1365597, loadExceptionCount=0, totalLoadTime=2287551024797, evictionCount=1337740}
Cache Stats= CacheStats{hitCount=3371463, missCount=1378536, loadSuccessCount=1378296, loadExceptionCount=0, totalLoadTime=2309012047459, evictionCount=1350990}
Cache Stats= CacheStats{hitCount=3407719, missCount=1392280, loadSuccessCount=1392039, loadExceptionCount=0, totalLoadTime=2331355983194, evictionCount=1364535}
Cache Stats= CacheStats{hitCount=3443848, missCount=1406152, loadSuccessCount=1405908, loadExceptionCount=0, totalLoadTime=2354162371299, evictionCount=1378654}

而我的缓存配置如下图:

    CacheBuilder
      .newBuilder()
      .maximumSize(1000000)
      .expireAfterWrite(120, TimeUnit.SECONDS)
      .concurrencyLevel(5000)
      .removalListener(
          RemovalListeners.asynchronous(new CustomListener(),
              Executors.newSingleThreadScheduledExecutor())).build();

谁能帮助我了解我们的命中率以及如何解释上述缓存指标?我很困惑这些数字告诉我什么。基于上述结果,如果我们向上maximumSizeexpireAfterWrite间隔,我们可以看到更好的性能吗?

注意:我们仍在使用 guava-11.0.2,由于某种原因我无法升级。

4

1 回答 1

4

从文档..

缓存统计信息按照以下规则递增:

  • 当缓存查找遇到现有缓存条目时,hitCount 会增加。

  • 当缓存查找第一次遇到丢失的缓存条目时,会加载一个新条目。

    1. 成功加载条目后,missCount 和 loadSuccessCount
      会递增,总加载时间(以纳秒为单位)会添加到 totalLoadTime。

    2. 当加载条目时抛出异常时,missCount 和 loadExceptionCount 会递增,并且总加载时间(以纳秒为单位)将添加到 totalLoadTime。

    3. 遇到仍在加载的丢失缓存条目的缓存查找将等待加载完成(无论成功与否),然后增加missCount。

  • 当从缓存中逐出条目时,evictionCount 会增加。

  • 当缓存条目无效或手动删除时,不会修改任何统计信息。

  • 在缓存的 asMap 视图上调用的操作不会修改任何统计信息

现在来到你的指标..

查看您的指标。
CacheStats{hitCount=3296628, missCount=1353372, loadSuccessCount=1353138, loadExceptionCount=0, totalLoadTime=2268064327604, evictionCount=1325410} 鉴于您的大小为 1M,并且您的约 75% 的请求正在受到缓存命中,并且您的数据大小在最坏的情况下约为 1.35M,并且您的缓存未命中看起来像是由于到期而发生的。我建议将其maximumSize增加到大约 1.25-1.35M 并再次运行相同的测试。

如果您提及运行测试的时间范围以便计算驱逐率,这也会有所帮助。如果可能,将expireAfterWrite时间增加到更大的数字以减少驱逐次数。

于 2017-03-07T21:54:15.667 回答