在我的应用程序中,有几个服务在它们自己的线程上处理信息,当它们完成后,它们会将消息发布到下一个服务,然后继续在自己的线程上完成工作。消息的移交是通过 LinkedBlockingQueue 完成的。切换通常需要 50-80 us(从将消息放入队列直到消费者开始处理消息)。为了加快最重要服务的移交,我想使用繁忙的自旋而不是阻塞方法(我有 12 个处理器内核并希望将 3 个专用于这些重要服务)。所以..我将 LinkedBlockingQueue 更改为 ConcurrentLinkedQueue
并且做了
for(;;)
{
Message m = queue.poll();
if( m != null )
....
}
现在..结果是第一个消息传递需要 1 我们,但随后延迟在接下来的 25 次切换中增加,直到达到 500 我们,然后延迟突然回到 1 我们并开始增加..所以我有延迟具有 25 次迭代的周期,其中延迟从 1 us 开始,到 500 us 结束。(消息每秒传递大约 100 次)
平均延迟为 250,这并不是我想要的性能提升。
我还尝试使用 LMAX Disruptor ringbuffer 而不是 ConcurrentLinkedQueue。该框架在繁忙的自旋实现中具有自己的构建和完全不同的队列实现,但结果是相同的。所以我很确定这不是队列的错,也不是我滥用某些东西..
问题是..这到底是怎么回事?为什么我会看到这种奇怪的延迟周期?
干杯!!