Выбор размера буфера для FTP и HTTP-передач
Как выбрать размер буфера (байты, которые я читаю или пишу в сокет) для максимальной пропускной способности при реализации низкоуровневой передачи HTTP и FTP? Мое приложение должно передавать данные с помощью HTTP или FTP при соединениях от 130 Кбит/с до 3 Мбит/с (заранее я знаю ожидаемую скорость). Иногда это односторонняя передача, иногда она идет в обоих направлениях. Должен ли я придерживаться некоторого среднего размера буфера, или я должен варьировать его в зависимости от скорости соединения?
Спасибо.
Ответы
Ответ 1
Сначала сделайте некоторые измерения.
Затем, после того, как вы получите надежное измерение производительности, внесите изменения в размер буфера и постройте график скорости и размера буфера.
Поскольку вы заранее знаете скорость соединения, вы можете получить некоторые измерения фактических скоростей с различными фактическими размерами буфера.
ОС, стек протоколов и сеть слишком сложны, чтобы выработать ответ с первых принципов. Вам нужно измерить, прежде чем что-либо делать.
Ответ 2
Выберите размер буфера более 8 КБ. 9000, как правило, самый большой размер MTU (максимальная единица передачи), используемый в даже самых быстрых сетях.
Когда вы используете буфер, превышающий MTU соединения, операционная система разбивает его на части размера MTU по мере необходимости, и, следовательно, все, что вы используете над MTU, мало повлияет на производительность сети.
Однако использование большого буфера, скорее всего, будет иметь другое влияние на производительность, если вы переносите файлы, то использование больших буферов может увеличить производительность чтения, тем самым улучшая скорость вашего приложения.
Итак, обычно выбор хорошего круглого номера, такого как 16KB, - хорошая идея. Определенно, не стоит меньше 1500, так как это может отрицательно повлиять на производительность сети (в результате операционная система иногда посылает небольшие пакеты, что снижает производительность в сети).
Ответ 3
Вы можете получить размер буфера: httpSocket.getReceiveBufferSize(); Я настоятельно рекомендую записывать этот буфер в ОЗУ в процессе чтения. Например: ByteArrayOutputStream memoryFile. и только после заполнения буфера запишите его на диск.