2016-04-15 71 views
1

我们试图在单节点上运行的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需要执行多个此类任务,这会多次增加此开销。

任何人都可以建议如何可以避免这种开销?

回答

0

,当涉及到调度线程执行你所描述的是一个普遍的问题。不幸的是,不可能在任意精确的时间间隔内将线程停在WAITING状态。你可以做的是尽量优化Linux的中断计时器频率。但是由于800微秒已经非常灵敏,我不打算看到你的用例有很多性能改进。此外Paxos作为共识协议并不是针对最少数量的往返旅行而设计的,这种微型优化不会帮助您解决这个问题。

+0

谢谢@Stefan如果我的计算是正确的,与实际工作相比,等待的开销似乎相当高。读取或写入大约需要50μs。因此,即使对于非paxos操作,它也会为延迟增加大约10倍的开销。
在cassandra中没有出现亚毫秒延迟?在人们实现它的时候,我找不到任何结果。 –

+0

您应该能够看到至少CL ONE的亚毫秒延迟。有关对并发处理进行建议更改的另请参见以下故障单:https://issues.apache.org/jira/browse/CASSANDRA-10989 –

+0

感谢Stefan提供的链接。看起来,当Cassandra移出SEDA架构时,调度开销应该减少。我试着天真地修改代码以在同一个netty线程中执行工作,并且我看到了很大的改进。无论如何,直到Cassandra解决这个问题,我们将尝试通过改变我们的设计来减少对Cassandra的调用的延迟。 –

0

你或许应该创建一个JIRA,并提出了一个补丁的核心团队卡桑德拉

+0

谢谢@doanduyhai我想知道这是否是通过设计和交易的可扩展性。我看到有计划让事情更加异化,例如storageproxy等。所以,我怀疑他们会使任务处理同步。我想知道,如果有任何cassandra \ jdk \ os级别设置的建议可以改善一些事情。 –