我们试图在单节点上运行的cassandra(v2.1.8)上的简单列系列中实现CAS(比较和设置)更新的亚毫秒延迟。我们在同一台机器上运行一系列测试,每个测试包含一个读取和一个写入CAS操作(RW),最多只能看到4 ms。CAS更新的Cassandra亚毫秒延迟
当我们剖析Cassandra过程时,我们看到SEPWorker类在旋转等待中花费了大部分时间,而实际的RW操作花费的时间更少。我们分析了代码,并在SEPWorker.doWaitSpin方法中使用的LockSupport.parkNanos方法中添加了一些跟踪语句,我们发现即使计划平均睡眠时间为12μs,实际上每次呼叫也会睡眠800μs 。因此,由于旋转等待单个SEP Worker的任务,这将平均增加400μs到等待时间。请注意,对于CAS操作,paxos需要执行多个此类任务,这会多次增加此开销。
任何人都可以建议如何可以避免这种开销?
谢谢@Stefan如果我的计算是正确的,与实际工作相比,等待的开销似乎相当高。读取或写入大约需要50μs。因此,即使对于非paxos操作,它也会为延迟增加大约10倍的开销。
在cassandra中没有出现亚毫秒延迟?在人们实现它的时候,我找不到任何结果。 –
您应该能够看到至少CL ONE的亚毫秒延迟。有关对并发处理进行建议更改的另请参见以下故障单:https://issues.apache.org/jira/browse/CASSANDRA-10989 –
感谢Stefan提供的链接。看起来,当Cassandra移出SEDA架构时,调度开销应该减少。我试着天真地修改代码以在同一个netty线程中执行工作,并且我看到了很大的改进。无论如何,直到Cassandra解决这个问题,我们将尝试通过改变我们的设计来减少对Cassandra的调用的延迟。 –