9
votes

Suivi des ressources programmatiques par processus de Linux

Je veux savoir s'il existe une solution efficace pour surveiller une consommation de ressources de processus (CPU, mémoire, bande passante réseau) sous Linux. Je veux écrire un démon en C ++ qui surveille cette surveillance pour certains PID donnés. D'après ce que je sais, la solution classique est de lire périodiquement les informations de / proc, mais cela ne semble pas la manière la plus efficace (cela implique de nombreux appels système). Par exemple, pour surveiller l'utilisation de la mémoire chaque seconde pour 50 procédés, je dois ouvrir, lire et fermer 50 fichiers (cela signifie 150 appels système) chaque seconde de / proc. Sans parler de l'analyse impliquée lors de la lecture de ces fichiers.

Un autre problème est la consommation de bande passante réseau: cela ne peut pas être facilement calculé pour chaque processus que je souhaite surveiller. La solution adoptée par les Nethags implique une fronzère assez élevée à mon avis: elle capture et analyse chaque paquet à l'aide de libpcap, puis pour chaque paquet, le port local est déterminé et recherché dans / Proc à trouver le processus correspondant.

Savez-vous que s'il existe des alternatives plus efficaces à ces méthodes présentées ou des bibliothèques qui traitent de ces problèmes?


0 commentaires

5 Réponses :


5
votes

2 commentaires

Les tâches des tâches contiennent uniquement des E / S du disque, pas à la fois nets et le disque


Correction: Les tâches de tâches monitent uniquement des syscalls de lecture / d'écriture, et non de RECV / SEND et d'amis (mais cela peut être facilement modifié à l'intérieur du noyau). Merci quand même. Cela semble la meilleure solution jusqu'à présent.




2
votes

En ce qui concerne la bande passante du réseau: Cette réponse de superutilisateur décrit le traitement / proc / net / TCP pour collecter l'utilisation de la largeur de bande réseau.

Je sais que les IPTABLES peuvent être utilisées pour effectuer une comptabilité de réseau (voir, par exemple LWN , Linux.com, ou Articles de Shorewall's ), mais je ne vois pas de moyen pratique de comptabiliser cela à titre pertratif.


0 commentaires

0
votes

Lecture / Proc est finalement le seul moyen de surveiller l'utilisation de la CPU et de la mémoire par des processus individuels sans injecter votre code dans le noyau. Si vous regardez haut (1), vous verrez lire beaucoup de fichiers dans / proc, c'est exactement ce qu'il fait chaque seconde. Tous les outils et bibliothèques en mode utilisateur qui rétrécissent ce type d'informations doivent l'obtenir de / proc.

Comme pour l'utilisation de la bande passante réseau, il existe plusieurs approches, qui sont toutes plus ou moins à ébullition pour capturer tout le trafic réseau dans la boîte. Vous pouvez également envisager d'écrire un module spécial NetFilter (IPTABLES) qui fait exactement le type de comptage dont vous avez besoin sans les frais généraux de la capture de trafic.


0 commentaires

0
votes

Je viens de tomber sur ceci alors que je cherchais des réponses à la même chose. Juste une note - lors de l'utilisation du système de fichiers / proc, vous ne devez pas fermer le fichier après chaque lecture. Vous pouvez conserver le fichier ouvert et chaque fois que vous avez une lecture, vous obtiendrez de nouvelles statistiques ... Donc, vous ne devriez donc pas avoir les frais généraux d'ouverture et de fermeture de chaque fois que vous souhaitez obtenir les statistiques ... J'ai ce qui fonctionne JavaScript sur Node.js Si vous voulez un exemple ...


0 commentaires