¿Por qué la descarga de múltiples hilos es más rápida que la de un solo hilo?

13

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?

por qué
fuente
¿Múltiples hilos que dan servicio a la misma conexión TCP, o múltiples hilos cada uno con conexiones TCP separadas? ¿También estás diciendo que el servidor es multiproceso, o el cliente es multiproceso, o ambos?
Spiff

Respuestas:

14

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).

Mark Henderson
fuente
1
Uso FTP y no hay límite en mi servidor
¿por qué el
@ por qué: ¿tal vez es tu ISP el que limita cada conexión a 10 mbps? ¿Se puede obtener más que eso en un probador de velocidad?
André Paramés
4

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.

BarsMonster
fuente
No necesita ACK cada paquete, siempre que el receptor esté vaciando su búfer a una velocidad razonable, el remitente debe poder bombearlos continuamente.
André Paramés
Así es. Pero incluso con 256kb de amortiguamiento, de ping todavía causa desaceleración masiva
BarsMonster
3

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.

Spiff
fuente
Entonces, ¿podría no tener nada que ver con ser de un solo subproceso?
Ape-inago
@ Ape-inago Claro, una aplicación de un solo hilo bien escrita podría mantener la tubería llena, sí.
Spiff
2

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.

Joshkunz
fuente
1
¿Por qué es tan dificil? Solo necesita asignar una sección individual para cada hilo y dejar que escriba en la sección apropiada del archivo de resultados. La fuente de axel me parece bastante sencilla.
André Paramés