Samstag, Januar 18, 2020

Tracking-threads Speicher-und CPU-Verbrauch

Schreibe ich eine Linux-Anwendung, die beobachtet andere Anwendungen und Spuren des Verbrauchs von Ressourcen . Ich Plane die Arbeit mit Java, aber die Programmiersprache ist nicht wichtig für mich. Das Ziel ist wichtig, so kann ich wechseln zu einer anderen Technologie oder Module zu benutzen. Meine Anwendung läuft jedes ausgewählte Drittanbieter-Anwendung wie Kind-Prozess. Meist untergeordnete-software löst einige algorithmen wie Diagramme, string-Suche, etc. Beobachter verfolgt Kindes-Ressourcen, während es der Auftrag wird beendet.

Wenn das Kind die Anwendung ist multi-threaded, vielleicht irgendwie möglich ist, zu verfolgen, wie viel Ressourcen verbraucht jeder thread? Anwendung können geschrieben werden, mit jedem nicht distributiv-Speicher threads Technologie: Java threads, Boost threads, POSIX threads, OpenMP, alle anderen.

  • Haben Sie sah OProfile für inspiration? oprofile.sourceforge.net
  • Nein, das ist mein master-Abschluss-Arbeit. Vielleicht ist mein Dozent sah: -), Aber OProfile sieht interessant aus. Thx.
InformationsquelleAutor Pawka | 2009-09-16

3 Kommentare

  1. 6

    In modernen Linux-systems (2.6), jeder thread verfügt über eine separate Kennung, die hat fast die gleiche Behandlung wie die pid. Es wird in der Prozess-Tabelle (zumindest in htop Programm) und es hat auch seine separate /proc Eintritt, d.h. /proc/<tid>/stat.

    Überprüfen man 5 proc und achten Sie insbesondere auf die stat, statm, status etc. Sollten Sie die Informationen finden, die Sie interessiert sind in.

    Nur ein Hindernis ist, um diese zu erhalten thread Bezeichner. Es anders ist mit der Prozess-id! I. e. getpid() Anrufe in alle threads den gleichen Wert zurückgeben. Um das eigentliche thread-id, die Sie verwenden sollten (in einem C-Programm):

    pid_t tid = syscall(SYS_gettid);
    

    Durch die Art und Weise, die java virtual machine (mindestens, seine Linux-Implementierung OpenJDK) ist, dass intern und verwendet Sie für debugging-Zwecke in den back-end -, aber nicht setzen es auf die java-Schnittstelle.

  2. 5

    Speicher ist nicht zugeordnet-threads, und oft über mehrere threads. Dies macht es im Allgemeinen unmöglich und zumindest bedeutungslos zu reden, den Arbeitsspeicher-Verbrauch eines thread.

    Beispiel könnte ein Programm mit 11 threads; 1 erstellen von Objekten und 10 mit den Gegenständen. Die meiste Arbeit ist getan auf die 10 threads, aber alle Speicher zugewiesen wurde, auf die ein thread erzeugt die Objekte. Nun, wie funktioniert ein Konto?

    • Ich kann nicht sagen, dass du nicht Recht. Aber wir können davon ausgehen, dass die single-thread-Speicher Nutzung ist die Menge an Speicher, mit dem speziellen thread zu der aktuellen Zeit. Meist threads sperren-Speicher mit semophores oder Mutexe, während arbeitet mit Daten.
    • Sorry, aber das noch nicht sinnvoll. Nur-lese-Speicher muss keine Sperre überhaupt. Wenn ein mutex wird verwendet, es gibt keinen vernünftigen Weg, um zu bestimmen, welche Speicher es schützt, ohne dabei auf den code.
    • Ich Rede nicht von nur-lese-Speicher. Können wir noch zählen Arbeitsspeicher-Verbrauch-thread. Zum Beispiel die Arbeit mit einigen Grafik, erstellen von Knoten für einige zählen usw. Jeder diese Daten können zugänglich sein, indem ein thread, von Ihr selbst erstellte gereinigt und nach der Arbeit ist getan.
    • Also, wenn ein thread wäre die Arbeit mit einem Knoten, wird der Knoten gezählt, die gegen den Speicher? Oder ist der Speicher, der das gesamte Diagramm gezählt in Richtung der Speicher durch den thread verwendet? Ich sage nicht, dass es keine Zuordnungen zu einer bestimmten thread. Das ist einfach nicht ausreichend. In vielen real-world-Programme, werden Sie wahrscheinlich feststellen, dass 90% der Speicher-Zuordnung zu einem Prozess nicht eindeutig entfielen auf einen seiner threads. Ergebnis: Prozess verwendet 50 MB, die jeweils 10 “ threads „verwendet“ 1 MB und 40 MB „fehlen“. Ihre Ergebnisse werden nicht vertrauenswürdig sein, weil dieser.
  3. 1

    Wenn Sie bereit sind, zu verwenden Perl-werfen Sie einen Blick auf diese: Sys-Statistics-Linux

    Habe ich es zusammen mit einigen der GD-Grafik-Pakete zu generieren, die system-Ressourcen-Nutzung-Diagramme für verschiedene Prozesse.

    Einer Sache zu beachten – Sie werden wirklich brauchen, zu Lesen, auf /proc und verstehen jiffies – Letzte mal sah ich Sie nicht richtig dokumentiert in der man-Seiten, Sie müssen Lesen Sie die kernel-Quelle wahrscheinlich:

    http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h

    Denken Sie auch daran, dass bei Linux der einzige Unterschied zwischen thread und Prozess-ist, dass threads teilen Speicher – außer, dass Sie identisch sind, wie der kernel implementiert.

    • Die Sys-Statistics-Linux-link ist kaputt..

Kostenlose Online-Tests