Quería hacer una copia de seguridad de una ruta desde una computadora en mi red a otra computadora en la misma red a través de una línea de 100 Mbit / s. Por esto hice
dd if=/local/path of=/remote/path/in/local/network/backup.img
lo que me dio una velocidad de transferencia de red muy baja de alrededor de 50 a 100 kB / s, lo que me habría llevado una eternidad. Así que lo detuve y decidí intentar comprimirlo sobre la marcha para hacerlo mucho más pequeño y que la cantidad a transferir sea menor. Así que lo hice
dd if=/local/path | gzip > /remote/path/in/local/network/backup.img.gz
Pero ahora obtengo algo así como una velocidad de transferencia de red de 1 MB / s, por lo que es un factor de 10 a 20 más rápido. Después de notar esto, probé esto en varias rutas y archivos, y siempre fue lo mismo.
¿Por qué la tubería dd
a través gzip
también aumentan las tasas de transferencia por un factor grande en lugar de tan sólo reducir el ByteLength de la corriente por un factor de gran tamaño? En cambio, esperaba una pequeña disminución en las tasas de transferencia, debido al mayor consumo de CPU durante la compresión, pero ahora obtengo un doble plus. No es que no sea feliz, pero me pregunto. ;)
dd
está saliendo a 1MB / s ... directamente en lagzip
tubería de espera . Tiene muy poco que ver con el tamaño del bloque.Respuestas:
dd
por defecto usa un tamaño de bloque muy pequeño: 512 bytes (!!). Es decir, muchas pequeñas lecturas y escrituras. Parece quedd
, usado ingenuamente en su primer ejemplo, estaba generando una gran cantidad de paquetes de red con una carga útil muy pequeña, reduciendo así el rendimiento.Por otro lado,
gzip
es lo suficientemente inteligente como para hacer E / S con buffers más grandes. Es decir, un número menor de grandes escrituras a través de la red.¿Puedes volver
dd
a intentarlo con unbs=
parámetro más grande y ver si esta vez funciona mejor?fuente
gzip
y un tamaño de bloque debs=10M
-> transferencia de red rápida de algo así como 3 o 4 MB / s. Mayor tamaño de bloque +gzip
no cambió nada en comparación con el pequeño tamaño de bloque +gzip
.write(3)
está en el búfer.Un poco tarde para esto, pero podría agregar ...
En una entrevista, una vez me preguntaron cuál sería el método más rápido posible para clonar datos bit por bit y, en términos generales, respondí con el uso de
dd
odc3dd
( financiado por el DoD ). El entrevistador confirmó que las tuberíasdd
quedd
es más eficiente, ya que esto sólo permite simultánea de lectura / escritura o en términos programadorstdin/stdout
, por lo tanto ultimatly duplicar velocidades de escritura y el tiempo de transferencia de Halfing.fuente
dd status=progress if=/dev/zero count=100000 bs=1M of=/dev/null
era 22.5GB / s,dd status=progress if=/dev/zero count=100000 bs=1M | dd of=/dev/null bs=1M
era 2.7GB. Entonces la tubería lo hace más lento.Cong es correcto. Está transmitiendo los bloques del disco sin comprimir a un host remoto. Su interfaz de red, red y su servidor remoto son la limitación. Primero necesitas aumentar el rendimiento de DD. Si especifica un parámetro bs = que se alinea con la memoria del búfer de discos, obtendrá el mayor rendimiento del disco. Decir bs = 32M por ejemplo. Esto llenará el búfer de gzip en el estrecho de velocidad de línea sata o sas del búfer de unidades. El disco estará más inclinado a la transferencia secuencial, lo que dará un mejor rendimiento. Gzip comprimirá los datos en secuencia y los enviará a su ubicación. Si está utilizando NFS, eso permitirá que la transmisión nfs sea mínima. Si está utilizando SSH, entonces aplica la sobrecarga de encapsulación y cifrado SSH. Si usa netcat, entonces no tiene cifrado por encima.
fuente
Asumo aquí que la "velocidad de transferencia" a la que te refieres está siendo informada por
dd
. ¡Esto realmente tiene sentido, porque endd
realidad está transfiriendo 10 veces la cantidad de datos por segundo ! Sin embargo,dd
no se está transfiriendo a través de la red, ese trabajo está siendo manejado por elgzip
proceso.Algún contexto:
gzip
consumirá datos de su canal de entrada tan rápido como pueda borrar su búfer interno. La velocidad a la que segzip
vacía el búfer depende de algunos factores:Entonces, en este caso, la red puede manejar 100kB / s, y
gzip
está comprimiendo los datos alrededor de 10: 1 (y la CPU no está bloqueada). Esto significa que mientras produce 100kB / s,gzip
puede consumir 1MB / s, y la tasa de consumo es lo quedd
puede ver.fuente