Actualmente estoy restaurando una memoria USB con una imagen dd que he creado anteriormente. Sin embargo, se observa una velocidad de escritura muy pobre, alrededor de ~7 MB/s, aunque el dispositivo suele ser mucho más rápido.
Después de mirar un poco a mi alrededor, noté que se están leyendo muchos datos desde la unidad USB, lo que explica el bajo rendimiento de escritura. Nada más que dd está accediendo al dispositivo en ese momento.
Línea editada atop
:
sdd: busy 101% | read 18020 | write 613 | MBr/s 7.04 | MBw/s 7.1
Noté un comportamiento similar al escribir directamente en mi matriz md usando dd. Sin embargo, cuando se escribe en un sistema de archivos montado con dd, esto no sucede.
Entonces mi pregunta es ¿por qué se lee desde la memoria USB cuando se escribe directamente en el dispositivo de bloque y si esto se puede evitar para mejorar el rendimiento de escritura?
Respuesta1
Por lo tanto, no está 100% claro lo que podría estar sucediendo, pero sospecho que está escribiendo bloques pequeños (512 bytes) en el USB y luego realiza comprobaciones dd para asegurarse de que el byte esté escrito correctamente, lo que genera MUCHAS lecturas y escribir, y leer y escribir.
Ajustar el tamaño de su bloque al tamaño "correcto" no es trivial, pero existen algunas reglas generales sobre cómo hacerlo. En general, he descubierto que un tamaño de bloque de 64 kB es un buen compromiso en la mayoría de los frentes, pero sus sistemas de archivos pueden generar cambios en ese tamaño, si está ejecutando algo exótico (como zfs
, por ejemplo).
Pruebe algo como esto:
lbzcat image-dd.bz2 | dd of=/deb/sdX bs=64k
Para una discusión más extensa, consulteesta publicación.
Respuesta2
Para mí, dd
usa el caché de página de forma predeterminada. Creo que esto es normal en sistemas con caché de páginas. Sin embargo, la caché de página necesita que se lea el dispositivo de almacenamiento, lo que puede provocar una velocidad de escritura lenta.
Para mí, hay 3 formas de solucionar esto y alcanzar la máxima velocidad:
- Establezca
dd
el tamaño del bloque en 4096 o un múltiplo. (sin lecturas) - Establezca
dd
el tamaño del bloque en un número suficientemente grande. Para mí esto fue alrededor de 1 millón o más. Llegué a toda velocidad a aproximadamente 1 millón. (muy pocas lecturas) - No utilice el caché de la página dando
dd
el parámetrooflags=direct
. Establezcadd
el tamaño del bloque en un múltiplo suficientemente grande de 512. Para mí, esto fue másbs=120k
o menos. (sin lecturas)
Algo a tener en cuenta, en mi sistematamaño de bloquepara todos los dispositivos de almacenamiento ytamaño de páginason 4096 bytes. Encontrado con:
blockdev --getbsz /dev/sd?
getconf PAGESIZE
Tambiéntamaño del sectores de 512 bytes.
fdisk
y tal vez parted
pueda decirle el tamaño del sector.