Почему размер блока для Python httplib читается жестко, как 8192 байта

Я хочу быстро загрузить потоковое скачивание → загрузить для перемещения больших файлов через HTTP с одного сервера на другой.

Во время этого, я заметил, что httplib, который используется urllib3 и, следовательно, также запросы, кажется, жесткий код, сколько он извлекает из потока за один раз до 8192 байт

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

Почему это? В чем преимущество 8192 по сравнению с другими размерами?

Ответ 1

Сетевой сервер Nginx

Это от nginx

Syntax: client_body_buffer_size size;

Default:    client_body_buffer_size 8k|16k;

Устанавливает размер буфера для чтения тела запроса клиента. Если тело запроса больше, чем буфер, весь объект или только его часть записывается во временный файл. По умолчанию размер буфера равен двум страницам памяти. Это 8K на x86, другие 32-разрядные платформы и x86-64. Обычно это 16K на других 64-битных платформах

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

В рубине значение устанавливается по умолчанию 16K

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

Тогда есть ниже нити

Что такое хороший размер буфера для программирования сокетов?

Каков наилучший размер буфера памяти для размещения файлов из Интернета?

Оптимальный размер файла для чтения буфера?

Если вы посмотрите на многие из них, то консенсус будет составлять 8K/16K в качестве размера буфера. И дело не в том, что это должно быть исправлено, но конфигурируемое, а 8k/16K должно быть достаточно хорошим для большинства ситуаций. Поэтому я не вижу проблемы с Python, также используя этот 8K по умолчанию. Но да, это должно было быть

Python 3.7 будет настраиваться как таковой, но тогда это может не помочь вашему делу, если вы не можете обновить его.

Ответ 2

Из того, что я обнаружил, размер блока должен быть размером страницы ресурсов, но поскольку тип страницы доступен только в UNIX, это было жестко закодировано до 8192, поэтому все другие системы, специально созданные Windows, не блокируются при этом. В противном случае нет других причин для жесткого кодирования.

Источник: https://bugs.python.org/issue21790