Puis-je suivre la progression d'une opération `sync`?

103

J'ai copié un fichier volumineux sur un disque USB monté sur un système Linux asynchrone. Cela retourne à une invite de commande assez rapidement, mais lorsque je tape sync, bien sûr, tout doit aller sur le disque, ce qui prend beaucoup de temps.

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

mattdm
la source
pour plus d'informations, voir: lwn.net/Articles/572911
Lanoxx

Réponses:

162

En regardant, vous /proc/meminfoverrez que le Dirtynombre diminue avec le temps, à mesure que toutes les données sont envoyées. une partie peut également se répandre Writeback. Ce sera un résumé de tous les périphériques, mais dans les cas où un périphérique sur le système est beaucoup plus lent que les autres, vous vous retrouverez généralement là où tout le contenu de cette file d'attente est associé. Vous constaterez probablement que le Dirtynombre est grand lorsque vous commencez et se synctermine à peu près au même moment où il approche 0. Essayez ceci pour obtenir un affichage interactif:

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

Avec les disques classiques, je peux normalement les ignorer Writeback, mais je ne suis pas sûr qu’ils soient impliqués plus souvent dans le chemin de transfert USB. Si elle ne fait que rebondir sans tendance claire, vous pouvez probablement regarder le Dirtynombre.

Greg Smith
la source
4
Sur mon système, l’écriture différée reste à quelques Mo jusqu’à la fin, quand Dirty est vide, puis elle commence à baisser.
mattdm
24

Vous pouvez consulter le /sys/block/<device>/statfichier du périphérique approprié pendant la synchronisation. La 9 e colonne indiquera le nombre de demandes en vol sur l'appareil, qui devrait descendre à zéro lorsque la synchronisation est effectuée.
Je ne connais pas un moyen de traduire cela en un nombre d'octets, mais cela devrait vous donner une idée approximative de combien de "choses" sont encore en attente.

Consultez le fichier stat.txt dans la documentation du noyau pour un peu plus d’informations. (Il y a également un inflightfichier dans ce répertoire sur mon système qui pourrait contenir des requêtes de lecture et d'écriture en vol, mais je ne trouve pas de documentation pour cela.)

Tapis
la source
3
Juste pour la référence pratique, combinant une idée d'une autre réponse:watch -t -n1 'awk "{ print \$9 }" /sys/block/sdd/stat'
mattdm
4
Pour ma clé USB, cela a tendance à osciller autour de 150 pendant toute la durée de la copie et syncaprès. Il va à 0, mais seulement à la toute fin. Cela rend l’autre réponse plus utile pour observer les progrès avec impatience.
mattdm
1
(Même si, en théorie, j'aime bien regarder uniquement le périphérique approprié plutôt que les informations système.)
mattdm
Existe-t-il un moyen d’obtenir la quantité d’octets écrits (synchronisés, vidés sans vol) ou mis en cache pour être écrits sur le disque? Si j'avais une taille de cache en écriture par lecteur, je pourrais l'utiliser dupour calculer les données réelles synchronisées sur le lecteur.
unfa
10

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

Pour ce faire, exécutez simplement cette commande:

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

Cela appellera syncen arrière-plan lors de l'exécution watchà l'avant. Lorsque la synccommande sera terminée (environ lorsque la taille du bloc sale aura atteint 0), vous obtiendrez une sortie ressemblant à ceci:

1]  + 27260 done        sync

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

Jflemieux
la source
BTW: Je sais que c'est une vieille question, mais c'est la première qui apparaît sur Google quand quelqu'un la cherche, et je voulais ajouter la solution que j'ai trouvée.
Jflemieux
1
Dommage que sync / umount n'ait pas reçu les mises à jour du noyau et puisse imprimer ce genre de choses directement si on le lui demande.
mcr