diff --git a/src/debug.c b/src/debug.c index 601f63d6e11bbbf95f62eaef1ec6ec7ec06d3ad9..2069c042e225a6ca1a2aa89bf5e60b3efecd0237 100644 --- a/src/debug.c +++ b/src/debug.c @@ -26,6 +26,7 @@ /* Some standard headers. */ #include <float.h> #include <stdio.h> +#include <unistd.h> /* This object's header. */ #include "debug.h" @@ -450,3 +451,65 @@ void dumpCellRanks(const char *prefix, struct cell *cells_top, int nr_cells) { } #endif /* HAVE_MPI */ + +/** + * @brief parse the process /proc/self/statm file to get the process + * memory use (in KB). Top field in (). + * + * @param size total virtual memory (VIRT) + * @param resident resident non-swapped memory (RES) + * @param share shared (mmap'd) memory (SHR) + * @param trs text (exe) resident set (CODE) + * @param lrs library resident set + * @param drs data+stack resident set (DATA) + * @param dt dirty pages (nDRT) + */ +void getProcMemUse(long *size, long *resident, long *share, long *trs, + long *lrs, long *drs, long *dt) { + + /* Open the file. */ + FILE *file = fopen("/proc/self/statm", "r"); + if (file != NULL) { + fscanf(file, "%ld %ld %ld %ld %ld %ld %ld", size, resident, share, + trs, lrs, drs, dt); + + /* Convert pages into bytes. Usually 4096, but could be 512 on some + * systems so take care in conversion to KB. */ + long sz = sysconf(_SC_PAGESIZE); + *size *= sz; + *resident *= sz; + *share *= sz; + *trs *= sz; + *lrs *= sz; + *drs *= sz; + *dt *= sz; + + *size /= 1024; + *resident /= 1024; + *share /= 1024; + *trs /= 1024; + *lrs /= 1024; + *drs /= 1024; + *dt /= 1024; + fclose(file); + } else { + error("Failed to open /proc/self/statm"); + } +} + +/** + * @brief Print the current memory use of the process. A la "top". + */ +void printProcMemUse() { + long size; + long resident; + long share; + long trs; + long lrs; + long drs; + long dt; + getProcMemUse(&size, &resident, &share, &trs, &lrs, &drs, &dt); + printf("## VIRT = %ld , RES = %ld , SHR = %ld , CODE = %ld, DATA = %ld\n", + size, resident, share, trs, drs); + fflush(stdout); +} diff --git a/src/debug.h b/src/debug.h index 7422a6f7f9815490966f08415e0312876ce0123f..7dca848b6bf4e44de5f40fa8e1c0849e8ee3d0b4 100644 --- a/src/debug.h +++ b/src/debug.h @@ -44,4 +44,7 @@ void dumpMETISGraph(const char *prefix, idx_t nvtxs, idx_t ncon, idx_t *xadj, void dumpCellRanks(const char *prefix, struct cell *cells_top, int nr_cells); #endif +void getProcMemUse(long *size, long *resident, long *share, long *trs, + long *lrs, long *drs, long *dt); +void printProcMemUse(); #endif /* SWIFT_DEBUG_H */