2009-09-16 6 views
7

J'écris une application Linux qui observe d'autres applications et suit la consommation de ressources. Je prévois de travailler avec Java, mais le langage de programmation n'est pas important pour moi. Le but est important, donc je peux passer à une autre technologie ou utiliser des modules. Mon application exécute toute application tierce sélectionnée en tant que processus enfant. La plupart des logiciels pour enfants résout certains algorithmes comme les graphiques, la recherche de chaînes, etc. Le programme Observer suit les ressources de l'enfant pendant la fin du travail.Suivi de la mémoire des threads et de la consommation du processeur

Si l'application enfant est multithread, peut-être est-il possible de suivre la quantité de ressources consommée par chaque thread? L'application peut être écrite en utilisant n'importe quelle technologie de threads non distributive-memory: les threads Java, les threads Boost, les threads POSIX, OpenMP, les autres.

+1

Avez-vous regardé OProfile pour l'inspiration? http://oprofile.sourceforge.net –

+0

Non, c'est le travail de mon master. Peut-être que mon conférencier avait l'air :-) Mais OProfile a l'air intéressant. THX. – Pawka

Répondre

5

Dans les systèmes Linux modernes (2.6), chaque thread a un identifiant séparé qui a presque le même traitement que le pid. Il est montré dans la table de processus (au moins, dans le programme htop) et il a également son entrée séparée /proc, c'est-à-dire /proc/<tid>/stat.

Vérifiez man 5 proc et accorder une attention particulière à stat, statm, status etc. Vous devriez trouver les informations qui vous intéressent là-dedans.

Un seul obstacle est d'obtenir cet thread identificateur. Il est différent avec l'ID de processus! C'est à dire. getpid() appels dans tous les threads retournent la même valeur. Pour obtenir l'identifiant de fil réelle, vous devez utiliser (dans un programme C):

pid_t tid = syscall(SYS_gettid); 

Par ailleurs, la machine virtuelle java (au moins, sa mise en œuvre OpenJDK Linux) fait qu'il en interne et utilise à des fins de débogage dans son back-end, mais ne l'expose pas à l'interface java.

4

La mémoire n'est pas allouée aux threads et est souvent partagée entre les threads. Cela rend généralement impossible et au moins insignifiant de parler de la consommation de mémoire d'un fil.

Un exemple pourrait être un programme avec 11 threads; 1 créer des objets et 10 en utilisant ces objets. La plupart du travail est effectué sur ces 10 threads, mais toute la mémoire a été allouée sur le thread qui a créé les objets. Maintenant, comment peut-on rendre compte de cela?

+0

Je ne peux pas dire que vous n'avez pas raison.Mais nous pouvons supposer que l'utilisation de la mémoire à un seul thread est la quantité de mémoire avec laquelle le thread spécifique fonctionne à l'heure actuelle. Généralement, les threads verrouillent la mémoire avec des semophores ou des mutex tout en travaillant avec des données. – Pawka

+0

Désolé, mais cela n'a toujours pas de sens. La mémoire en lecture seule n'a besoin d'aucun verrou. Quand un mutex est utilisé, il n'y a pas de moyen raisonnable de déterminer quelle mémoire il protège sans aller au code. – MSalters

+0

Je ne parle pas de la mémoire en lecture seule. Nous pouvons toujours compter la consommation de mémoire de thread. Par exemple travailler avec un graphe, créer des noeuds pour certains comptages, etc. Chaque donnée peut être accessible par un thread, créé par lui-même et nettoyé après le travail. – Pawka

1

Si vous êtes prêt à utiliser Perl jeter un oeil à ceci: Sys-Statistics-Linux

Je l'ai utilisé en même temps que certains des paquets GD graphiques pour générer des graphiques d'utilisation des ressources du système pour divers processus. Une chose à surveiller - vous aurez vraiment besoin de lire sur/proc et comprendre jiffies - la dernière fois que j'ai regardé ils ne sont pas documentés correctement dans les pages man, vous aurez probablement besoin de lire la source du noyau :

http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h

aussi, rappelez-vous que sous Linux la seule différence entre un fil et le processus est que les threads partagent la mémoire - autre que celle qu'ils sont identiques dans la façon dont le noyau les met en œuvre.

+0

Le lien Sys-Statistics-Linux est rompu. –

Questions connexes