2009-10-13 11 views
16

Ich muss die Speicherauslastung des aktuellen Prozesses in C abrufen. Kann jemand ein Codebeispiel anbieten, wie man das auf einer Linux-Plattform macht?Speicherauslastung des aktuellen Prozesses in C

Ich bin mir bewusst, die cat /proc/<your pid>/status Methode der Speichernutzung bekommen, aber ich habe keine Ahnung, wie das erfassen in C.

BTW, es ist für eine PHP-Erweiterung I (erteilt bin ändern, ich bin ein C-Neuling). Wenn in der PHP-Erweiterungs-API Shortcuts verfügbar sind, wäre das noch hilfreicher.

Antwort

23

können Sie immer nur öffnen Sie die 'Dateien' in dem /proc System, wie Sie würde eine normale Datei (mit dem Symlink ‚Selbst‘, so dass Sie müssen nicht sehen Sie Ihre eigene pid): müssen

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

Natürlich können Sie nun die Datei analysieren die Informationen herauszusuchen Sie benötigen.

22

Die getrusage Bibliothek Funktion gibt eine Struktur, die eine ganze Reihe von Daten über den aktuellen Prozess, einschließlich der diese enthält:

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

jedoch die meisten up-to-date sagt Linux-Dokumentation über diese drei Felder

(unmaintained) This field is currently unused on Linux 

Siehe getrusage(2)

+2

Leider ist die ru_idrss und ru_isrss Daten nicht zu meinem Kernel (Ubuntu Hardy) availabe: http://linux.die.net/man/2/getrusage – scotts

+0

Leider werden alle Daten 0 auf meinem Kernel zeigt (Debian Wheezy) – Achim

6
#include <sys/resource.h> 
#include <errno.h> 

errno = 0; 
struct rusage* memory = malloc(sizeof(struct rusage)); 
getrusage(RUSAGE_SELF, memory); 
if(errno == EFAULT) 
    printf("Error: EFAULT\n"); 
else if(errno == EINVAL) 
    printf("Error: EINVAL\n"); 
printf("Usage: %ld\n", memory->ru_ixrss); 
printf("Usage: %ld\n", memory->ru_isrss); 
printf("Usage: %ld\n", memory->ru_idrss); 
printf("Max: %ld\n", memory->ru_maxrss); 

habe ich diesen Code aber aus irgendeinem Grund bekomme ich 0 die ganze Zeit für alle 4 printf()

+7

Das liegt daran, dass Linux selbst in der Version 2.6, 10 Jahre nach POSIX.1, immer noch nicht implementiert, bis auf ein paar Felder. :-(Offenbar ist der einzige Weg, um die Informationen zu erhalten durch Kernel-Aufrufe oder Lesen/proc//statm (siehe man 5 proc), die vollständig nicht portierbar ist. – James

+4

Warum verwenden Sie malloc für eine statisch große Struktur? –

0

Die obige Struktur von 4.3BSD Reno genommen wurde. Nicht alle Felder sind unter Linux genial. In Linux 2.4 werden nur die Felder ru_utime, ru_stime, ru_minflt und ru_majflt gepflegt. Seit Linux 2.6 werden auch ru_nvcsw und ru_nivcsw gepflegt.

http://www.atarininja.org/index.py/tags/code

13

Dies ist ein furchtbar hässlich und nicht tragbarer Weg, um die Speichernutzung zu bekommen, aber da getrusage() 's Speicher-Tracking auf Linux im Wesentlichen nutzlos, Lesen/proc // statm ist der einzige Weg, Ich weiß, um die Informationen über Linux zu bekommen.

Wenn jemand von sauberer, oder vorzugsweise mehr Cross-Unix Möglichkeiten der Speicherverwendung zu verfolgen, wäre ich sehr daran interessiert zu lernen, 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); 
} 

Vom proc (5) man-Seite:

/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) 
4

ich auf diesen Beitrag kam: 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; 
} 

(in Linux getestet 3,13)

+0

Leider auch ru_maxrss zeigt immer 0 auf meinem Kernel an (Debian Wheezy) – Achim

+0

Das scheint zumindest unter Linux 4.12.4 zu funktionieren, obwohl ich mich frage, ob es tatsächlich Kilobytes zurückgibt –

1

Ich bin zu spät zur Party, aber das könnte hilfreich für jeden sein, der nach dem Resident und virtuellen (und ihren Spitzenwerten bis jetzt) ​​Erinnerungen auf Linux sucht.

Es ist wahrscheinlich ziemlich schrecklich, aber es macht die Arbeit erledigt.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


/* 
* Measures the current (and peak) resident and virtual memories 
* usage of your linux C process, in kB 
*/ 
void getMemory(
    int* currRealMem, int* peakRealMem, 
    int* currVirtMem, int* peakVirtMem) { 

    // stores each word in status file 
    char buffer[1024] = ""; 

    // linux file contains this-process info 
    FILE* file = fopen("/proc/self/status", "r"); 

    // read the entire file 
    while (fscanf(file, " %1023s", buffer) == 1) { 

     if (strcmp(buffer, "VmRSS:") == 0) { 
      fscanf(file, " %d", currRealMem); 
     } 
     if (strcmp(buffer, "VmHWM:") == 0) { 
      fscanf(file, " %d", peakRealMem); 
     } 
     if (strcmp(buffer, "VmSize:") == 0) { 
      fscanf(file, " %d", currVirtMem); 
     } 
     if (strcmp(buffer, "VmPeak:") == 0) { 
      fscanf(file, " %d", peakVirtMem); 
     } 
    } 
    fclose(file); 
} 
+0

Vorsicht, ich behandle nicht wenn 'Datei' nicht funktioniert t existieren –