如何在Cassandra中获得可靠的插入时间?

问题描述:

我目前使用CassandraSharp 3个节点对Cassandra进行基准测试。 我主要关注的是比吞吐量更延迟,所以有点GC调整后这里是我的号码(100个000K插入,单丝):如何在Cassandra中获得可靠的插入时间?

  • Iter项目/秒:1600
  • 平均:600μs
  • 95分:600μs
  • 99分:5000μs
  • 最高:50个000μs

我在这里的问题是,一旦在一段时间,我得到一个 “坏” 晚ncy(50ms),我的目标是具有一致的延迟,即使以更高的平均值为代价。

我相信这是由GC引起的,我想知道是否可以避免。

(作为一个方面说明,这是一个好的做法,以插入的大量发送到一个节点,让它办理或者我应该“负载均衡”,它在客户端?)

+0

你可以告诉我们你是如何调谐GC的? Thx – odiszapc 2013-05-04 14:30:41

对于年轻一代的垃圾收集,50ms是在正常范围内。您可以在cassandra-env.sh中启用GC日志记录,方法是取消注释底部的相应行,以验证是否存在问题。

(刷新不会阻止刀片,除非你的磁盘这么慢呢不能插入量,因为冲洗的顺序I/O这是不寻常跟上。)

如果年轻一代收藏品的确有相关较高的延迟时间,您可以减少尝试使年轻一代更小(也在cassandra-env.sh中配置),以交易吞吐量的潜在交易延迟为代价。

+0

我已经通过了GC优化阶段,并有一个最小的年轻一代空间来加速GC时间。 所以我想它不会比这更好:/ – alprema 2012-03-21 09:46:19

我不我认为你可以一次性摆脱糟糕的延迟问题。它最有可能是你提到的GC,或者它是从Memtables执行到磁盘的刷新。

50ms的插入是否真的有问题? Cassandra支持批处理增变器,允许您将插入操作放入一个长增变器中,然后在稍后执行批处理插入操作,以便您的主线程不需要被同步插入器阻塞,这可能需要更长的时间预期。我没有使用过CassandarSharp,所以不知道它是否公开了这个功能。

此外,cassandra节点间的负载均衡会稍微改善您的导入时间,但请记住,幕后发生的情况是,您提供导入的节点会将其交给正确的节点以执行存储(所以你给它的节点真的是一个代理),所以我不会想象在一般边缘情况下有很大的改进。如果由于某种原因该节点开始做其他事情并且其性能受到影响,它将对您有所帮助。

如果您对可靠的插入时间感兴趣,您可能需要查看Cassandra的Acunu发行版,它可以在插入时提供100倍更稳定的延迟:Cassandra under Heavy Write Load(特别注意第二张图片)。

+0

请注意,在Cassandra 1.0中引入了用于memtables的竞技场分配,这一基准已经过时,这消除了在这里看到的停止世界老一代gc暂停的情况。 (详细信息:https://issues.apache。org/jira/browse/CASSANDRA-2252) – jbellis 2012-03-21 00:00:31