¿Cómo se calcula el tamaño de bloque óptimo cuando se ejecuta un dd
? Lo he investigado un poco y no he encontrado nada que sugiera cómo se lograría.
Tengo la impresión de que un tamaño de bloque más grande daría como resultado una velocidad más rápida dd
... ¿es esto cierto?
Estoy a punto de dd
dos discos duros Hitachi idénticos de 500 GB que funcionan a 7200 rpm en una caja que ejecuta un Intel Core i3 con 4 GB de RAM DDR3 de 1333 mhz, así que estoy tratando de averiguar qué tamaño de bloque usar. (Voy a iniciar Ubuntu 10.10 x86 desde una unidad flash y ejecutarlo desde allí).
dd
encontrar el tamaño de bloque óptimo mientras se transfiere el archivoRespuestas:
El tamaño de bloque óptimo depende de varios factores, incluido el sistema operativo (y su versión) y los diversos buses de hardware y discos involucrados. Varios sistemas similares a Unix (incluido Linux y al menos algunos sabores de BSD) definen el
st_blksize
miembro en elstruct stat
que da lo que el kernel cree que es el tamaño de bloque óptimo:La mejor manera puede ser experimentar: copiar un gigabyte con varios tamaños de bloque y tiempo. (Recuerde borrar los cachés del búfer del kernel antes de cada ejecución :)
echo 3 > /proc/sys/vm/drop_caches
.Sin embargo, como regla general, he descubierto que un tamaño de bloque lo suficientemente grande permite
dd
hacer un buen trabajo, y las diferencias entre, digamos, 64 KiB y 1 MiB son menores, en comparación con 4 KiB frente a 64 KiB. (Aunque, es cierto, ha pasado un tiempo desde que hice eso. Ahora uso un mebibyte por defecto, o simplementedd
elijo el tamaño).fuente
Como han dicho otros, no existe un tamaño de bloque universalmente correcto; lo que es óptimo para una situación o una pieza de hardware puede ser terriblemente ineficaz para otra. Además, dependiendo de la salud de los discos, puede ser preferible utilizar un tamaño de bloque diferente al "óptimo".
Una cosa que es bastante confiable en el hardware moderno es que el tamaño de bloque predeterminado de 512 bytes tiende a ser casi un orden de magnitud más lento que una alternativa más óptima. En caso de duda, descubrí que 64K es un valor predeterminado moderno bastante sólido. Aunque 64K generalmente no es EL tamaño de bloque óptimo, en mi experiencia tiende a ser mucho más eficiente que el predeterminado. 64K también tiene un historial bastante sólido de desempeño confiable: puede encontrar un mensaje de la lista de correo de Eug-Lug, alrededor de 2002, recomendando un tamaño de bloque de 64K aquí: http://www.mail-archive.com/eug- [email protected]/msg12073.html
Para determinar el tamaño óptimo del bloque de salida, escribí el siguiente script que prueba la escritura de un archivo de prueba de 128M con dd en un rango de diferentes tamaños de bloque, desde el valor predeterminado de 512 bytes hasta un máximo de 64M. Tenga en cuenta que este script utiliza dd internamente, así que utilícelo con precaución.
dd_obs_test.sh:
Ver en GitHub
Solo probé este script en un sistema Debian (Ubuntu) y en OSX Yosemite, por lo que probablemente necesitará algunos ajustes para que funcione en otros sabores de Unix.
Por defecto, el comando creará un archivo de prueba llamado dd_obs_testfile en el directorio actual. Alternativamente, puede proporcionar una ruta a un archivo de prueba personalizado proporcionando una ruta después del nombre del script:
La salida del script es una lista de los tamaños de bloque probados y sus respectivas tasas de transferencia, así:
(Nota: la unidad de las tasas de transferencia variará según el sistema operativo)
Para probar el tamaño de bloque de lectura óptimo, puede usar más o menos el mismo proceso, pero en lugar de leer desde / dev / zero y escribir en el disco, leería desde el disco y escribiría en / dev / null. Un script para hacer esto podría verse así:
dd_ibs_test.sh:
Ver en GitHub
Una diferencia importante en este caso es que el archivo de prueba es un archivo escrito por el script. ¡No apunte este comando a un archivo existente o el archivo existente se sobrescribirá con ceros!
Para mi hardware particular, descubrí que 128K era el tamaño de bloque de entrada más óptimo en un HDD y 32K era el más óptimo en un SSD.
Aunque esta respuesta cubre la mayoría de mis hallazgos, me he encontrado con esta situación suficientes veces que escribí una publicación de blog al respecto: http://blog.tdg5.com/tuning-dd-block-size/ Puede encontrar más detalles en las pruebas que realicé allí.
fuente
dd_obs_test.sh
conv=fsync
no funciona en macOS y se puede eliminar.Descubrí que mi tamaño de bloque óptimo es de 8 MB (¿igual al caché del disco?) Necesitaba limpiar (algunos dicen: lavar) el espacio vacío en un disco antes de crear una imagen comprimida del mismo. Solía:
Experimenté con valores de 4K a 100M.
Después de dejar que dd se ejecute por un tiempo, lo maté (Ctlr + C) y leí el resultado:
Como dd muestra la tasa de entrada / salida (19,1 MB / s en este caso), es fácil ver si el valor que ha elegido funciona mejor que el anterior o peor.
Mis puntuaciones:
Nota: para comprobar cuál es el tamaño de la memoria caché / búfer de disco, puede utilizar
sudo hdparm -i /dev/sda
fuente
8M
es difícil de superar.Esto depende totalmente del sistema. Debe experimentar para encontrar la solución óptima. Intente comenzar con
bs=8388608
. (Como los HDD de Hitachi parecen tener una caché de 8 MB).fuente
bs=8M
en GNU / Linux obs=8m
en BSDbs=8388608
y disminuir una vez en cada paso"fuente
fuente