Le suivi des fils de la mémoire et de la consommation CPU
Je suis en train d'écrire une application Linux qui observe les autres applications et les pistes de la consommation de ressources . J'ai l'intention de travailler avec Java, mais le langage de programmation n'est pas important pour moi. L'Objectif est important, afin que je puisse passer à une autre technologie ou de l'utilisation des modules. Mon application s'exécute n'importe quelle application tierce comme processus enfant. La plupart des enfants de logiciel résout un algorithme de type des graphes, recherche de chaine, etc. Programme des observateurs des pistes de l'enfant des ressources alors qu'il termine le travail.
Si l'enfant de l'application est multi-thread, peut-être d'une certaine manière est possible de suivre la quantité de ressources que consomme chaque thread? L'Application qui pourrait être écrit à l'aide de tout pas distributive-mémoire fils de la technologie: les threads Java, de Dynamiser les threads POSIX threads OpenMP, tout autre.
Non, c'est mon degré de maître. Peut-être mon maître de conférences regardé 🙂 Mais Il semble intéressant. Thx.
OriginalL'auteur Pawka | 2009-09-16
Vous devez vous connecter pour publier un commentaire.
Moderne des systèmes Linux (2.6), chaque thread possède un identifiant distinct qui a presque le même traitement que le pid. Il est indiqué dans le tableau du processus (au moins, dans htop programme) et il a aussi son propre
/proc
entrée, c'est à dire/proc/<tid>/stat
.Vérifier
man 5 proc
et de payer une attention particulière àstat
,statm
,status
etc. Vous devriez trouver les informations qui vous intéressent.Un seul obstacle, c'est pour obtenir cette fil identificateur. Il est différent avec l'id de processus! I. e.
getpid()
des appels dans tous les threads retourner la même valeur. Pour obtenir le véritable fil d'identifiant, vous devez utiliser (dans un programme C):Par la manière, la machine virtuelle java (au moins, son OpenJDK implémentation de Linux) est-ce que l'interne et l'utilise à des fins de débogage dans son back-end, mais ne pas l'exposer à l'interface java.
OriginalL'auteur P Shved
Mémoire n'est pas attribuée au fils, et souvent partagées entre les threads. Cela rend généralement impossible, et au moins pas de sens de parler de la consommation de la mémoire d'un thread.
Un exemple pourrait être un programme avec 11 fils; 1 création d'objets et 10 à l'aide de ces objets. La plupart du travail est fait sur les 10 threads, mais la totalité de la mémoire a été allouée sur un thread qui a créé les objets. Maintenant, comment fait-on compte?
Désolé, mais cela ne fait pas de sens. Mémoire en lecture seule a besoin d'aucune serrure à tous. Lorsqu'un mutex est utilisé, il n'y a aucun moyen raisonnable de déterminer ce que la mémoire, elle protège sans passer par le code.
Je ne parle pas de mémoire en lecture seule. Nous pouvons encore compter la consommation de mémoire de fil. Par exemple travailler avec certains de graphique, de la création de nœuds pour certains de comptage etc. Chacun de ces données pourrait être accessible par un seul thread, créé par lui-même et nettoyés après le travail est fait.
Ainsi, lorsqu'un thread serait de travailler avec un nœud est le nœud comptabilisées en fonction de la quantité de mémoire utilisée? Ou est la mémoire de l'ensemble du graphique compté vers la mémoire utilisée par le thread? Je ne dis pas qu'il y a n les allocations spécifiques à un fil. Ce n'est tout simplement pas suffisant. Dans de nombreux programmes concrets, vous êtes susceptibles de trouver que 90% de toute la mémoire allouée à un processus ne peut pas être unique représenté à l'un de ses fils. Résultat final: processus, 50 MO, chacun de ses 10 threads "usages" de 1 MO, et 40 MO est "manquant". Vos résultats ne seront pas fiables à cause de cela.
OriginalL'auteur MSalters
Si vous êtes prêt à utiliser Perl prendre un coup d'oeil à ceci: Sys-Statistiques-Linux
Je l'ai utilisé avec certains de la GD graphique de paquets pour générer le système de l'utilisation des ressources graphiques pour les différents processus.
Une chose à regarder dehors pour, vous en aurez vraiment besoin de lire sur /proc et de comprendre jiffies - la dernière fois que j'ai regardé ils ne sont pas correctement documentées dans les pages de manuel, vous aurez besoin de lire le code source du noyau probablement:
http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h
Aussi, n'oubliez pas que Linux, la seule différence entre un fil et des processus est que les threads partagent la mémoire autre que celle qu'ils sont identiques dans la façon dont le noyau met en œuvre.
OriginalL'auteur Robert S. Barnes