¿Cuál es el cuello de botella en la transferencia de una gran cantidad de archivos pequeños?

¿Cuál es el cuello de botella en la transferencia de una gran cantidad de archivos pequeños?

Mientras realizaba una copia de seguridad de una colección de carpetas que contenían el código fuente (donde más tarde me di cuenta de que podía excluir ciertas carpetas que contenían archivos de biblioteca como node_modules), noté que la velocidad de transferencia de archivos se ralentiza (unos pocos kb/s frente a los 60 mb/s habituales). (lo que permite la unidad de respaldo).

Me gustaría entender dónde está el cuello de botella. ¿Se debe realizar algún cálculo que se intercala con la E/S pura y, por lo tanto, ralentiza todo, o es que el índice del sistema de archivos en la unidad de destino tiene algún bloqueo central que debe adquirirse y liberarse entre archivos?

Estoy usando NTFS en la unidad de respaldo de destino y es un disco duro.

Respuesta1

El problema es que es necesario acceder varias veces al catálogo del sistema de archivos, que indica dónde se encuentran los archivos en el disco duro.

Para cada archivo la copia debe hacer:

  • Abra el archivo fuente del catálogo fuente
  • Crear un archivo de destino en el catálogo de destino
  • Copia el archivo
  • Cierre el archivo fuente y marque su entrada de catálogo como leída.
  • Cierre el archivo de destino y marque su entrada de catálogo como creada.

Esto hace que los cabezales de los discos de origen y de destino cambien de los metadatos del archivo en el catálogo al archivo mismo varias veces durante cada copia del archivo.

En un SSD esto no importaría mucho, pero en un HDD esto puede ralentizar la copia de una gran cantidad de archivos pequeños. Básicamente, el disco duro movería principalmente los cabezales, lo cual es una operación mucho más lenta que la lectura o escritura.

Windows tampoco podría utilizar eficazmente la RAM como caché, ya que cerrar un archivo provoca que se vacíe en el disco.

información relacionada