Programmatische Ressourcenüberwachung pro Prozess in Linux

8

Ich möchte wissen, ob es eine effiziente Lösung gibt, um den Verbrauch von Prozessressourcen (CPU, Speicher, Netzwerkbandbreite) in Linux zu überwachen. Ich möchte einen Daemon in C ++ schreiben, der diese Überwachung für einige gegebene PIDs durchführt. Soweit ich weiß, besteht die klassische Lösung darin, die Informationen von / proc regelmäßig zu lesen, aber dies scheint nicht der effizienteste Weg zu sein (es beinhaltet viele Systemaufrufe). Um zum Beispiel die Speicherauslastung jede Sekunde für 50 Prozesse zu überwachen, muss ich 50 Dateien (das heißt 150 Systemaufrufe) jede Sekunde aus / proc öffnen, lesen und schließen. Nicht zu vergessen das Parsen beim Lesen dieser Dateien.

Ein weiteres Problem ist der Verbrauch der Netzwerkbandbreite: Dies kann nicht einfach für jeden Prozess berechnet werden, den ich überwachen möchte. Die Lösung von NetHogs beinhaltet meiner Meinung nach einen ziemlich hohen Overhead: Sie erfasst und analysiert jedes Paket mit libpcap, dann wird für jedes Paket der lokale Port bestimmt und in / proc gesucht, um den entsprechenden Prozess zu finden.

Wissen Sie, ob es effizientere Alternativen zu diesen Methoden gibt oder welche Bibliotheken sich mit diesen Problemen befassen?

    
tuxx 02.11.2009, 21:19
quelle

5 Antworten

5

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

  

Taskstats ist eine netlink-basierte Schnittstelle zum Senden pro Task und   Pro-Prozess-Statistiken vom Kernel zum Userspace.

     

Taskstats wurde für folgende Vorteile entwickelt:

     
  • bietet effizient Statistiken während der Lebensdauer einer Aufgabe und beim Beenden
  •   
  • Unified Interface für mehrere Accounting Subsysteme
  •   
  • Erweiterbarkeit zur Verwendung durch zukünftige Buchhaltungspatches
  •   

Über diese Schnittstelle können Sie die CPU-, Speicher- und E / A-Verwendung nach Prozessen Ihrer Wahl überwachen. Sie müssen nur Nachrichten auf einem einzelnen Socket einrichten und empfangen.

Dies unterscheidet nicht zum Beispiel Festplatten-E / A gegenüber Netzwerk-E / A. Wenn das für Sie wichtig ist, können Sie mit einer LD_PRELOAD Abfangbibliothek gehen, die Socket-Operationen verfolgt. Angenommen, Sie können den Start der Programme steuern, die Sie beobachten möchten, und natürlich nicht hinter dem Rücken.

Ich kann mir keine leichtgewichtigen Lösungen vorstellen, wenn diese immer noch scheitern, aber linux-audit kann global trace syscalls, was ein wenig direkter erscheint als die erneute Erfassung und Analyse des eigenen Netzwerkverkehrs.

    
ephemient 02.11.2009, 22:29
quelle
2

Sehen Sie sich das Linux-Trace-Toolkit (LTTng) an. Es fügt Trace-Points in den Kernel ein und verfügt über eine Nachbearbeitung, um einige der gewünschten Statistiken zu erhalten. Die Trace-Dateien werden groß, wenn Sie alles erfassen, aber Sie können die Dinge überschaubar halten, wenn Sie die Arten von Ereignissen begrenzen, die Sie aktivieren.

Ссылка für weitere Informationen ...

    
Matt Brandt 05.11.2009 16:08
quelle
2

Zur Netzwerkbandbreite: Diese Superuser-Antwort beschreibt die Verarbeitung von / proc / net / tcp, um die Netzwerkbandbreitennutzung zu erfassen.

Ich weiß, dass iptables verwendet werden kann, um Netzwerk-Accounting durchzuführen (siehe zB LWN's , Linux.com's oder Shorewalls Artikel), aber ich sehe keinen praktischen Weg, dies pro Prozess zu tun.

    
Josh Kelley 05.11.2009 16:27
quelle
0

Reading / proc ist letztlich die einzige Möglichkeit, die CPU- und Speicherauslastung einzelner Prozesse zu überwachen, ohne den Code in den Kernel zu stecken. Wenn Sie nach oben schauen (1), sehen Sie, dass viele Dateien in / proc genau gelesen werden. Alle Benutzermodus-Tools und Bibliotheken, die diese Art von Informationen abrufen, müssen sie von / proc abrufen.

Wie bei der Netzwerkbandbreite gibt es mehrere Ansätze, die alle mehr oder weniger darauf hinauslaufen, den gesamten Netzwerkverkehr innerhalb und außerhalb der Box zu erfassen. Sie können auch ein spezielles Netfilter (iptables) -Modul schreiben, das genau die Art von Zählung durchführt, die Sie benötigen, ohne den Aufwand für die Erfassung des Datenverkehrs.

    
Alexey Feldgendler 06.11.2009 00:13
quelle
0

Ich bin gerade auf dieses Problem gestoßen, als ich nach Antworten auf dasselbe suchte. nur ein Hinweis - wenn Sie / proc Dateisystem verwenden, müssen Sie die Datei nicht nach jedem Lesevorgang schließen. Sie können die Datei offen halten und jedes Mal, wenn Sie lesen, erhalten Sie neue Statistiken ... also sollten Sie nicht den Aufwand haben, jedes Mal zu öffnen und zu schließen, wenn Sie die Statistiken bekommen wollen ... ich habe das in Arbeit Javascript auf node.js, wenn Sie ein Beispiel wollen ...

    
billywhizz 30.05.2010 21:28
quelle