Pon*_*gne 11 java queue performance multithreading
在我的应用程序中,有几个服务在自己的线程上处理信息,当它们完成时,它们将消息发布到下一个服务,然后继续在其自己的线程上进行工作.消息的切换是通过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在这里发生了什么?为什么我会看到这个奇怪的延迟周期?
干杯!!
小智 1
据我所知,如果线程调度程序检测到该线程非常密集地使用 CPU,它可以故意暂停该线程较长时间 - 以在不同线程之间更公平地分配 CPU 时间。尝试LockSupport.park()在队列为空后添加到消费者中,并LockSupport.unpark()在添加消息后添加到生产者中 - 这可能会减少延迟的变化;不过,与阻塞队列相比,它是否真的更好是一个大问题。
| 归档时间: |
|
| 查看次数: |
2513 次 |
| 最近记录: |