2010-10-01 133 views
3

我有一个嵌入式应用程序,具有此要求:一个传出TCP网络流需要绝对最高优先级,超过所有其他传出网络流量。如果有任何数据包在等待在该数据流上传输,它们应该是下一个发送的数据包。期。Linux低延迟tcp流

我的成功度量如下:在没有后台流量时测量高优先级延迟。添加背景流量,然后再次测量。延迟的差异应该是发送一个低优先级数据包的时间。通过100Mbps链路,mtu = 1500,大约是150 us。我的测试系统有两个linux盒子通过交叉电缆连接。

我已经尝试了很多很多东西,尽管我的延迟时间有相当大的改善,但还没有达到目标(我目前看到5毫秒的背景流量延迟)。我已经发布了另一个非常具体的问题,但认为我应该从一个普遍的问题开始。

第一个问题:Linux可以吗?第二个问题:如果是这样,我需要做什么?

  • tc?
  • 我应该使用什么qdisc?
  • 调整内核网络参数?哪个?
  • 我还缺少什么其他的东西?

感谢您的帮助!

埃里克

更新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! Arghhh ..

任何人都知道一个很好的方法来设置在Linux上TCP的默认最大数据包大小?

+0

这是一个您正在编码的应用程序,您可以自己控制它,或者您是否尝试使用网络或操作系统来实现此目的? – Nick 2010-10-01 18:29:56

+0

这是我自己编写的应用程序,并且完全控制套接字参数。 – Eric 2010-10-01 23:40:19

回答

1

您可能需要检查NIC驱动程序的设置。一些驱动程序会合并中断,这会导致更高的吞吐量以增加延迟。

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

另外,我不知道如果NIC缓冲多输出数据包,但如果是这样,这将使它难以执行所需的优先级:如果有多个缓冲的低优先级数据包在NIC中,内核可能没有办法告诉NIC“忘记我已经发送给你的东西,先发送这个高优先级的数据包”。

---更新---

如果问题是长期TCP段,我相信你能控制什么最大片段大小TCP层通过ip routemtu选项通告。例如:

ip route add default via 1.1.1.1 mtu 600 

(请注意,您需要做的这对收到侧)。

+0

谢谢,但这在我的情况下不起作用。在刚刚添加到原始问题的“更新”部分中查看更多评论。 – Eric 2010-10-04 16:35:29