
Estoy en un busybox 1.27
sistema solo Linux, por lo que no está disponible, no hay output=progress
ninguna implementación propia de Busybox ni en sí misma.pv
pipe_progress
pv
Tengo dos preguntas. La primera se basa enhttps://www.linux.com/training-tutorials/show-progress-when-using-dd/. Dice que al enviarle la USR1
señal dd
"pausa" el proceso y dd
luego de imprimir su estado actual continuará con el trabajo que estaba realizando. Estoy intentando hacer algunas pruebas comparativas, dd
por lo que me gustaría tener un impacto mínimo en la dd
operación. Quiero obtener un resultado de la operación actual cada segundo porque los datos que pasan dd
fluctúan y es importante para mí reconocer cuándo cae la tasa de transferencia.
Primera pregunta: ¿Es cierto que 'dd' "hace una pausa" cada vez que recibe una USR1
señal?
Si dd
hace una pausa cada segundo, agregaré horas a la operación cuando se transfieran decenas de gigabytes.
Segunda pregunta: AsumiendoSíComo respuesta a la primera pregunta, me gustaría saber si es posible imprimir dd
su estado actual sin enviar ninguna señal al proceso, tal vez algún tipo de redirección STDOUT
(como 2>&1).
A lo que me refiero es:
# bs with 1Mib so I can have more control on the test.
dd if=/dev/zero of=/dev/null bs=1048576 count=1024
# Printing current operation status.
sudo kill -USR1 $dd_pid
Respuesta1
dd if=/dev/zero of=/dev/null bs=1048576 count=1024
Tenga en cuenta quedd
puede alterar los datos, al menosal usar el bs
parámetro. Ysu ventaja de rendimientoes, en el mejor de los casos, pequeño si selecciona manualmente un tamaño de bloque óptimo para la configuración particular de su sistema: cat
o cp
puede hacerlo mejor, y como máximo es solo un poco más lento. Así que no lo uses dd
si no es necesario.
Tenga en cuenta que desde la versión 1.23, BusyBox utiliza elsendfile
llamada al sistema para copiar datos, en lugar de usar read
y write
. Sólo se utilizan copias simples como cat
y , sin embargo: se ve obligado a utilizar / porque quiere un control preciso sobre los tamaños. Entonces, con BusyBox ≥1.23, es muy probable que sea más rápido que .cp
sendfile
dd
read
write
cat
cp
dd
¿Es cierto que 'dd' "hace una pausa" cada vez que recibe una señal USR1?
Técnicamente sí, tiene que “pausarse” para manejar la señal. Sin embargo, la pausa es solo unas pocas instrucciones de la CPU (la parte más costosa, con diferencia, es imprimir el resultado del progreso). Entonces esto no invalida su punto de referencia de ninguna manera.
Si dd se detiene cada segundo, agregaré horas a la operación cuando se transfieran decenas de gigabytes.
No, tienes mal tus órdenes de magnitud. Agregará tal vez el 0,1% del tiempo en un subproceso de una sola CPU. El costo principal es el tiempo del kernel para el programa de evaluación comparativa, no el costo dd
, por lo que es intrínseco a lo que desea hacer, no a la forma en que lo implementa.
si es posible hacer que dd imprima su estado actual sin enviar ninguna señal al proceso
Bueno no. Ya existe una forma sencilla, históricamente establecida, estándar y fácil de hacerlo. ¿Por qué habría otra forma que sería más difícil de implementar?
En Linux, existe una forma genérica de saber el punto al que ha llegado una copia. No depende de qué programa esté haciendo la copia, aunque no siempre funciona con archivos especiales. Descubra el ID del proceso $pid
que realiza la copia y qué descriptores de archivo utiliza para entrada y salida. dd
lee desde fd 0 y escribe en fd 1. BusyBox cp
normalmente lee desde fd 3 y escribe en fd 4. Puede verificar qué archivo está abierto en qué descriptor de archivo a través de los enlaces simbólicos en /proc/$pid/fd
.
$ cp /dev/zero /dev/null & pid=$!
$ readlink /proc/$pid/fd/3
/dev/zero
$ readlink /proc/$pid/fd/4
/dev/null
Y puede verificar la posición en el descriptor del archivo $n$
en formato /proc/$pid/fd/$n
.
$ cat /proc/$pid/fdinfo/4
pos: 74252288
flags: 0100001
mnt_id: 27
Sin embargo, tenga en cuenta que es posible que la posición del descriptor de archivo no se actualice con archivos especiales como /dev/zero
,, /dev/null
tuberías o enchufes. Siempre se actualiza con archivos regulares. No sé si está actualizado para dispositivos en bloque. Por lo tanto, es probable que no le brinde ninguna información para copiar entre /dev/zero
y /dev/null
, pero podría funcionar en su caso de uso real.
Respuesta2
También puede consultar el progreso a través de la /proc
interfaz.
# dd bs=1M if=/dev/mmcblk0 of=/dev/null &
# pidof dd
1358
Entonces la información sobre este proceso se encuentra en /proc/1358
:
# ls -l /proc/1358/fd
total 0
lr-x------ 1 root root 64 Nov 2 09:16 0 -> /dev/mmcblk0
l-wx------ 1 root root 64 Nov 2 09:16 1 -> /dev/null
lrwx------ 1 root root 64 Nov 2 09:16 2 -> /dev/pts/0
Filehandle 0 es el if=/dev/mmcblk0
, ahora ¿dónde está el progreso?
# cat /proc/1358/fdinfo/0
pos: 2132803584
flags: 0400000
mnt_id: 17
# cat /proc/1358/fdinfo/0
pos: 2366636032
flags: 0400000
mnt_id: 17
# cat /proc/1358/fdinfo/0
pos: 2587885568
flags: 0400000
mnt_id: 17
De esta manera, para Busybox dd, también puede derivar el progreso de su valor fdinfo pos.
Dicho esto, enviar la señal USR1 con moderación debería tener un impacto mínimo en el rendimiento. En un sistema integrado con pocos recursos, sondear fdinfo también podría tener un impacto similar.