2008-11-11 27 views
13

¿Cómo se elige el tamaño de un búfer (bytes que leo o escribe en el socket) para obtener el máximo rendimiento cuando se implementa 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 (conozco la velocidad esperada de antemano). A veces es una transferencia de una sola dirección, a veces va en ambas direcciones. ¿Debo seguir con un tamaño promedio de buffer o debo variarlo dependiendo de la velocidad de conexión?Elección del tamaño del búfer para las transferencias FTP y HTTP

Gracias.

Respuesta

6

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 frente al tamaño del búfer.

Dado que conoce las velocidades de conexión por adelantado, debe poder obtener algunas medidas de las velocidades reales con diferentes tamaños reales de búfer.

El sistema operativo, la pila de protocolos y la red son demasiado complejos para encontrar una respuesta desde los primeros principios. Debes medir antes de hacer cualquier cosa.

+0

Gracias. Las mediciones son algo en lo que estamos metidos en este momento. Pensé que podría haber algún algoritmo genérico o consejo como usar 2x MTU o algo así ... Bueno, entonces la medición sí lo es. – wasker

+0

Si hubiera un algoritmo genérico, ya se habría implementado como parte del protocolo. Nunca hay algoritmos genéricos que no se hayan implementado. Medir es su única opción. –

11

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

Cuando utiliza un búfer más grande que la MTU de la conexión, el sistema operativo lo descompondrá en piezas de tamaño MTU según sea necesario, y así cualquier cosa que use sobre la MTU tendrá poco efecto en el rendimiento de la red.

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

Por lo tanto, generalmente elegir un buen número redondo como 16KB es una buena idea. Definitivamente no entre menos 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).

+0

Hola, gracias por tus pensamientos. ¿Qué pasa si estamos hablando de redes lentas (130 kbps) y transferencia bidireccional (supongamos, tenemos conexión simétrica). ¿Los amortiguadores grandes no obstruirán la transmisión en una de las direcciones, mientras benefician a la otra? – wasker

+0

Eso depende de las características físicas del enlace (simplex vs. dúplex). La mayoría de las conexiones de Ethernet son dúplex, lo que significa que pueden enviar y recibir al mismo tiempo. – SoapBox

+0

Pero también, generalmente la congestión en las redes es causada por la cantidad de paquetes (no su tamaño). Tantos paquetes pequeños pueden causar más problemas que algunos grandes. – SoapBox

Cuestiones relacionadas