Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何解释这种速度极慢的套接字连接?_Windows_Performance_Tcp_Winsock - Fatal编程技术网

Windows 如何解释这种速度极慢的套接字连接?

Windows 如何解释这种速度极慢的套接字连接?,windows,performance,tcp,winsock,Windows,Performance,Tcp,Winsock,我试图在两台电脑之间设置一个带宽测试,它们之间只有一个交换机。所有网络硬件都是千兆位的。我在一台机器上放了一个程序来打开一个套接字,监听连接,接受,然后是一个循环来读取数据,并根据“性能计数器”测量接收到的字节数。在另一台机器上,程序打开了一个连接到第一台机器的套接字,并进入一个紧密的循环,以尽可能快地将数据注入连接,每次send()调用1K个块。有了这样的设置,事情似乎快得可以接受;我可以通过网络获得大约30到40兆字节/秒的速度——明显快于100BaseT,在千兆h/w的合理范围内 这里是有

我试图在两台电脑之间设置一个带宽测试,它们之间只有一个交换机。所有网络硬件都是千兆位的。我在一台机器上放了一个程序来打开一个套接字,监听连接,接受,然后是一个循环来读取数据,并根据“性能计数器”测量接收到的字节数。在另一台机器上,程序打开了一个连接到第一台机器的套接字,并进入一个紧密的循环,以尽可能快地将数据注入连接,每次send()调用1K个块。有了这样的设置,事情似乎快得可以接受;我可以通过网络获得大约30到40兆字节/秒的速度——明显快于100BaseT,在千兆h/w的合理范围内

这里是有趣的开始:我尝试使用setsockopt()将每端的缓冲区大小(sou SNDBUF,sou RCVBUF)设置为1K。突然,接收端报告它每秒只收到4000或5000字节。检测事物的传输端,似乎send()调用每次需要0.2到0.3秒,仅发送1K个块。从接收端删除setsockopt()似乎并没有改变什么

显然,试图操纵缓冲区大小是个坏主意。我曾认为,如果send()调用为1K,那么将缓冲区大小强制为1K,这将是一种迫使操作系统在每次发送调用时在线路上放置一个数据包的方法,因为这样会阻止网络堆栈有效地组合数据进行传输,但我没想到吞吐量会下降到可怜的4-5K/秒


我没有时间在资源上追查这个问题,也没有时间以我希望的方式真正理解它,但我真的很想知道是什么让send()花费0.2秒。即使它在等待对方的确认,0.2秒也是难以置信的。给出了什么?

解释很简单,1k缓冲区是一个非常小的缓冲区,您的发送机器可能一次发送一个数据包。发送方必须等待接收方的确认,然后清空缓冲区并接受从应用程序发送的下一个数据块(因为TCP层以后可能需要重新传输数据)


一个更有趣的练习是将缓冲区大小从系统的默认值(查询它以了解它是什么)一直更改到1k,并查看每个缓冲区大小如何影响吞吐量

原因很简单,1k缓冲区是一个非常小的缓冲区,而您的发送机器可能一次发送一个数据包。发送方必须等待接收方的确认,然后清空缓冲区并接受从应用程序发送的下一个数据块(因为TCP层以后可能需要重新传输数据)

一个更有趣的练习是将缓冲区大小从系统的默认值(查询它以了解它是什么)一直更改到1k,并查看每个缓冲区大小如何影响吞吐量

唠叨

唠叨


是的,它几乎肯定涉及ACK——但0.2秒是现代硬件的地质时代。我可能只是能够证明明天花一些时间来调整缓冲区大小是合理的,正如您所说的。那会很有趣的。@Jeff,请把你的发现也发布出来。我也有兴趣了解这种行为。+1 1K在这样的网络上几乎不值得发送。我敢肯定,网络堆栈会等待,看看它是否可以组装一个1.5K以太网MTU,至少。在某些系统上,MTU可能更大-有“特大”9K帧。是的,它几乎肯定涉及ACK-但在现代硬件上,0.2秒是一个地质时代。我可能只是能够证明明天花一些时间来调整缓冲区大小是合理的,正如您所说的。那会很有趣的。@Jeff,请把你的发现也发布出来。我也有兴趣了解这种行为。+1 1K在这样的网络上几乎不值得发送。我敢肯定,网络堆栈会等待,看看它是否可以组装一个1.5K以太网MTU,至少。在某些系统上,MTU可能更大-有“Jumbo”9K帧。我自己对套接字是新手,我也在研究类似的性能问题。操作系统是否为错误检查、路由和消息寻址增加了一些开销?当您创建1K缓冲区时,该1K缓冲区在TCP堆栈中的什么位置?如果在最后(就在连接之前),是TCP还是IP增加了数据包的开销,这可能会使操作系统发送和确认多个数据包?另一方面,如果缓冲区就在应用程序附近,那么发送的数据包将大于1K。我对sockets还不太了解,但这是值得思考的。我自己对sockets还不熟悉,我也在研究类似的性能问题。操作系统是否为错误检查、路由和消息寻址增加了一些开销?当您创建1K缓冲区时,该1K缓冲区在TCP堆栈中的什么位置?如果在最后(就在连接之前),是TCP还是IP增加了数据包的开销,这可能会使操作系统发送和确认多个数据包?另一方面,如果缓冲区就在应用程序附近,那么发送的数据包将大于1K。我对插座的了解还不够,但这是值得思考的。