作为测试,我编写了一个小工具来测试两台PC之间的LAN连接。
它是一个客户端/服务器模型,它只发送尽可能多的UDP数据包,另一方面我会读取所有内容
为了最大化我的资源,我为我的机器的每个核心启动了一个goroutine
发送,接收和测量速度有效,但当我达到高吞吐量(500+ Mb / s)时,接收端变得完全没有响应。
如果我限制连接,我没有任何问题
此外,我的CPU最多只有一个核心(虽然我使用runtime.GOMAXPROCS(0)
并开始接收runtime.NumCPU
goroutines)
我在这里将代码上传到GitHub:https://github.com/femot/lanbench
如果我将客户端更改为在本地运行,则不会发生此问题。它只会发生,如果我从另一台PC启动客户端(虽然测量的速度也达到650 Mb / s)
答案 0 :(得分:1)
您的服务器首先受到delta通道的限制,缓冲区为100.我确定在任何重要的数据包速率下您都会压倒该循环。
这不是一个非常好的基准,因为您的数据包速率将比带宽更受限制。您特别只是尝试测试Go可以多快发送和接收1024字节UDP数据报。
无论你启动多少个goroutine,IO都在一个线程中通过网络轮询器。如果您无法使用单个核心使您的链接饱和,那么您将需要多个流程,或者您需要使用其他语言执行此操作。