GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Speichernutzung des aktuellen Prozesses in C

Sie können die 'Dateien' immer einfach im /proc öffnen system wie eine normale Datei (unter Verwendung des 'self'-Symlinks, damit Sie Ihre eigene PID nicht nachschlagen müssen):

FILE* status = fopen( "/proc/self/status", "r" );

Natürlich müssen Sie die Datei jetzt parsen, um die benötigten Informationen herauszusuchen.


Ich bin auf diesen Beitrag gestoßen:http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/

Vereinfachte Version:

#include <sys/resource.h>
#include <stdio.h>

int main() {
  struct rusage r_usage;
  getrusage(RUSAGE_SELF,&r_usage);
  // Print the maximum resident set size used (in kilobytes).
  printf("Memory usage: %ld kilobytes\n",r_usage.ru_maxrss);
  return 0;
}

(getestet unter Linux 3.13)


Dies ist eine schrecklich hässliche und nicht tragbare Methode, um die Speichernutzung zu ermitteln, aber da die Speicherverfolgung von getrusage() unter Linux im Wesentlichen nutzlos ist, ist das Lesen von /proc//statm die einzige Möglichkeit, die ich kenne, um die zu erhalten Informationen zu Linux.

Wenn irgendjemand sauberere oder besser Unix-übergreifende Methoden zum Verfolgen der Speichernutzung kennt, wäre ich sehr daran interessiert, zu erfahren, wie.

typedef struct {
    unsigned long size,resident,share,text,lib,data,dt;
} statm_t;

void read_off_memory_status(statm_t& result)
{
  unsigned long dummy;
  const char* statm_path = "/proc/self/statm";

  FILE *f = fopen(statm_path,"r");
  if(!f){
    perror(statm_path);
    abort();
  }
  if(7 != fscanf(f,"%ld %ld %ld %ld %ld %ld %ld",
    &result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt))
  {
    perror(statm_path);
    abort();
  }
  fclose(f);
}

Von der proc(5) Manpage:

   /proc/[pid]/statm
          Provides information about memory usage, measured in pages.  
          The columns are:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)

Die getrusage Die Bibliotheksfunktion gibt eine Struktur zurück, die eine ganze Menge Daten über den aktuellen Prozess enthält, einschließlich dieser:

long   ru_ixrss;         /* integral shared memory size */
long   ru_idrss;         /* integral unshared data size */
long   ru_isrss;         /* integral unshared stack size */

Die aktuellste Linux-Dokumentation sagt jedoch über diese 3 Felder

(unmaintained) This field is currently unused on Linux

die das Handbuch dann definiert als:

Nicht alle Felder sind ausgefüllt; Nicht verwaltete Felder werden vom Kernel auf Null gesetzt. (Die ungepflegten Felder werden aus Gründen der Kompatibilität mit anderen Systemen bereitgestellt und weil sie eines Tages unter Linux unterstützt werden könnten.)

Siehe getrusage(2)


Linux
  1. Linux-Speichernutzung

  2. So überprüfen Sie die Speichernutzung des Prozesses mit dem Linux-pmap-Befehl

  3. Linux – Speichernutzung für einen einzelnen Linux-Prozess begrenzen?

  4. Tool, das die Protokollierung der Speichernutzung ermöglicht?

  5. Maximale Speicherauslastung eines Linux/Unix-Prozesses

So überprüfen Sie die gesamte RAM-Größe und Speichernutzung in Linux

Begrenzung der Prozessspeicher-/CPU-Nutzung unter Linux

Aufrufen und Verfolgen der Speichernutzung eines Prozesses

Begrenzen Sie die Speichernutzung für einen einzelnen Linux-Prozess

Maximale Speicherauslastung eines Prozesses

Grafische Darstellung der Prozessspeichernutzung unter Linux