From 5bc1f5ed04a56c4b33cf2854e1f3b0918b098cbf Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Sat, 28 Nov 2015 22:22:00 -0200 Subject: [PATCH 1/2] Account unreclaimable slab and shmem as used memory, reclaimable slab as cached memory. Hopefully this presents a more truthful representation of available vs. used memory on Linux. See brndnmtthws/conky#82, #242, #67, #263. --- linux/LinuxProcessList.c | 42 ++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 92259514..6724acff 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -621,6 +621,9 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, const char* static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) { unsigned long long int swapFree = 0; + unsigned long long int slab = 0; + unsigned long long int shmem = 0; + unsigned long long int sreclaimable = 0; FILE* file = fopen(PROCMEMINFOFILE, "r"); if (file == NULL) { @@ -629,33 +632,42 @@ static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) { char buffer[128]; while (fgets(buffer, 128, file)) { + #define tryRead(label, variable) (String_startsWith(buffer, label) && sscanf(buffer + strlen(label), " %32llu kB", variable)) switch (buffer[0]) { case 'M': - if (String_startsWith(buffer, "MemTotal:")) - sscanf(buffer, "MemTotal: %32llu kB", &this->totalMem); - else if (String_startsWith(buffer, "MemFree:")) - sscanf(buffer, "MemFree: %32llu kB", &this->freeMem); - else if (String_startsWith(buffer, "MemShared:")) - sscanf(buffer, "MemShared: %32llu kB", &this->sharedMem); + if (tryRead("MemTotal:", &this->totalMem)) {} + else if (tryRead("MemFree:", &this->freeMem)) {} + else if (tryRead("MemShared:", &this->sharedMem)) {} break; case 'B': - if (String_startsWith(buffer, "Buffers:")) - sscanf(buffer, "Buffers: %32llu kB", &this->buffersMem); + if (tryRead("Buffers:", &this->buffersMem)) {} break; case 'C': - if (String_startsWith(buffer, "Cached:")) - sscanf(buffer, "Cached: %32llu kB", &this->cachedMem); + if (tryRead("Cached:", &this->cachedMem)) {} break; case 'S': - if (String_startsWith(buffer, "SwapTotal:")) - sscanf(buffer, "SwapTotal: %32llu kB", &this->totalSwap); - if (String_startsWith(buffer, "SwapFree:")) - sscanf(buffer, "SwapFree: %32llu kB", &swapFree); + switch (buffer[1]) { + case 'w': + if (tryRead("SwapTotal:", &this->totalSwap)) {} + else if (tryRead("SwapFree:", &swapFree)) {} + break; + case 'l': + if (tryRead("Slab:", &slab)) {} + break; + case 'h': + if (tryRead("Shmem:", &shmem)) {} + break; + case 'R': + if (tryRead("SReclaimable:", &sreclaimable)) {} + break; + } break; } + #undef tryRead } - this->usedMem = this->totalMem - this->freeMem; + this->usedMem = this->totalMem - this->freeMem + (slab - sreclaimable) + shmem; + this->cachedMem = this->cachedMem + sreclaimable; this->usedSwap = this->totalSwap - swapFree; fclose(file); } From a84aa2e78226563cd758711171c69c9c79131c53 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Sun, 29 Nov 2015 23:55:31 -0200 Subject: [PATCH 2/2] Cached memory calculations, take 2. Thanks to @OmegaPhil for discussion and reviewing. --- linux/LinuxProcessList.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 6724acff..e939b4a9 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -621,7 +621,6 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, const char* static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) { unsigned long long int swapFree = 0; - unsigned long long int slab = 0; unsigned long long int shmem = 0; unsigned long long int sreclaimable = 0; @@ -651,9 +650,6 @@ static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) { if (tryRead("SwapTotal:", &this->totalSwap)) {} else if (tryRead("SwapFree:", &swapFree)) {} break; - case 'l': - if (tryRead("Slab:", &slab)) {} - break; case 'h': if (tryRead("Shmem:", &shmem)) {} break; @@ -666,8 +662,8 @@ static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) { #undef tryRead } - this->usedMem = this->totalMem - this->freeMem + (slab - sreclaimable) + shmem; - this->cachedMem = this->cachedMem + sreclaimable; + this->usedMem = this->totalMem - this->freeMem; + this->cachedMem = this->cachedMem + sreclaimable - shmem; this->usedSwap = this->totalSwap - swapFree; fclose(file); }