Question

Je veux savoir s'il y a 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 fait cette surveillance pour certaines données PIDs. D'après ce que je sais, la solution classique est de lire régulièrement les informations de / proc, mais cela ne semble pas la façon la plus efficace (il implique de nombreux appels système). Par exemple, pour surveiller l'utilisation de la mémoire pour chaque seconde 50 processus, je dois ouvrir, lire et près de 50 fichiers (ce qui signifie 150 appels système) chaque seconde de / proc. Sans parler de l'analyse syntaxique impliqué lors de la lecture de ces fichiers.

Un autre problème est la consommation de bande passante du réseau: cela ne peut pas être facilement calculé pour chaque processus que je veux suivre. La solution retenue par nethogs implique un surcoût assez élevé à mon avis. Il capture et analyse tous les paquets en utilisant libpcap, puis pour chaque paquet le port local est déterminé et recherché dans / proc pour trouver le processus correspondant

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

Était-ce utile?

La solution

/usr/src/linux/Documentation/accounting/taskstats.txt

  

Taskstats est une interface NetLink-pour l'envoi par tâche et   par processus statistiques du noyau espace utilisateur.

     

Taskstats a été conçu pour les avantages suivants:

     
      
  • fournir efficacement des statistiques pendant la vie d'une tâche et sur sa sortie
  •   
  • interface unifiée pour les sous-systèmes comptables multiples
  •   
  • pour une utilisation par l'extensibilité des correctifs comptables futures
  •   

Cette interface vous permet de surveiller CPU, la mémoire et l'utilisation d'E / S par des processus de votre choix. Il vous suffit de mettre en place et recevoir des messages sur une seule prise.

Cela ne fait pas de distinction (par exemple) E / S disque par rapport à E / S réseau. Si c'est important pour vous, vous pouvez aller avec une bibliothèque d'interception LD_PRELOAD qui suit les opérations de socket. En supposant que vous pouvez contrôler le démarrage des programmes que vous souhaitez observer et qu'ils ne feront pas la supercherie derrière le dos, bien sûr.

Je ne peux pas penser à des solutions légères si les échouent encore, mais linux-vérification peut globalement syscalls trace, ce qui semble un peu juste plus directe que re-capture et l'analyse de votre propre trafic réseau.

Autres conseils

Jetez un oeil à la boîte à outils de trace linux (LTTng). Il insère tracepoints dans le noyau et a une certaine post-traitement pour obtenir une partie de ce genre de statistiques que vous demandez au sujet. Les fichiers de trace obtenir de grandes si vous capturez tout, mais vous pouvez garder les choses à gérer si vous limitez les types d'événements que vous bras.

http://lttng.org pour plus d'infos ...

Je viens suis tombé sur ce que je cherchais des réponses à la même chose. juste une note - lorsque le système de fichiers en utilisant / proc, vous ne devez pas fermer le fichier après chaque lecture. vous pouvez garder le fichier ouvert et chaque fois que vous faites une lecture, vous obtiendrez de nouvelles statistiques ..., vous ne devriez pas avoir les frais généraux d'ouverture et de fermeture à chaque fois que vous voulez obtenir les statistiques ... j'ai ce travail dans javascript sur Node.js si vous voulez un exemple ...

scroll top