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. P>
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. P>
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? P>
5 Réponses :
/usr/src/linux/documentation/accompagnante/taskststats.txt a> p>
Les tâches de tâches sont une interface basée sur NetLink pour l'envoi de la tâche et
Statistiques par traitement du noyau à l'espace d'utilisateur. P>
Les tâches des tâches ont été conçues pour les avantages suivants: P>
Cette interface vous permet de surveiller l'utilisation de la CPU, de la mémoire et des E / S par des processus de votre choix. Il vous suffit de configurer et de recevoir des messages sur une seule prise. P>
Ceci ne différencie pas (par exemple) le disque I / O par rapport au réseau E / S. Si cela est important pour vous, vous pouvez accéder à un Je ne peux pas penser à des solutions de poids léger si cela échoue toujours, mais Linux-Audit < / a> peut globalement Trace SysCalls, qui semble un peu plus direct que de capturer et d'analyser votre propre trafic réseau. P>
ld_preload code> bibliothèque d'interception qui suit les opérations de socket. En supposant que vous puissiez contrôler le démarrage des programmes que vous souhaitez observer et qu'ils ne produiront pas dans votre dos, bien sûr. P>
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.
Vérifiez le Linux Trace Toolkit (LTTNG). Il insère des points de trace dans le noyau et dispose d'un poste de post-traitement pour obtenir une partie du genre de statistiques que vous posez. Les fichiers de trace deviennent grands si vous capturez tout, mais vous pouvez garder les choses gérables si vous limitez les types d'événements que vous brasez. P>
http://lttng.org pour plus d'informations ... P>
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. P>
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. P>
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. P>
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. P>
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 ... P>