Linux低延迟TCP流。

3
我有一个嵌入式应用程序,有这个要求:一个TCP网络流需要绝对的最高优先级,高于所有其他出站网络流量。如果有任何等待传输到该流上的数据包,它们应该是下一个发送的数据包。就是这样。
我的成功指标如下:在没有后台流量的情况下测量高优先级延迟。添加后台流量并再次测量。时延的差异应为发送一个低优先级数据包的时间。在100Mbps链路、MTU=1500的情况下,大约为150微秒。我的测试系统由两个通过交叉电缆连接的Linux盒子组成。
我尝试了很多很多的方法,虽然我已经显著改善了延迟,但还没有达到目标(目前我看到有5毫秒的附加延迟)。我已经发布了另一个非常具体的问题,但认为我应该重新开始提问一个一般性的问题。
第一个问题:Linux能实现这个吗? 第二个问题:如果可以,我需要做什么?
- tc? - 我应该使用哪种qdisc? - 优化内核网络参数?哪些? - 还有什么我错过的东西吗?
谢谢您的帮助!
Eric
更新于2010年10月4日: 我在发送端和接收端都设置了tcpdump。这是我在发送端看到的(似乎拥塞的地方):
0 us   Send SCP (low priority) packet, length 25208
200 us Send High priority packet, length 512

在接收方面,我看到:
~ 100 us  Receive SCP packet, length 548
170 us    Receive SCP packet, length 548
180 us    Send SCP ack
240 us    Receive SCP packet, length 548
...  (Repeated a bunch of times)
2515 us   Receive high priority packet, length 512

问题似乎是SCP数据包的长度过长(25208字节)。根据MTU(我为此测试设置为600),它被分成多个数据包。然而,这发生在比流量控制更低的网络层中,因此我的延迟是由最大TCP传输数据包大小而不是MTU决定的!真是烦人啊...
有人知道如何在Linux上设置TCP的默认最大数据包大小吗?

这是你正在编写的应用程序,可以自己控制,还是你试图使用网络或操作系统来实现这个功能? - Nick
这是我自己编写的应用程序,我对套接字参数拥有完全控制。 - Eric
1个回答

1
您可能需要检查您的NIC驱动程序设置。一些驱动程序会合并中断,这会在高吞吐量和增加延迟之间进行权衡。

http://www.29west.com/docs/THPM/latency-interrupt-coalescing.html

另外,我不知道网卡是否正在缓冲多个输出数据包,但如果是这样的话,将更难实施所需的优先级:如果有多个低优先级数据包在网卡中缓冲,内核可能没有办法告诉网卡“忘记我已经发送给你的那些东西,先发送这个高优先级数据包”。

--- 更新 ---

如果问题是长的TCP段,我相信您可以通过ip route上的mtu选项来控制TCP层广告的最大段大小。例如:

ip route add default via 1.1.1.1 mtu 600

(请注意,您需要在接收端执行此操作。)

谢谢,但在我的情况下没有起作用。请查看我刚刚添加到原始问题中的“更新”部分中的更多评论。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接