Comment puis-je voir les statistics i / o pour un process en cours d'exécution?

Pour les process à long terme comme init, je peux faire des choses comme

$ cat /proc/[pid]/io 

Que puis-je faire si je veux voir des statistics pour un process en cours d'exécution tel qu'un utilitaire de command line comme ls? Je ne sais même pas comment voir le pid pour un tel process en cours d'exécution …

Fondamentalement, il semble que vous voulez des conseils généraux sur le profilage des E / S d'une application à l'exécution. Vous avez fait cela avec /proc/$PID/io qui vous donnera une idée de la quantité de bande passante utilisée entre le disque et la memory pour l'application. L'interrogation de ce file peut vous donner une idée approximative du process, mais il s'agit d'une image incomplète, car elle ne vous indique que la quantité de données transmises au disque.

Pour résoudre votre problème déclaré, vous avez essentiellement les options suivantes:

  • Utilisez l'instrumentation de la plate-forme. Sous Linux, l' écriture d'un script SystemTap est la solution complète la plus complète, mais selon le niveau de hardcore que vous voulez faire, il peut y avoir plus de travail que vous ne le souhaitez vraiment.

  • Utilisez l'instrumentation basée sur l'application. Beaucoup de façons de le faire, mais le profil gprof est une option populaire. Certaines applications peuvent également fournir leur propre instrumentation, mais vous devriez vérifier.

Probablement, la meilleure alternative est d'utiliser les outils d'instrumentation de plate-forme déjà existants set pour get l'effet désiré et en tirer le meilleur parti.


Je ne suis pas au courant d'un programme qui triggersra une request et fera tout pour vous (cela ne veut pas dire qu'il n'y en a pas, mais je n'en ai jamais entendu parler), donc votre meilleur pari est de simplement commencez à collecter des informations sur l'set du système et filterz simplement le PID dont vous êtes préoccupé après le fait (pour get un échantillon complet).

Tout d'abord, je voudrais permettre l'audit des appels execve afin que vous puissiez save le PID de l'application que vous lancez. Une fois que vous avez le PID, vous pouvez supprimer l'audit.

Exécutez mount debugfs -t debugfs /sys/kernel/debug pour faire fonctionner les debugfs, afin que vous puissiez exécuter le blktrace .

Sur mon système, j'ai lancé blktrace -d /dev/sda -a read -a write -o - | blkparse -i - blktrace -d /dev/sda -a read -a write -o - | blkparse -i - mais vous pouvez ajuster en conséquence. Voici un exemple de sortie blktrace:

 8,0 15 3 1266874889.709440165 32679 QW 20511277 + 8 [rpc.mountd] 

Dans la sortie ci-dessus, la cinquième colonne ( 32679 ) est le PID associé à l'application effectuant l'écriture. Les parties qui nous intéressent sont le Q (type d'événement, mis en queue), le W (champ RWBS, W signifie qu'il s'agit d'une écriture car il n'y a pas de S dans ce champ et l'implication est qu'il s'agit d'un asynchronous). (opération commence au numéro de bloc 20511277 et va encore huit blocs). Déterminer les tailles de lecture / écriture devrait juste être en ajoutant les blocs set et en multipliant par la taille de bloc.

blktrace parlera également de plus que le débit, il vous permettra également de voir s'il y a quelque chose qui se passe avec des fusions qui vous intéressent.

Une fois que blktrace est en cours d'exécution, vous pouvez générer le process en utilisant strace -c, ce qui vous donnera une idée de la latence moyenne associée à chaque appel système (y compris les opérations de read et d' write ). En fonction de la fiabilité de chaque invocation, la latence peut être importante, mais elle peut également vous renseigner sur l'application (pour indiquer les zones à explorer) sans avoir recours à une application.

Entre ces deux, vous devriez get un bon échantillon de ce que votre programme est en train de faire sans perdre de données ou éventuellement en incluant les E / S d'autres applications. Évidemment, il y a plus de façons de le faire que ce que j'ai décrit, mais c'est ainsi que j'aurais résolu le problème.

On devrait également être capable de collecter des mesures de latence liées aux E / S en blkparse avec les options de sortie de blkparse , par exemple. Je ne l'ai pas fait parce que je n'ai pas assez joué avec eux.

Vous pouvez commencer la command en arrière-plan puis get son pid via $! variable.

Exemple:

 $ ls & cat /proc/$!/io [1] 6410 rchar: 7004 wchar: 0 syscr: 13 syscw: 0 read_bytes: 0 write_bytes: 0 cancelled_write_bytes: 0