【问题标题】:TCP Socket Maximum BandwidthTCP 套接字最大带宽
【发布时间】:2022-12-08 07:04:33
【问题描述】:

我想知道套接字速度是否有限制,我有一个为多个客户端提供服务的服务器(每个客户端都在一个线程上运行),每个客户端发送一个图像,服务器进行一些分析并返回结果。

我让客户端计算 fps 来监控速度,在服务器上的带宽达到 110 MiB/s 之后,无论连接多少个客户端,带宽似乎都没有增加,这导致客户端变慢(我假设是因为客户端无法使用更多带宽,并且在服务器返回对另一个客户端的请求后等待套接字释放)。

我尝试减小发送图像的尺寸,这允许我增加客户端数量(这意味着 CPU 可以同时处理更多客户端),但是当接收到的数据达到 110 MiB/ 时我达到了相同的限制秒。

我尝试使用iperf检查服务器和客户端之间的网络速度,结果是850-1000 Mbits/sec(使用多个设备作为客户端),所以网络连接足够快并且可以处理更多带宽。

我也尝试打开另一个服务实例监听另一个端口,接收带宽仍然停留在 110 MiB/s。

在所有情况下,当我在与服务器相同的机器上打开一个新客户端时,该客户端将比其他客户端快 10 倍以上。这再次意味着服务器可以处理更多的客户端。

这留下了为什么带宽停止在 110 MiB/s 的问题,每个套接字是否允许最大速度?

我知道 python 有模拟多线程的 GIL,CPU 只能解码/处理(不确定正确的术语是什么)110 MiB/s 的传入数据吗?如果是这样,那么当我添加另一个服务器实例并将新客户端连接到新服务器时,为什么它没有增加?为什么它能够在同一台机器上处理客户端?

我试着查看是否有最大套接字带宽限制,我只能找到如何限制(减少)套接字带宽,这与我想做的相反。

以下是一些可能相关的信息:

  • Intel i7-10700 在服务器上。
  • 服务器上的 Ubuntu 18.04。
  • 服务器和客户端连接在同一台交换机上的本地网络上。
  • 服务器和客户端正在运行 python 3.6.9
  • CPU 在所有内核上以 50% 的速度运行
  • 使用 gnome-system-monitor 监控带宽
  • 客户端正在运行 Ubntu18.04 和 20.04

【问题讨论】:

    标签: python sockets ubuntu-18.04


    【解决方案1】:

    “套接字”的性能没有固定限制。通过套接字访问的 TCP 连接的性能可能存在多种限制。其中之一是:

    吞吐量 <= WindowSize / RoundTripTime

    另一个是:

    吞吐量 <= LinkRate * (DataPerPacket / DataPlusHeadersPerPacket)

    此外,从广义上讲,一个 TCP 连接将使用不超过一个 CPU。所以它不会比 CPU 执行网络堆栈代码的速度快。

    但就目前而言,110 MiB/s 是 110 * 1048576 或 115343360 字节每秒。每字节 8 位,即每秒 922746880 位,或 922 Mbit/s,处于您为 iperf 结果报告的范围的中间。

    听起来您有一个 1 Gbit/s 的物理网络,并且实际上已经饱和了。

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多