¿Puedo ver el progreso de una operación de sincronización?

103

Copié un archivo grande en un disco USB montado en un sistema Linux con asíncrono. Esto vuelve a un símbolo del sistema relativamente rápido, pero cuando escribo sync, por supuesto, todo tiene que ir al disco, y eso lleva mucho tiempo.

Entiendo que va a ser lento, pero ¿hay algún lugar donde pueda ver cómo un contador baja a cero? Viendo buffersen topno ayuda.

mattdm
fuente
para obtener más información, consulte: lwn.net/Articles/572911
lanoxx

Respuestas:

162

Al mirar, /proc/meminfose mostrará que el Dirtynúmero se reduce con el tiempo a medida que todos los datos se ponen en cola; algunos de ellos pueden derramarse Writebacktambién. Eso será un resumen de todos los dispositivos, pero en los casos en que un dispositivo en el sistema es mucho más lento que el resto, generalmente terminará donde todo en esa cola está relacionado con él. Probablemente encontrará el Dirtynúmero grande cuando comience y syncfinalice aproximadamente al mismo tiempo que se acerca a 0. Pruebe esto para obtener una pantalla interactiva:

watch -d grep -e Dirty: -e Writeback: /proc/meminfo

Con los discos normales Writeback, normalmente puedo ignorar , pero no estoy seguro de si está involucrado con más frecuencia en la ruta de transferencia USB. Si solo rebota hacia arriba y hacia abajo sin una tendencia clara, probablemente solo pueda mirar el Dirtynúmero.

Greg Smith
fuente
44
En mi sistema, la reescritura se mantiene en unos pocos megas hasta cerca del final, cuando Dirty está vacío, momento en el que comienza a disminuir también.
mattdm
24

Puedes mirar el /sys/block/<device>/statarchivo para el dispositivo apropiado mientras estás sincronizando. La 9 ª columna indicará el número de solicitudes de a bordo en el dispositivo, que debe bajar a cero cuando se realiza la sincronización.
No conozco una manera de traducir eso a una cantidad de bytes, pero debería darle una idea aproximada de cuánto "material" aún está pendiente.

Consulte el archivo stat.txt en la documentación del kernel para obtener un poco más de información. (También hay un inflightarchivo en ese directorio en mi sistema que parece que podría contener solicitudes de lectura y escritura en vuelo, pero no puedo encontrar documentos para eso).

Estera
fuente
3
Solo como referencia práctica, combinando una idea de otra respuesta:watch -t -n1 'awk "{ print \$9 }" /sys/block/sdd/stat'
mattdm
44
Para mi memoria USB, esto tiende a rondar los 150 durante la operación de copia y syncdespués. Va a 0, pero solo al final. Eso hace que la otra respuesta sea más útil para observar el progreso con impaciencia.
mattdm
1
(Aunque en teoría me gusta mirar solo el dispositivo apropiado en lugar de la información de todo el sistema)
Mattdm
¿Hay alguna manera de obtener la cantidad de bytes escritos (sincronizados, vaciados no en vuelo) o almacenados en caché para que se escriban en la unidad? Si tuviera un tamaño de caché de escritura por unidad, podría usarlo dupara calcular los datos reales que se sincronizan en la unidad.
unfa
10

Al usar la respuesta de Greg, simplemente puede haber synccorrido en segundo plano mientras muestra el estado del bloque sucio en la memoria.

Para lograr esto, simplemente ejecute este comando:

sync & watch -n 1 grep -e Dirty: /proc/meminfo

Esto llamará syncen segundo plano mientras se ejecuta watchen el frente. Cuando el synccomando haya terminado (alrededor de cuando el tamaño del bloque sucio ha alcanzado 0), tendrá una salida similar a esta:

1]  + 27260 done        sync

Esto significa que el comando ha finalizado y puede matar el watchcomando con Ctrl+ C.

jflemieux
fuente
Por cierto: Sé que esta es una vieja pregunta, pero es la primera que aparece en Google cuando alguien la busca, y quería agregar la solución que encontré.
jflemieux
1
Lástima que sync / umount no haya recibido actualizaciones del kernel y podría imprimir este tipo de cosas directamente si se lo pidieran.
mcr