我正在处理一个带有两个客户端的项目,一个用于发送,另一个用于接收udp数据报,两台机器直接相互连接。
每个数据报的大小为1024byte,使用winsock(阻塞)发送。
它们都在非常快的机器上运行(单独)。 16gb ram和8 cpu's,raid 0驱动器
我正在寻找最大化我的吞吐量的技巧,提示应该是在winsock级别,但如果你有其他一些提示,它也会很棒。
目前我的传输速度为250-400mbit。我正在寻找更多
感谢。
答案 0 :(得分:4)
由于我不知道除了发送和接收您的应用程序之外还有什么其他内容很难知道还有什么可能限制它,但这里有几件事要尝试。我假设您使用的是IPv4,而我不是Windows程序员。
使用可靠连接时,最大化要发送的数据包大小。对于100 mbs以太网,最大数据包为1518,以太网使用18,IPv4使用20-64(通常为20),UDP使用8个字节。这意味着通常您应该能够为每个数据包发送1472字节的UDP有效负载。
如果您使用支持它的千兆以太网设备,您的数据包大小会增加到9000字节(巨型帧),因此发送更接近该大小的数据应该可以加快速度。
如果您要向收件人发送任何来自您的收件人的确认,请尝试确保它们很少发送,并且一次只能确认一个数据包。尽量让听众不必多说,并尽量让发送者不必等待听众获得继续发送的许可。
在发件人应用程序所在的计算机上,考虑为接收者所在的计算机设置静态ARP条目。如果没有这几秒,可能会有一个暂停,同时发出新的ARP请求以确保ARP缓存是最新的。有些ARP实现可能会在ARP条目到期之前完成此请求,这会减少影响,但有些则不会。
尽可能多地关闭网络用户。如果您使用的是以太网交换机,那么您应该专注于将运行应用程序所在的计算机/网络设备的流量驻留/使用的内容(这包括广播消息,如许多ARP请求)。如果它是一个集线器,那么你可能想要安静整个网络。 Windows倾向于向网络发送持续的垃圾流,在许多情况下这些垃圾无用。
可能会限制一个应用程序或用户可以拥有的网络带宽量。或者,操作系统可以自行使用多少网络带宽。如果存在,可以在注册表中更改这些内容。
网络接口芯片实际上并不总是支持网络的最大带宽并不罕见。有些芯片可能会丢失数据包,因为它们正在忙于处理先前的数据包,以及一些不能像以太网规范所允许的那样靠近发送数据包的数据包。此外,系统的其余部分可能无法跟上,即使它是。
答案 1 :(得分:2)
要注意的一些事项:
SO_SNDBUF
和SO_RCVBUF
套接字选项来平衡峰值和数据包丢弃答案 2 :(得分:1)
使用1Gbps网络并升级您的网络硬件......
答案 3 :(得分:1)
使用经过验证的代码片段测试硬件的数据包限制,例如iperf:
http://www.noc.ucf.edu/Tools/Iperf/
我正在链接Windows版本,启动Linux LiveCD并尝试使用Linux版本来比较IP堆栈可能是一个好主意。
您的NIC运行效果不佳,请尝试使用英特尔千兆位服务器适配器:
http://www.intel.com/network/connectivity/products/server_adapters.htm
答案 4 :(得分:0)
对于TCP连接,已经表明使用多个并行连接将更好地利用数据连接。我不确定这是否适用于UDP,但它可能有助于解决数据包处理的一些延迟问题。
所以你可能想尝试多个阻塞调用的线程。
答案 5 :(得分:0)
除了Nikolai关于发送和recv缓冲区的建议,如果可以的话,切换到重叠的I / O并且有许多recvs挂起,这也有助于最小化由于缺少缓冲区而被堆栈丢弃的数据报的数量空间。
如果您正在寻找可靠的数据传输,请考虑UDT。