小编Pon*_*gne的帖子

繁忙旋转以减少上下文切换延迟(java)

在我的应用程序中,有几个服务在自己的线程上处理信息,当它们完成时,它们将消息发布到下一个服务,然后继续在其自己的线程上进行工作.消息的切换是通过LinkedBlockingQueue完成的.切换通常需要50-80 us(从将消息放入队列直到消费者开始处理消息).为了加速最重要服务的切换,我想使用繁忙的旋转而不是阻塞方法(我有12个处理器内核,并希望将3个专用于这些重要的服务).所以..我将LinkedBlockingQueue更改为ConcurrentLinkedQueue

并做到了

for(;;)
{
 Message m = queue.poll();
 if( m != null )
  ....
}
Run Code Online (Sandbox Code Playgroud)

现在..结果是第一个消息传递需要1 us,但随后延迟在接下来的25次切换中增加,直到达到500 us,然后延迟突然回到1 us并且开始增加..所以我有延迟循环有25次迭代,其中延迟从1 us开始,到500 us结束.(消息每秒传递大约100次)

平均延迟为250,这并不是我想要的性能增益.

我还尝试使用LMAX Disruptor ringbuffer而不是ConcurrentLinkedQueue.这个框架在繁忙的旋转实现和完全不同的队列实现中有自己的构建,但结果是相同的.所以我很确定它不是队列的错误或我滥用的东西..

问题是...... Heck在这里发生了什么?为什么我会看到这个奇怪的延迟周期?

干杯!!

java queue performance multithreading

11
推荐指数
1
解决办法
2513
查看次数

标签 统计

java ×1

multithreading ×1

performance ×1

queue ×1