performance - rapido - ¿Por qué la transferencia de archivos multiproceso mejora el rendimiento?
puerto usb lento windows 7 (6)
RichCopy , una herramienta mejor que robocopy-with-GUI de Microsoft, parece ser la herramienta actual de elección para copiar archivos. Una de sus características principales, destacada en el artículo de TechNet que presenta la herramienta , es que copia múltiples archivos en paralelo . En su configuración predeterminada, tres archivos se copian simultáneamente, lo que se puede ver muy bien en la GUI: [Progreso: xx% del archivo A, yy% del archivo B, ...]. Hay muchas entries de blog entries elogian esta herramienta y afirman que esto acelera el proceso de copia.
Mi pregunta es: ¿Por qué esta técnica mejora el rendimiento? Por lo que sé, al copiar archivos en sistemas informáticos modernos, el disco duro es el cuello de botella, no la CPU o la red. Supongo que la copia de varios archivos a la vez hace que el proceso completo sea más lento , ya que la unidad de disco duro debe saltar de un archivo a otro en lugar de solo transmitir secuencialmente un archivo. Como RichCopy es más rápido, debe haber algún error en mis suposiciones ...
Por lo que sé, al copiar archivos en sistemas informáticos modernos, el disco duro es el cuello de botella, no la CPU o la red.
Creo que esas suposiciones son demasiado simplistas.
Primero, mientras que las LAN se ejecutan a 100Mb / 1Gbit. Las redes de larga distancia tienen una velocidad de datos máxima inferior a la velocidad máxima del enlace más lento.
En segundo lugar, el rendimiento efectivo del flujo de TCP / IP a través de Internet a menudo está dominado por el tiempo que llevan los mensajes de ida y vuelta y los agradecimientos. Por ejemplo, tengo un enlace de 8 + Mbit, pero mi tasa de datos en las descargas rara vez es superior a 1-2 Mbits por segundo cuando estoy descargando desde los EE. UU. Entonces, si puede ejecutar múltiples flujos en paralelo, un flujo puede estar esperando un reconocimiento mientras que otro está bombeando paquetes. (Pero si intenta enviar demasiado, comienza a tener congestión, tiempos de espera, retroceso y tasas de transferencia generales más bajas).
Finalmente, los sistemas operativos son buenos para realizar una variedad de tareas de E / S en paralelo con otros trabajos. Si está descargando 2 o más archivos en paralelo, el O / S puede estar leyendo / procesando paquetes de red para una descarga y escribiendo en el disco para otra ... al mismo tiempo.
En largas distancias, las redes pueden escribir mucho más rápido de lo que pueden leer. Con multihilo, tener "lectores" adicionales significa que los datos se pueden transmitir de manera más eficiente y no se pueden atascar en búferes.
Es una herramienta de red, por lo que el cuello de botella es la red, no el disco duro. Hasta un punto (bajo) puede obtener más rendimiento de un enlace TCP utilizando unas pocas conexiones en paralelo. Esto (a) paraleliza los apretones de manos TCP; (b) puede hacer un mejor uso del producto de retardo de ancho de banda si es alto; y (c) no hace que una conexión arbitrariamente lenta sea la ruta crítica si, por alguna razón, encuentra un alto RTT o tasa de fallas.
Otra forma de hacer (b) es utilizar un enorme búfer de recepción de socket TCP, pero eso no siempre es conveniente.
Varias de las otras respuestas sobre HDD son incorrectas. Prácticamente cualquier HDD hará una lectura anticipada en el supuesto de acceso secuencial, y cualquier caché inteligente del sistema operativo también lo hará.
La herramienta está haciendo mejoras de uso en el hardware que puede optimizar las solicitudes de lectura y escritura múltiples mucho mejor.
Al copiar un archivo a la vez, el hardware no sabrá que el bloque de datos que actualmente pasa por debajo del encabezado de lectura (o cerca de allí) será necesario para una lectura subsiguiente, ya que el software aún no ha puesto en cola esa solicitud. .
Una sola copia de archivo en estos días no es una tarea muy difícil para los subsistemas de discos modernos. Al darles más trabajo a estos sistemas de hardware al mismo tiempo, la herramienta está aprovechando sus funciones optimizadas de optimización.
Mi opinión es que los cabezales de lectura y escritura de HDD pasan la mayor parte de su tiempo inactivos y esperan que aparezca el bloque de memoria correcto del disco debajo de ellos, cuanta más memoria se copie significa menos tiempo en inactivo y la mayoría de los programadores de discos modernos deberían encargarse de la saltar (para un bajo número de archivos / fragmentos)
Una aplicación ingenua de "copiar varios archivos" copiará un archivo, luego esperará a que se complete antes de copiar el siguiente.
Esto significará que un archivo individual NO SE PUEDE copiar más rápido que la latencia de la red, incluso si está vacío (0 bytes). Debido a que probablemente hace varias llamadas al servidor de archivos (abrir, escribir, cerrar), esto puede ser varias veces la latencia.
Para copiar los archivos de manera eficiente, desea tener un servidor y un cliente que usen un protocolo sano que tenga una canalización; es decir, el cliente NO espera a que se guarde el primer archivo antes de enviar el siguiente, y de hecho, varios o muchos archivos pueden estar "conectados" a la vez.
Por supuesto, para hacer eso se requeriría un servidor personalizado, no un servidor de archivos SMB (o similar). Por ejemplo, rsync hace esto y es muy bueno para copiar grandes cantidades de archivos a pesar de ser de un solo hilo.
Así que mi conjetura es que el multihilo ayuda porque es una solución para el hecho de que el servidor no admite la canalización en una sola sesión.
En mi opinión, lo mejor sería una implementación de un solo hilo que usara un protocolo sensible.