Skip to content

Commit

Permalink
Account unreclaimable slab and shmem as used memory,
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
chuiyukongi committed Oct 14, 2024
1 parent 5b3a425 commit cbd682f
Showing 1 changed file with 27 additions and 15 deletions.
42 changes: 27 additions & 15 deletions linux/LinuxProcessList.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
}
Expand Down

0 comments on commit cbd682f

Please sign in to comment.