【问题标题】:Choosing buffer size for FTP and HTTP transfers为 FTP 和 HTTP 传输选择缓冲区大小
【发布时间】:2010-09-21 21:39:38
【问题描述】:

在实现低级 HTTP 和 FTP 传输时,如何选择缓冲区的大小(我从套接字读取或写入套接字的字节数)以获得最大吞吐量?我的应用程序应该使用 HTTP 或 FTP 在 130 Kbps 到 3 Mbps 的连接上传输数据(我事先知道预期的速度)。有时是单向传输,有时是双向传输。我应该坚持一些平均缓冲区大小还是必须根据连接速度来改变它?

谢谢。

【问题讨论】:

    标签: algorithm http ftp communication


    【解决方案1】:

    选择超过 8KB 的缓冲区大小。 9000 通常是即使在最快的网络中使用的最大 MTU(最大传输单元)大小。

    当您使用的缓冲区大于连接的 MTU 时,操作系统会根据需要将其分解为 MTU 大小的部分,因此您在 MTU 上使用的任何内容对网络性能几乎没有影响。

    但是,使用大缓冲区可能会对性能产生其他影响,如果您正在传输文件,那么使用大缓冲区可能会提高读取性能,从而提高应用程序的速度。

    因此,通常选择 16KB 这样的好整数是个好主意。绝对不要低于 1500,因为这会对网络性能产生负面影响(导致操作系统有时会发送小数据包,从而降低网络性能)。

    【讨论】:

    • 您好,感谢您的意见。如果我们谈论的是慢速网络(130 kbps)和双向传输(假设我们有对称连接)。大缓冲区不会阻塞其中一个方向的传输,而有利于另一个方向吗?
    • 这取决于链路的物理特性(单工与双工)。大多数以太网连接都是双工的,这意味着它们可以同时发送和接收。
    • 但是,通常网络中的拥塞是由数据包的数量(而不是它们的大小)引起的。这么多小数据包比几个大数据包造成的问题更多。
    • 如果这有什么不同,我们说的是蜂窝网络。
    【解决方案2】:

    首先,进行一些测量。

    然后,在进行可靠的性能测量后,更改缓冲区大小并绘制速度与缓冲区大小的关系图。

    由于您事先知道连接速度,因此您应该能够在不同的实际缓冲区大小下获得一些实际速度的测量值。

    操作系统、协议栈和网络过于复杂,无法从第一原理中得出答案。你需要在做任何事情之前进行测量。

    【讨论】:

    • 谢谢。测量是我们现在正在做的事情。我认为可能有一些通用算法或建议,例如使用 2x MTU 或类似的东西......好吧,那就是测量。
    • 如果有通用算法,它应该已经作为协议的一部分实现了。从来没有没有实现过的通用算法。测量是您唯一的选择。
    【解决方案3】:

    可以获取缓冲区大小:httpSocket.getReceiveBufferSize(); 我强烈建议在读取过程中将此缓冲区写入 RAM。 例如:ByteArrayOutputStream 内存文件。 并且只有在填充缓冲区后才将其写入磁盘。

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 2017-06-14
      • 2014-08-19
      • 2013-06-14
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多