为什么增加大小后为什么不使用计数器缓存?

时间:2019-06-07 16:01:58

标签: database-performance cassandra-3.0

我的Cassandra应用程序主要需要进行计数器写入和读取。因此,拥有计数器缓存对于性能很重要。我将cassandra.yaml中的计数器缓存大小从1000增加到3500,并重新启动了cassandra服务。结果不是我预期的。磁盘使用率上升,吞吐量下降,并且根据我在nodetool信息中看到的内容,计数器缓存似乎根本没有被使用(请参阅下文)。现在已经快两个小时了,性能仍然很差。

昨天,当我将计数器缓存从0增加到1000时,我看到了相同的模式。它花了很长时间才完全不使用计数器缓存,然后由于某种原因它开始使用它。我的问题是是否需要做一些事情来激活计数器缓存利用率?

这是我在cassandra.yaml中用于计数器缓存的设置:

counter_cache_size_in_mb: 3500
counter_cache_save_period: 7200
counter_cache_keys_to_save: (currently left unset)

这是大约90分钟后我从nodetool信息中得到的信息:

Gossip active          : true
Thrift active          : false
Native Transport active: false
Load                   : 1.64 TiB
Generation No          : 1559914322
Uptime (seconds)       : 6869
Heap Memory (MB)       : 15796.00 / 20480.00
Off Heap Memory (MB)   : 1265.64
Data Center            : WDC07
Rack                   : R10
Exceptions             : 0
Key Cache              : entries 1345871, size 1.79 GiB, capacity 1.95 GiB, 67936405 hits, 83407954 requests, 0.815 recent hit rate, 14400 save period in seconds
Row Cache              : entries 0, size 0 bytes, capacity 0 bytes, 0 hits, 0 requests, NaN recent hit rate, 0 save period in seconds
Counter Cache          : entries 5294462, size 778.34 MiB, capacity 3.42 GiB, 0 hits, 0 requests, NaN recent hit rate, 7200 save period in seconds
Chunk Cache            : entries 24064, size 1.47 GiB, capacity 1.47 GiB, 65602315 misses, 83689310 requests, 0.216 recent hit rate, 3968.677 microseconds miss latency
Percent Repaired       : 8.561186035383143%
Token                  : (invoke with -T/--tokens to see all 256 tokens)

在增加大小之前,这里是Counter Cache上的一个节点工具信息:

Counter Cache          : entries 6802239, size 1000 MiB, capacity 1000 MiB,
                         57154988 hits, 435820358 requests, 0.131 recent hit rate,
                         7200 save period in seconds

更新: 我已经运行了几天,尝试在各个节点上使用各种值的计数器缓存大小。一致的是,计数器缓存直到达到容量才启用。据我所知,这就是它的工作方式。如果有人知道在缓存已满之前启用缓存的方法,请告诉我。我将其设置得很高是因为它似乎是最佳选择,但这意味着高速缓存在充满时会关闭几个小时,而在关闭时我的磁盘绝​​对会因读取请求而耗尽...

另一个更新: 进一步的运行表明,计数器缓存偶尔会在填满之前启动。我真的不知道为什么。我还没有看到图案。我很想知道什么时候有效和无效的标准。

最后更新: 在计数器高速缓存填满时,也会为该节点禁用本机传输。将计数器设置为3.5 GB,我现在要在节点处于这种低性能状态且禁用本机传输的情况下运行24小时。

1 个答案:

答案 0 :(得分:0)

我发现有一种方法可以100%地避免未启用计数器缓存和禁用本机传输模式。这种方法避免了我在等待启用计数器缓存时遇到的严重性能问题(在我的情况下,有时需要几个小时,因为我想要一个较大的计数器缓存): 1.在启动Cassandra之前,将cassandra.yaml文件字段counter_cache_size_in_mb设置为0 2.启动cassandra并启动并运行后,使用node工具命令设置缓存大小: 示例命令: nodetool setcachecapacity 2000 0 1000

在此示例中,第一个值2000设置键缓存大小,第二个值0表示行缓存大小,第三个值1000则是计数器缓存大小。

  1. 进行测量并确定这些值是否为最佳值。如果没有,您可以重复第二步,而无需根据需要使用新值重新启动Cassandra

更多详细信息: 一些不起作用的事情: 如果尚未启用计数器缓存,则设置counter_cache_size_in_mb值。在这种情况下,您在Cassandra.yaml的counter_cache_size_in_mb中使用非零值启动Cassandra,但尚未达到该大小阈值。如果这样做,计数器缓存将永远不会启用。只是不要这样做。我将其称为缺陷,但这是当前工作的方式。 测试我做了: 我在五个单独的节点上使用多个值对其进行了多次测试。最初是在Cassandra刚出现时,还是一段时间后。我描述的这种方法在每种情况下都有效。我想我应该保存一些nodetool信息的屏幕截图以显示结果。

最后一件事:如果Cassandra开发人员正在观看,请他们考虑调整代码,这样就不需要这种解决方法了吗?