J'ai eu une fois la tâche de déterminer les paramètres de performance suivants à partir d'une application en cours d'exécution:
- Mémoire virtuelle totale disponible
- Mémoire virtuelle actuellement utilisée
- Mémoire virtuelle actuellement utilisée par mon processus
- RAM totale disponible
- RAM actuellement utilisée
- RAM actuellement utilisée par mon processus
- % CPU actuellement utilisé
- % CPU actuellement utilisé par mon processus
Le code devait s'exécuter sur Windows et Linux. Même si cela semble être une tâche standard, trouver les informations nécessaires dans les manuels (API WIN32, documentation GNU) ainsi que sur Internet m'a pris plusieurs jours, car il y a tellement d'informations incomplètes / incorrectes / obsolètes sur ce sujet à découvert là-bas.
Afin d'empêcher les autres de passer par le même problème, j'ai pensé que ce serait une bonne idée de rassembler toutes les informations dispersées ainsi que ce que j'ai trouvé par essais et erreurs ici en un seul endroit.
Réponses:
les fenêtres
Certaines des valeurs ci-dessus sont facilement disponibles à partir de l'API WIN32 appropriée, je les énumère ici pour être complet. D'autres, cependant, doivent être obtenus à partir de la bibliothèque Performance Data Helper (PDH), qui est un peu "peu intuitive" et prend beaucoup d'essais et d'erreurs pénibles pour se mettre au travail. (Au moins ça m'a pris un bon moment, peut-être que je n'ai été qu'un peu stupide ...)
Remarque: pour plus de clarté, toute vérification d'erreur a été omise du code suivant. Vérifiez les codes de retour ...!
Mémoire virtuelle totale:
Remarque: Le nom "TotalPageFile" est un peu trompeur ici. En réalité, ce paramètre donne la "taille de la mémoire virtuelle", qui est la taille du fichier d'échange plus la RAM installée.
Mémoire virtuelle actuellement utilisée:
Même code que dans "Total Virtual Memory" puis
Mémoire virtuelle actuellement utilisée par le processus en cours:
Mémoire physique totale (RAM):
Même code que dans "Total Virtual Memory" puis
Mémoire physique actuellement utilisée:
Mémoire physique actuellement utilisée par le processus en cours:
Même code que dans "Mémoire virtuelle actuellement utilisée par le processus en cours" puis
CPU actuellement utilisé:
CPU actuellement utilisée par le processus en cours:
Linux
Sous Linux, le choix qui semblait évident au début était d'utiliser les API POSIX comme
getrusage()
etc. J'ai passé un certain temps à essayer de faire fonctionner cela, mais je n'ai jamais obtenu de valeurs significatives. Quand j'ai finalement vérifié les sources du noyau elles-mêmes, j'ai découvert que ces API n'étaient apparemment pas encore complètement implémentées à partir du noyau Linux 2.6!?En fin de compte, j'ai obtenu toutes les valeurs via une combinaison de lecture des
/proc
appels du pseudo-système de fichiers et du noyau.Mémoire virtuelle totale:
Mémoire virtuelle actuellement utilisée:
Même code que dans "Total Virtual Memory" puis
Mémoire virtuelle actuellement utilisée par le processus en cours:
Mémoire physique totale (RAM):
Même code que dans "Total Virtual Memory" puis
Mémoire physique actuellement utilisée:
Même code que dans "Total Virtual Memory" puis
Mémoire physique actuellement utilisée par le processus en cours:
Modifiez getValue () dans «Mémoire virtuelle actuellement utilisée par le processus en cours» comme suit:
CPU actuellement utilisé:
CPU actuellement utilisée par le processus en cours:
TODO: Autres plateformes
Je suppose que certains codes Linux fonctionnent également pour les Unix, à l'exception des parties qui lisent le pseudo-système de fichiers / proc. Peut-être que sur Unix ces pièces peuvent être remplacées par
getrusage()
des fonctions similaires? Si quelqu'un possédant le savoir-faire Unix pouvait modifier cette réponse et remplir les détails?!la source
PROCESS_MEMORY_COUNTERS
, comment récupérez-vous la "mémoire virtuelle actuellement utilisée par le processus en cours"?PrivateUsage
n'est pas membre dePROCESS_MEMORY_COUNTERS
l'erreur de compilation que je reçois!"quotes like these"
pour inclure les en-têtes du système?GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
parGetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
Mac OS X
J'espérais également trouver des informations similaires pour Mac OS X. Comme il n'était pas là, je suis sorti et je l'ai creusé moi-même. Voici quelques-unes des choses que j'ai trouvées. Si quelqu'un a d'autres suggestions, j'aimerais les entendre.
Mémoire virtuelle totale
Celui-ci est délicat sur Mac OS X car il n'utilise pas de partition d'échange prédéfinie ou de fichier comme Linux. Voici une entrée de la documentation d'Apple:
Donc, si vous voulez savoir combien de mémoire virtuelle est encore disponible, vous devez obtenir la taille de la partition racine. Vous pouvez faire ça comme ceci:
Total virtuel actuellement utilisé
Appeler systcl avec la touche "vm.swapusage" fournit des informations intéressantes sur l'utilisation du swap:
Ce n'est pas que l'utilisation totale du swap affichée ici puisse changer si plus de swap est nécessaire comme expliqué dans la section ci-dessus. Donc, le total est en fait le total de swap actuel . En C ++, ces données peuvent être interrogées de cette façon:
Notez que le "xsw_usage", déclaré dans sysctl.h, ne semble pas documenté et je soupçonne qu'il existe un moyen plus portable d'accéder à ces valeurs.
Mémoire virtuelle actuellement utilisée par mon processus
Vous pouvez obtenir des statistiques sur votre processus actuel en utilisant la
task_info
fonction. Cela inclut la taille résidente actuelle de votre processus et la taille virtuelle actuelle.RAM totale disponible
La quantité de RAM physique disponible dans votre système est disponible en utilisant la
sysctl
fonction système comme ceci:RAM actuellement utilisée
Vous pouvez obtenir des statistiques générales sur la mémoire à partir de la
host_statistics
fonction système.Une chose à noter ici est qu'il existe cinq types de pages mémoire dans Mac OS X. Ils sont les suivants:
Il est bon de noter que, simplement parce que Mac OS X peut parfois afficher très peu de mémoire libre réelle, cela peut ne pas être une bonne indication de la quantité prête à être utilisée à court terme.
RAM actuellement utilisée par mon processus
Voir la «Mémoire virtuelle actuellement utilisée par mon processus» ci-dessus. Le même code s'applique.
la source
Linux
Sous Linux, ces informations sont disponibles dans le système de fichiers / proc. Je ne suis pas un grand fan du format de fichier texte utilisé, car chaque distribution Linux semble personnaliser au moins un fichier important. Un coup d'œil rapide comme source de «ps» révèle le gâchis.
Mais voici où trouver les informations que vous recherchez:
/ proc / meminfo contient la majorité des informations à l'échelle du système que vous recherchez. Ici, cela ressemble à mon système; Je pense que vous êtes intéressé par MemTotal , MemFree , SwapTotal et SwapFree :
Pour l'utilisation du CPU, vous devez faire un peu de travail. Linux rend disponible l'utilisation globale du CPU depuis le démarrage du système; ce n'est probablement pas ce qui vous intéresse. Si vous voulez savoir quelle a été l'utilisation du processeur pendant la dernière seconde, ou 10 secondes, alors vous devez interroger les informations et les calculer vous-même.
Les informations sont disponibles dans / proc / stat , qui est assez bien documentée à http://www.linuxhowtos.org/System/procstat.htm ; voici à quoi ça ressemble sur ma box 4 cœurs:
Tout d'abord, vous devez déterminer le nombre de CPU (ou processeurs ou cœurs de traitement) disponibles dans le système. Pour ce faire, comptez le nombre d'entrées «cpuN», où N commence à 0 et augmente. Ne comptez pas la ligne «cpu», qui est une combinaison des lignes cpuN. Dans mon exemple, vous pouvez voir cpu0 à cpu3, pour un total de 4 processeurs. A partir de maintenant, vous pouvez ignorer cpu0..cpu3 et vous concentrer uniquement sur la ligne 'cpu'.
Ensuite, vous devez savoir que le quatrième nombre de ces lignes est une mesure du temps d'inactivité, et donc le quatrième nombre sur la ligne 'cpu' est le temps d'inactivité total pour tous les processeurs depuis le démarrage. Ce temps est mesuré en "jiffies" Linux, qui sont 1/100 de seconde chacun.
Mais vous ne vous souciez pas du temps d'inactivité total; vous vous souciez du temps d'inactivité dans une période donnée, par exemple, la dernière seconde. Calculez cela, vous devez lire ce fichier deux fois, à 1 seconde d'intervalle, puis vous pouvez faire un diff de la quatrième valeur de la ligne. Par exemple, si vous prenez un échantillon et obtenez:
Puis une seconde plus tard, vous obtenez cet exemple:
Soustrayez les deux nombres, et vous obtenez un diff de 396, ce qui signifie que votre processeur était inactif depuis 3,96 secondes sur les 1,00 dernières secondes. L'astuce, bien sûr, est que vous devez diviser par le nombre de processeurs. 3,96 / 4 = 0,99, et il y a votre pourcentage d'inactivité; 99% inactif et 1% occupé.
Dans mon code, j'ai un tampon en anneau de 360 entrées et je lis ce fichier toutes les secondes. Cela me permet de calculer rapidement l'utilisation du processeur pendant 1 seconde, 10 secondes, etc., jusqu'à 1 heure.
Pour les informations spécifiques au processus, vous devez regarder dans / proc / pid ; si vous ne vous souciez pas de votre pid, vous pouvez regarder dans / proc / self.
Le CPU utilisé par votre processus est disponible dans / proc / self / stat . Il s'agit d'un fichier d'aspect étrange composé d'une seule ligne; par exemple:
Les données importantes ici sont les 13e et 14e jetons (0 et 770 ici). Le 13ème jeton est le nombre de jiffies que le processus a exécuté en mode utilisateur, et le 14ème est le nombre de jiffies que le processus a exécuté en mode noyau. Ajoutez les deux ensemble, et vous avez son utilisation totale du processeur.
Encore une fois, vous devrez échantillonner ce fichier périodiquement et calculer le diff, afin de déterminer l'utilisation du processeur du processus au fil du temps.
Edit: rappelez-vous que lorsque vous calculez l'utilisation du processeur de votre processus, vous devez prendre en compte 1) le nombre de threads dans votre processus et 2) le nombre de processeurs dans le système. Par exemple, si votre processus à un seul thread utilise seulement 25% du processeur, cela peut être bon ou mauvais. Bon sur un système monoprocesseur, mais mauvais sur un système à 4 processeurs; cela signifie que votre processus s'exécute en permanence et utilise 100% des cycles CPU disponibles.
Pour les informations de mémoire spécifiques au processus, vous devez regarder / proc / self / status, qui ressemble à ceci:
Les entrées commençant par «Vm» sont les plus intéressantes:
Le seul élément dont je ne suis pas sûr est Swapspace actuellement utilisé par mon processus . Je ne sais pas si c'est disponible.
la source
dans les fenêtres, vous pouvez obtenir l'utilisation du processeur par le code ci-dessous:
la source
usage =
est la chose la plus créative que j'ai vue depuis un moment, pas lisible du tout mais créativeULONGLONG
à- dire pour VS au lieu deULARGE_INTEGER
. 2) Vous compliquez les choses en appelantCopyMemory()
, faites simplement à laULONGLONG ul_sys_idle = *(ULONGLONG*)&ft_sys_idle;
place. Il sera traduit en une seule instruction CPUmov
(oulea
).Linux
Un moyen portable de lire la mémoire et de charger les numéros est l'
sysinfo
appelUsage
LA DESCRIPTION
la source
QNX
Étant donné que cela ressemble à une «page Web de code», je veux ajouter du code à partir de la base de connaissances QNX (remarque: ce n'est pas mon travail, mais je l'ai vérifié et cela fonctionne bien sur mon système):
Comment obtenir l'utilisation du processeur en%: http://www.qnx.com/support/knowledgebase.html?id=50130000000P9b5
Comment obtenir la mémoire gratuite (!): Http://www.qnx.com/support/knowledgebase.html?id=50130000000mlbx
la source
Mac OS X - CPU
Utilisation globale du processeur:
De Récupérer les informations système sur MacOS X? :
la source
Pour Linux Vous pouvez également utiliser / proc / self / statm pour obtenir une seule ligne de chiffres contenant des informations clés sur la mémoire de processus, ce qui est plus rapide à traiter que de parcourir une longue liste d'informations rapportées à partir de proc / self / status
Voir http://man7.org/linux/man-pages/man5/proc.5.html
la source
J'ai utilisé ce code suivant dans mon projet C ++ et cela a bien fonctionné:
la source