Вопрос

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

Спасибо.

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top