我目前正在使用CassandraSharp对3个节点的Cassandra进行基准测试。 我主要担心的是延迟比吞吐量更多,所以经过一些GC调整后我的数字(在100 000K插入,单线程):
我的问题是,偶尔我会遇到“糟糕”的延迟(50毫秒),我的目标是保持一致的延迟,即使是以更高的平均值为代价。
我认为这是由GC引起的,我想知道是否可以避免。
(作为旁注,向一个节点发送大量插入并让它处理它或者我应该在客户端“负载均衡”它是一个好习惯吗?)
答案 0 :(得分:2)
50ms是年轻一代垃圾收集的正常范围。您可以通过向底部取消注释相应的行来启用cassandra-env.sh中的GC日志记录,以验证这是问题所在。
(刷新不会阻止插入,除非你的磁盘太慢而无法跟上插入量,这是不寻常的,因为刷新是顺序i / o。)
如果年轻一代的收藏确实与较高的延迟相关联,那么您可以减少尝试使年轻一代更小(也在cassandra-env.sh中配置),这可能是交易延迟交易的潜在成本。
答案 1 :(得分:1)
我认为你不会偶尔摆脱糟糕的延迟问题。它最有可能是你提到的GC,或者当它从Memtables执行刷新到磁盘时。
50ms的错误插入真的有问题吗? Cassandra支持批量变换器,它允许您在一个长变换器中将插入操作排队,然后在以后执行批量插入,这样您的主线程就不需要被同步插入阻塞,这可能需要比预期。我没有使用过CassandarSharp,所以不知道它是否暴露了这个功能。
此外,跨cassandra节点的负载平衡会略微改善导入时间,但请记住,幕后发生的事情是,您提供导入的节点会将其移交给正确的节点进行存储(所以你给它的节点真的充当了代理)所以我不会想象在一般边缘情况下会有太大的改进。如果由于某种原因节点开始执行其他操作并且其性能受损,它将对您有所帮助。
答案 2 :(得分:0)
如果您对可靠的插入时间感兴趣,可能需要查看Cassandra的Acunu分布,它在插入上提供了100倍更稳定的延迟:Cassandra under Heavy Write Load(特别注意第二张图片)。