我试图在两台 PC 之间设置带宽测试,它们之间只有一个开关。所有网络硬件都是千兆的。一台机器我放了一个程序来打开一个套接字,监听连接,接受,然后是一个循环来读取数据并根据“性能计数器”测量接收到的字节。在另一台机器上,程序打开一个套接字,连接到第一台机器,然后进入一个紧密循环,以尽可能快地将数据泵入连接,每个 send() 调用以 1K 块为单位。有了这样的设置,事情似乎可以接受的快。在千兆硬件的合理范围内,我可以通过网络获得大约 30 到 40 MBytes /sec 的速度 - 明显快于 100BaseT。
乐趣从这里开始:我尝试使用 setsockopt() 将每一端的缓冲区(SO_SNDBUF、SO_RCVBUF)的大小设置为 1K。突然,接收端报告它每秒只有 4,000 或 5,000 个字节。检测事物的传输方面,似乎 send() 调用每个需要 0.2 到 0.3 秒,只是发送 1K 块。从接收端删除 setsockopt() 似乎并没有改变事情。
现在很明显,试图操纵缓冲区大小是一个坏主意。我曾认为,也许将缓冲区大小强制为 1K,使用 1K 的 send() 调用,将是一种强制操作系统在每次发送调用时将一个数据包放在线路上的方法,并理解这将阻止网络堆栈有效地组合数据进行传输 - 但我没想到吞吐量会下降到微不足道的 4-5K/秒!
我没有时间在资源上追查这个问题并以我想要的方式真正理解它,但我真的很想知道什么可以让 send() 花费 0.2 秒。就算是在等待对方的ack,0.2秒也太不可思议了。是什么赋予了?