Hay un archivo grande en mi servidor. Creo que la descarga de varios subprocesos puede obtener 20 Mbps, pero un solo subproceso puede obtener 10 Mbps, ¿alguien puede explicar esto?
Hay un archivo grande en mi servidor. Creo que la descarga de varios subprocesos puede obtener 20 Mbps, pero un solo subproceso puede obtener 10 Mbps, ¿alguien puede explicar esto?
Respuestas:
Por lo general, esto se debe a que en algún lugar entre usted y el otro servidor hay un firewall que limita cada flujo HTTP a 10 Mbps. Cuando utiliza varios subprocesos, obtiene 2x 10Mb (uno para cada subproceso).
Esto se debe a su ping entre usted y el servidor y el tamaño de paquete / tamaño de ventana tcpip utilizado por su software de descarga.
Básicamente, si tiene 100 ms de ping al servidor y solicita paquetes de 100 kb, solo puede obtener 10 paquetes por segundo usando 1 conexión, incluso si su velocidad de Internet es infinita.
TCP funciona mejor cuando "mantiene la tubería llena": cuando la aplicación de envío sigue enviando buffers lo suficientemente rápido como para mantener la pila TCP del remitente constantemente provista de datos para que siempre pueda tener datos "en vuelo" en la red, y cuando el receptor la aplicación sigue leyendo desde la pila TCP del receptor lo suficientemente rápido como para que la ventana TCP del receptor nunca se llene (de nuevo, por lo que la pila TCP emisora siempre puede mantener los datos "en vuelo" en la red).
Me imagino una aplicación de remitente de un solo subproceso mal escrita que pasa un búfer a la pila TCP, espera escuchar que ha sido completamente Acked y luego pasa otro búfer. Eso significa que una vez que el primer búfer está "en vuelo" en la red, la pila de TCP de envío se queda sin datos para enviar, lo que significa que la tubería se vacía y no se vuelve a llenar hasta después de que Ack vuelve y la aplicación de envío le pasa un nuevo buffer.
También podría imaginar una aplicación de receptor de un solo subproceso mal escrita que no lee de la pila TCP receptora lo suficientemente rápido y, por lo tanto, permite que se llenen los búferes de la pila TCP, lo que significa que la ventana TCP se llena, lo que hace que la pila TCP de envío deja de enviar hasta que la ventana se abra un poco. El aumento del tamaño de la ventana TCP del receptor puede ayudar un poco, pero la solución real en este extremo es leer los datos más rápido.
Bueno, probablemente sea porque solo puedes transferir tantos datos a través de una conexión. Sin embargo, en un programa multiproceso, puede tener dos conexiones que reciben datos al mismo tiempo y duplican la cantidad de información que puede obtener. Hay algunas limitaciones para esto, por ejemplo, la velocidad del servidor desde el que está descargando ... Me quito el sombrero a dos que escribieron el descargador de subprocesos múltiples, no son fáciles de escribir.