Выбор размера буфера для FTP и HTTP-передач - PullRequest
14 голосов
/ 12 ноября 2008

Как выбрать размер буфера (байты, которые я читаю или записываю в сокет) для максимальной пропускной способности при реализации низкоуровневой передачи HTTP и FTP? Мое приложение должно передавать данные через HTTP или FTP по соединениям, варьирующимся от 130 Кбит / с до 3 Мбит / с (заранее известна ожидаемая скорость). Иногда это односторонний трансфер, иногда он идет в обоих направлениях. Должен ли я придерживаться некоторого среднего размера буфера или я должен варьировать его в зависимости от скорости соединения?

Спасибо.

Ответы [ 3 ]

12 голосов
/ 12 ноября 2008

Выберите размер буфера более 8 КБ. 9000, как правило, самый большой размер MTU (максимальная единица передачи), используемый даже в самых быстрых сетях.

Когда вы используете буфер больше, чем MTU соединения, операционная система будет разбивать его на куски размера MTU по мере необходимости, и, таким образом, все, что вы используете поверх MTU, будет мало влиять на производительность сети.

Однако использование большого буфера, скорее всего, будет влиять на производительность, если вы передаете файлы, то использование больших буферов может повысить производительность чтения, что повысит скорость вашего приложения.

Итак, обычно хорошая круглая цифра, например 16 КБ, хорошая идея. Определенно не стоит меньше 1500, так как это может негативно повлиять на производительность сети (из-за чего операционная система иногда отправляет небольшие пакеты, что снижает производительность в сети).

6 голосов
/ 12 ноября 2008

Во-первых, проведите некоторые измерения.

Затем, после надежного измерения производительности, внесите изменения в размер буфера и построите график зависимости скорости от размера буфера.

Поскольку вы заранее знаете скорости соединения, вы сможете получить некоторые измерения фактических скоростей с различными фактическими размерами буфера.

ОС, стек протоколов и сеть слишком сложны, чтобы выработать ответ из первых принципов. Вы должны измерить, прежде чем делать что-либо.

0 голосов
/ 27 января 2019

Вы можете получить размер буфера: httpSocket.getReceiveBufferSize (); Я настоятельно рекомендую записывать этот буфер в ОЗУ в процессе чтения. Например: ByteArrayOutputStream memoryFile. и только после заполнения буфера запишите его на диск.

...