【问题标题】:Reading from net.UDPConn locks up PC从 net.UDPConn 读取会锁定 PC
【发布时间】:2015-12-15 16:46:00
【问题描述】:

作为测试,我编写了一个小工具来测试两台 PC 之间的 LAN 连接。 它是一个客户端/服务器模型,它只发送尽可能多的 UDP 数据包,另一方面,我可以读取所有内容。
为了最大限度地利用我的资源,我为我的机器拥有的每个内核启动了一个 goroutine。
发送、接收和测量速度有效,但是当我达到高吞吐量(500+ Mb/s)时,接收端变得完全没有响应。
如果我限制连接,我没有任何问题。
我的 CPU 也只使用了一个核心(尽管我使用了 runtime.GOMAXPROCS(0) 并开始在 runtime.NumCPU goroutines 中接收)

我在这里将代码上传到 GitHub:https://github.com/femot/lanbench

如果我将客户端更改为在本地运行,则不会出现问题。仅当我从另一台 PC 启动客户端时才会发生这种情况(尽管测得的速度也达到 650 Mb/s)

【问题讨论】:

    标签: go


    【解决方案1】:

    您的服务器首先受到缓冲区为 100 的 delta 通道的限制。我敢肯定,在任何显着的数据包速率下,您都会压倒该循环。

    这不是一个很好的基准,因为您的数据包速率将成为比带宽更重要的限制因素。您只是在尝试测试 Go 发送和接收 1024 字节 UDP 数据报的速度。

    不管你启动了多少个 goroutine,IO 都在一个线程中通过网络轮询器。如果你不能用一个核心使你的链接饱和,你将需要多个进程,或者你需要用另一种语言来做。

    【讨论】:

    • 这些可能都是有效点,但我的主要问题仍然是我的电脑在运行时变得无响应。
    • @femot:如果您的 PC 变得无响应,则需要在 PC 上进行调试。您正在运行当前版本的 Go 吗?你的内存不足了吗?如果只是您的 Go 应用被锁定,您可以为我们获取堆栈跟踪吗?
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多