我们的应用程序通过 Java 中的 TCP/IP 套接字非常快速地读取数据。我们正在使用带有非阻塞套接字和选择器的 NIO 库来指示已准备好读取。平均而言,读取和处理读取数据的总处理时间为亚毫秒。然而,我们经常看到 10-20 毫秒的峰值。(在 Linux 上运行)。
使用tcpdump我们可以看到 tcpdump 读取 2 条离散消息之间的时间差,并将其与我们的应用程序时间进行比较。我们看到tcpdump似乎没有延迟,而应用程序可以显示 20 毫秒。
我们很确定这不是 GC,因为 GC 日志显示几乎没有 Full GC,并且在 JDK 6(据我了解)中,默认 GC 是并行的,所以它不应该暂停应用程序线程(除非执行 Full GC) .
看起来 Java 的Selector.select(0)
方法返回读取就绪状态似乎有一些延迟,因为在 TCP 层,数据已经可供读取(并且tcpdump正在读取它)。
附加信息:在峰值负载时,我们平均每条消息处理约 6,000 x 150 字节,或每秒约 900 MB。