我们在 LAN 上的许多 Linux 服务器上大量使用多播消息传递。我们看到很多延误。我们基本上会发送大量的小包裹。我们更关心延迟而不是吞吐量。这些机器都是现代的多核机器(如果算上超线程,至少有 4 个,通常是 8 个,16 个)机器,负载总是 2.0 或更低,通常负载小于 1.0。网络硬件的容量也低于 50%。
我们看到的延迟看起来像排队延迟:数据包将迅速开始增加延迟,直到看起来它们堵塞,然后恢复正常。
消息传递结构基本上是这样的:在“发送线程”中,从队列中拉出消息,添加时间戳(使用gettimeofday()
),然后调用send()
. 接收程序接收消息,为接收时间加上时间戳,并将其推送到队列中。在一个单独的线程中,处理队列,分析发送和接收时间戳之间的差异。(请注意,我们的内部队列不是问题的一部分,因为时间戳是在我们的内部队列之外添加的。)
我们真的不知道从哪里开始寻找这个问题的答案。我们不熟悉 Linux 内部结构。我们的怀疑是内核在发送端或接收端(或两者)对数据包进行排队或缓冲。但我们不知道如何追踪和追踪它。
值得一提的是,我们使用的是 CentOS 4.x(RHEL 内核 2.6.9)。