web-dev-qa-db-fra.com

Puis-je suivre la progression d'une opération de synchronisation?

J'ai copié un gros fichier sur un disque USB monté sur un système Linux avec async. Cela renvoie à une invite de commande assez rapidement, mais lorsque je tape sync, bien sûr, tout doit aller sur le disque, et cela prend beaucoup de temps.

Je comprends que ça va être lent, mais y a-t-il un endroit où je peux regarder un compteur descendre à zéro? Regarder buffers dans top n'aide pas.

110
mattdm

Regarder /proc/meminfo affichera le nombre Dirty diminuant avec le temps à mesure que toutes les données se mettent en file d'attente; une partie peut également se répandre dans Writeback. Ce sera un résumé de tous les appareils, mais dans les cas où un appareil sur le système est beaucoup plus lent que les autres, vous vous retrouverez généralement là où tout dans cette file d'attente lui est lié. Vous trouverez probablement le nombre Dirty grand lorsque vous démarrez et le sync se termine à peu près au même moment où il approche de 0. Essayez ceci pour obtenir un affichage interactif:

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

Avec des disques normaux, je peux normalement ignorer Writeback, mais je ne sais pas s'il est impliqué plus souvent dans le chemin de transfert USB. S'il rebondit de haut en bas sans tendance claire, vous pouvez probablement simplement regarder le nombre Dirty.

178
Greg Smith

Vous pouvez consulter le /sys/block/<device>/stat fichier pour l'appareil approprié pendant la synchronisation. Le 9e La colonne indiquera le nombre de demandes en vol sur l'appareil, qui devrait descendre à zéro lorsque la synchronisation est terminée.
Je ne sais pas comment traduire cela en un certain nombre d'octets, mais cela devrait vous donner une idée approximative de la quantité de "trucs" en attente.

Voir le fichier stat.txt dans la documentation du noyau pour un peu plus d'informations. (Il y a aussi un fichier inflight dans ce répertoire sur mon système qui semble pouvoir contenir des demandes de lecture et d'écriture en vol, mais je ne trouve pas de documentation pour cela.)

24
Mat

En utilisant la réponse de Greg, vous pouvez simplement exécuter sync en arrière-plan tout en affichant l'état du bloc Dirty en mémoire.

Pour ce faire, exécutez simplement cette commande:

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

Cela appellera sync en arrière-plan lors de l'exécution de watch en avant. Lorsque la commande sync sera terminée (environ lorsque la taille du bloc Dirty a atteint 0), vous aurez une sortie qui ressemble à ceci:

1]  + 27260 done        sync

Cela signifie que la commande est terminée et vous pouvez tuer la commande watch avec Ctrl+C.

12
jflemieux