为什么Python httplib的块大小被硬编码为8192字节

时间:2018-02-10 10:46:29

标签: python http httplib

我正在寻求快速的流媒体下载 - >上传以通过HTTP将大文件从一台服务器移动到另一台服务器。

在此期间,我注意到urllib3使用的httplib也因此请求,似乎硬编码从流中一次取多少到8192字节

https://github.com/python/cpython/blob/28453feaa8d88bbcbf6d834b1d5ca396d17265f2/Lib/http/client.py#L970

这是为什么? 8192比其他尺寸有什么好处?

2 个答案:

答案 0 :(得分:12)

根据我的发现,块大小应该是资源的页面大小,但由于pagesize仅在UNIX上可用,因此硬编码为8192,因此所有其他系统特别是Windows不会被阻止。否则没有其他理由对其进行硬编码。

来源:https://bugs.python.org/issue21790

答案 1 :(得分:4)

Nginx网络服务器

这是来自nginx

Syntax: client_body_buffer_size size;

Default:    client_body_buffer_size 8k|16k;

设置读取客户端请求正文的缓冲区大小。如果请求主体大于缓冲区,则整个主体或仅其部分被写入临时文件。默认情况下,缓冲区大小等于两个内存页。这在x86,其他32位平台和x86-64上是8K。在其他64位平台上通常为16K

Apache WebServer

ProxyIOBufferSize Directive
Description:    Determine size of internal data throughput buffer
Syntax: ProxyIOBufferSize bytes
Default:    ProxyIOBufferSize 8192
Context:    server config, virtual host
Status: Extension
Module: mod_proxy

因此Apache默认使用8192作为代理缓冲区大小。

Apache客户端

apache Java客户端文档指示

https://hc.apache.org/httpcomponents-client-4.2.x/tutorial/html/connmgmt.html

  • CoreConnectionPNames.SOCKET_BUFFER_SIZE =' http.socket.buffer-size' 确定用于在接收/传输HTTP消息时缓冲数据的内部套接字缓冲区的大小。此参数需要java.lang.Integer类型的值。如果未设置此参数,HttpClient将分配8192字节套接字缓冲区。

Ruby客户端

在ruby中,默认设置值16K

https://github.com/ruby/ruby/blob/814daf855e0aa2c3a1164dc765378d3a092a1825/lib/net/protocol.rb#L172

然后有以下线程

What is a good buffer size for socket programming?

What is the best memory buffer size to allocate to download a file from Internet?

Optimum file buffer read size?

如果你看看其中的许多内容,那么共识就是8K / 16K作为缓冲区大小。并不是它应该固定,但可配置和8k / 16K应该足够大,适合大多数情况。所以我没有看到Python的问题,默认情况下也使用8K。但是,它应该是可配置的

Python 3.7configurable这样,但如果您无法升级到原因,则可能无法帮助您解决问题。