Pregunta

¿Cómo se elige el tamaño de un búfer (bytes que leo o escribo en el socket) para obtener el máximo rendimiento al implementar una transferencia HTTP y FTP de bajo nivel? Mi aplicación debe transferir datos con HTTP o FTP en conexiones que varían de 130 Kbps a 3 Mbps (sé de antemano la velocidad esperada). A veces es una transferencia de ida, a veces va en ambas direcciones. ¿Debo mantener un tamaño promedio de búfer o debo variarlo dependiendo de la velocidad de conexión?

Gracias.

¿Fue útil?

Solución

Primero, obtenga algunas medidas.

Luego, después de tener una medición de rendimiento confiable, realice cambios en el tamaño de su búfer y trace un gráfico de velocidad vs. tamaño del búfer.

Dado que conoce las velocidades de conexión de antemano, debería poder obtener algunas mediciones de velocidades reales con diferentes tamaños de búfer reales.

El sistema operativo, la pila de protocolos y la red son demasiado complejos para encontrar una respuesta a partir de los primeros principios. Debe medir antes de hacer algo.

Otros consejos

Elija un tamaño de búfer de más de 8 KB. 9000 es típicamente el tamaño de MTU (unidad de transmisión máxima) más grande utilizado incluso en las redes más rápidas.

Cuando usa un búfer más grande que el MTU de la conexión, el sistema operativo lo dividirá en pedazos del tamaño de MTU según sea necesario, y por lo tanto, cualquier cosa que use sobre el MTU tendrá poco efecto en el rendimiento de la red.

Sin embargo, el uso de un búfer grande probablemente tendrá otro efecto en el rendimiento, si está transfiriendo archivos, el uso de búferes grandes puede aumentar el rendimiento de lectura, mejorando así la velocidad de su aplicación.

Entonces, por lo general, elegir un buen número redondo como 16KB es una buena idea. Definitivamente no vaya por debajo de 1500, ya que esto puede afectar negativamente el rendimiento de la red (haciendo que el sistema operativo a veces envíe paquetes pequeños, lo que disminuye el rendimiento en la red).

Puede obtener el tamaño del búfer: httpSocket.getReceiveBufferSize (); Recomiendo escribir este búfer en RAM en el proceso de lectura. Por ejemplo: ByteArrayOutputStream memoryFile. y solo después de llenar el búfer escríbelo en el disco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top