2010-07-22 22 views
0

即时通讯工作在两台客户机之间,一台用于发送,另一台用于接收udp数据报,两台机器直接相互连接。每个数据报的大小为1024byte,并使用winsock(阻塞)发送。它们都在非常快的机器上运行(单独)。与16GB RAM和8个CPU,与RAID 0驱动器。
即时寻找提示,以最大限度地提高我的吞吐量,提示应该在winsock水平,但如果你有一些其他技巧,这将是伟大的。
目前即时获得250-400mbit的传输速度。即时通讯寻找更多。
谢谢。在udp上最大化性能

+0

什么是两台机器之间的链路的带宽?你确定你没有CPU瓶颈(即你没有100%的CPU运行)? – adamk 2010-07-22 14:30:58

+0

带宽为1gbps。 没有.. CPU是在30%〜 – EricBenDavid 2010-07-22 14:49:24

回答

4

因为除了发送和接收应用程序之外,还不知道还有什么可以限制它,所以这里有几件事要尝试。我假设你使用的是IPv4,而我不是Windows程序员。

最大化使用可靠连接时发送的数据包大小。对于100 mbs以太网,最大数据包为1518,以太网使用18个,IPv4使用20-64(通常为20),UDP使用8个字节。这意味着通常您应该能够发送每个数据包1472个字节的UDP有效负载。

如果您使用的千兆以太网设备支持它,您的数据包大小将增加到9000字节(巨型帧),因此发送更接近该大小的数据应该可以加快速度。

如果您将来自听众的任何确认发送给您的发件人,请尝试确保它们很少发送,并且一次只能确认一个数据包。尽量让听众不必说太多,并尽量避免发送者不得不等待听众继续发送。

在发件人应用程序所在的计算机上,请考虑为接收方所在的计算机设置静态ARP条目。如果没有这个每隔几秒钟,可能会有一个暂停,同时发出新的ARP请求以确保ARP缓存是最新的。一些ARP实现可能会在ARP条目到期之前完成此请求,这会减少影响,但有些则不会。

关闭尽可能多的网络用户。如果您使用的是以太网交换机,那么您应该专注于将流入/流出运行您的应用程序的计算机/网络设备驻留/使用(包括广播消息,如许多ARP请求)的流量。如果它是一个集线器,那么你可能想要安静整个网络。 Windows倾向于向网络发送持续不断的垃圾流,这在很多情况下并不有用。

可能会限制一个应用程序或用户可以拥有多少网络带宽。或者,操作系统允许自己使用多少网络带宽可能会受到限制。如果它们存在,这些可能会在注册表中更改。

网络接口芯片实际上并不总是支持网络的最大带宽并不少见。有些芯片可能会遗漏数据包,因为它们正在忙于处理先前的数据包,以及一些不能像以太网规格所允许的那样靠近发送数据包的芯片。另外,系统的其他部分可能无法跟上,即使是这样。

1

使用1Gbps的网络和升级你的网络硬件...

+3

他显然不使用100Mbit网络或他不会得到400Mbps ... – adamk 2010-07-22 14:34:49

+0

100MByte网络!= 100MBit网络:) – ariso 2010-07-29 14:37:00

0

对于TCP连接已经表明,使用多个并行连接将更好地利用数据连接。我不确定这是否适用于UDP,但它可能有助于解决某些数据包处理的延迟问题。

所以你可能想尝试多个阻塞调用的线程。

+0

即时通讯限于一个特定的发送和接收端口。 据我所知,你不能在同一个端口打开2个插座。 – EricBenDavid 2010-07-22 14:51:03

2

有些东西看:

  • 连接的UDP套接字some info)快捷几个操作在内核中,因此速度更快(见史蒂文斯UNP书详细信息)。
  • 插座发送和接收缓冲区 - 与SO_SNDBUFSO_RCVBUF套接字选项起到抵消尖峰和丢包
  • 看看你能不能撞了链接MTU和使用jumbo frames
0

除了发送和recv缓冲区尼古拉的建议,如果可以的话,切换到重叠I/O,并有许多RECVS悬而未决,这也有助于减少由堆栈由于缺乏丢弃的数据报的数量缓冲区空间。

如果您正在寻找可靠的数据传输,请考虑UDT