【问题标题】:Socket throttling because client not reading data fast enough?由于客户端读取数据速度不够快而导致套接字节流?
【发布时间】:2009-09-08 16:56:50
【问题描述】:

我有一个通过 TCP 套接字的客户端/服务器连接,服务器尽可能快地写入客户端。

查看我的网络活动,生产客户端以大约 2.5 Mb/s 的速度接收数据。

我写的一个新的轻量级客户端只是为了读取和基准速率,它的速率约为 5.0Mb/s(这可能是服务器可以传输的最大速度左右)。

我想知道这里的速率是由什么决定的,因为客户端不会向服务器发送任何数据来告诉它任何速率限制。

【问题讨论】:

    标签: language-agnostic sockets throttling throughput


    【解决方案1】:

    在 TCP 中它是客户端。如果服务器的 TCP 窗口已满 - 它需要等到来自客户端的更多 ACK 到来。它在 TCP 堆栈中对您隐藏,但 TCP 引入了保证交付,这也意味着服务器发送数据的速度不能超过客户端处理它们的速度。

    【讨论】:

      【解决方案2】:

      TCP 有流量控制,它会自动发生。在http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Flow_control 阅读有关它的信息

      当管道由于流控而被填满时,服务器 I/O 套接字写入操作将不会完成,直到流控被释放。

      【讨论】:

        【解决方案3】:

        服务器正在以 5.0Mb/s 的速度写入数据,但如果您的客户端是这里的瓶颈,那么服务器必须等待“Sent Buffer”中的数据完全发送到客户端,或者释放足够的空间来放入更多数据。

        正如您所说的轻量级客户端能够以 5.0Mb/s 的速度接收,那么您必须检查客户端中的接收后操作。如果您正在接收数据,然后在读取更多数据之前对其进行处理,那么这可能是瓶颈。

        最好异步接收数据,一旦接收完成,就要求客户端套接字重新开始接收数据,同时在单独的线程池线程中处理接收到的数据。这样,您的客户端始终可以接收传入的数据,而服务器可以全速发送。

        【讨论】:

          猜你喜欢
          • 2016-03-02
          • 2011-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-08
          • 1970-01-01
          相关资源
          最近更新 更多