首页 > 解决方案 > 如何调试破坏者的性能?

问题描述

所以我有代码:

private void schedule(....) {
        long s = m_ringBuffer.next();            
.....
        m_logger.info("1 [{}]", s);
        m_ringBuffer.publish(s);                
.....
}

private void run(){
   .....
   while(true){
       ...
       final long availableSequence = m_barrier.waitFor(nextSequence);
       while (nextSequence <= availableSequence) {
              m_logger.info("2 [{}] [{}]", nextSequence, availableSequence);
             Task t = m_ringBuffer.get(nextSequence);
             m_logger.info("3");
             ...
        }
     } 
 }

.... 10 次中有 9 次很快,但我会遇到类似的情况

13:35:46.365 [Thread-1] INFO  App - 1 [44905]
13:35:46.380 [Thread-2] INFO  App - 2 [44905] [44905]
13:35:46.380 [Thread-2] INFO  App - 3

我使用 BusySpinWaitStrategy,但我不知道在那 15 毫秒内发生了什么……而且环形缓冲区是空的。

我的 Thread-1 和 Thread-2 被固定到它们独立的 cpu 上。

是否有任何 Linux 系统工具可以让我对此进行调试,或者查看 UNSAFE.get 和 UNSAFE.putOrderedInt 正在做什么?(strace 似乎没有帮助,而且速度很慢)

我的应用程序还使用多个 Chronicle 队列,所以我不确定那里是否存在任何“冲突”,因为 Chronicle 中到处都有 UNSAFE 调用。

我的 Disruptor 版本是 3.4.2,使用 Java 8。

非常感谢!

标签: javadisruptor-pattern

解决方案


推荐阅读