Add memory profiler
parent
2ec7f40125
commit
8970e8927c
@ -0,0 +1,92 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/sysinfo.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/times.h>
|
||||
#include <sys/vtimes.h>
|
||||
#include <unistd.h>
|
||||
#include "log.h"
|
||||
#include "memory.h"
|
||||
|
||||
static unsigned long long lastTotalUser, lastTotalUserLow, lastTotalSys, lastTotalIdle;
|
||||
static clock_t lastCPU, lastSysCPU, lastUserCPU;
|
||||
static int numProcessors;
|
||||
|
||||
void getTotalVirtualMem(double* total_ram) {
|
||||
const double megabyte = 1024 * 1024;
|
||||
struct sysinfo si;
|
||||
sysinfo(&si);
|
||||
*total_ram = si.totalram / megabyte;
|
||||
}
|
||||
|
||||
void getVirtualMemUsed(double* used_ram) {
|
||||
const double megabyte = 1024 * 1024;
|
||||
struct sysinfo si;
|
||||
sysinfo(&si);
|
||||
*used_ram = si.freeram / megabyte;
|
||||
}
|
||||
|
||||
int parseLine(char* line) {
|
||||
// This assumes that a digit will be found and the line ends in " Kb".
|
||||
int i = strlen(line);
|
||||
const char* p = line;
|
||||
while (*p <'0' || *p > '9') p++;
|
||||
line[i-3] = '\0';
|
||||
i = atoi(p);
|
||||
return i;
|
||||
}
|
||||
|
||||
int getVirtualMemUsedByCurrentProcess() {
|
||||
FILE* file = fopen("/proc/self/status", "r");
|
||||
int result = -1;
|
||||
char line[128];
|
||||
|
||||
while (fgets(line, 128, file) != NULL){
|
||||
if (strncmp(line, "VmSize:", 7) == 0){
|
||||
result = parseLine(line);
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(file);
|
||||
return result / 1024;
|
||||
}
|
||||
|
||||
void skip_lines(FILE *fp, int numlines) {
|
||||
int cnt = 0;
|
||||
char ch;
|
||||
while ((cnt < numlines) && ((ch = getc(fp)) != EOF)) {
|
||||
if (ch == '\n') cnt++;
|
||||
}
|
||||
}
|
||||
|
||||
void get_stats(struct cpustat *st, int cpunum) {
|
||||
FILE *fp = fopen("/proc/stat", "r");
|
||||
int lskip = cpunum+1;
|
||||
skip_lines(fp, lskip);
|
||||
char cpun[255];
|
||||
fscanf(fp, "%s %d %d %d %d %d %d %d", cpun, &(st->t_user), &(st->t_nice),
|
||||
&(st->t_system), &(st->t_idle), &(st->t_iowait), &(st->t_irq),
|
||||
&(st->t_softirq));
|
||||
fclose(fp);
|
||||
return;
|
||||
}
|
||||
|
||||
double calculate_load(struct cpustat *prev, struct cpustat *cur) {
|
||||
int idle_prev = (prev->t_idle) + (prev->t_iowait);
|
||||
int idle_cur = (cur->t_idle) + (cur->t_iowait);
|
||||
|
||||
int nidle_prev = (prev->t_user) + (prev->t_nice) + (prev->t_system) + (prev->t_irq) + (prev->t_softirq);
|
||||
int nidle_cur = (cur->t_user) + (cur->t_nice) + (cur->t_system) + (cur->t_irq) + (cur->t_softirq);
|
||||
|
||||
int total_prev = idle_prev + nidle_prev;
|
||||
int total_cur = idle_cur + nidle_cur;
|
||||
|
||||
double totald = (double) total_cur - (double) total_prev;
|
||||
|
||||
double idled = (double) idle_cur - (double) idle_prev;
|
||||
|
||||
double cpu_perc = (1000 * (totald - idled) / totald + 1) / 10;
|
||||
|
||||
return cpu_perc;
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
#include "sys/types.h"
|
||||
#include "sys/sysinfo.h"
|
||||
#include "stdlib.h"
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#include "sys/times.h"
|
||||
#include "sys/vtimes.h"
|
||||
|
||||
void getTotalVirtualMem();
|
||||
void getVirtualMemUsed();
|
||||
int getVirtualMemUsedByCurrentProcess();
|
||||
|
||||
struct cpustat {
|
||||
unsigned long t_user;
|
||||
unsigned long t_nice;
|
||||
unsigned long t_system;
|
||||
unsigned long t_idle;
|
||||
unsigned long t_iowait;
|
||||
unsigned long t_irq;
|
||||
unsigned long t_softirq;
|
||||
};
|
||||
|
||||
void get_stats(struct cpustat *st, int cpunum);
|
||||
double calculate_load(struct cpustat *prev, struct cpustat *cur);
|
@ -1 +1 @@
|
||||
python3 test.py 2>&1 | tee log.txt
|
||||
python3 test.py 2>&1 | tee log2.txt
|
Loading…
Reference in New Issue