From d1dadae5674222a0134092b3313383e088deda89 Mon Sep 17 00:00:00 2001 From: multiplexd Date: Sat, 9 May 2020 20:13:09 +0100 Subject: [PATCH] Linux: consider ZFS ARC to be cache --- ProcessList.c | 1 + ProcessList.h | 1 + linux/LinuxProcessList.c | 27 +++++++++++++++++++++++++++ linux/LinuxProcessList.h | 4 ++++ linux/Platform.c | 5 +++-- 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/ProcessList.c b/ProcessList.c index 7482b03..7083957 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -67,6 +67,7 @@ typedef struct ProcessList_ { unsigned long long int totalSwap; unsigned long long int usedSwap; unsigned long long int freeSwap; + unsigned long long int arcSize; int cpuCount; diff --git a/ProcessList.h b/ProcessList.h index 572d484..65029f1 100644 --- a/ProcessList.h +++ b/ProcessList.h @@ -61,6 +61,7 @@ typedef struct ProcessList_ { unsigned long long int totalSwap; unsigned long long int usedSwap; unsigned long long int freeSwap; + unsigned long long int arcSize; int cpuCount; diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c index 5f38540..507ebd2 100644 --- a/linux/LinuxProcessList.c +++ b/linux/LinuxProcessList.c @@ -104,6 +104,10 @@ typedef struct LinuxProcessList_ { #define PROCSTATFILE PROCDIR "/stat" #endif +#ifndef ARCSTATFILE +#define ARCSTATFILE PROCDIR "/spl/kstat/zfs/arcstats" +#endif + #ifndef PROCMEMINFOFILE #define PROCMEMINFOFILE PROCDIR "/meminfo" #endif @@ -962,6 +966,29 @@ static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) { this->cachedMem = this->cachedMem + sreclaimable - shmem; this->usedSwap = this->totalSwap - swapFree; fclose(file); + + file = fopen(ARCSTATFILE, "r"); + if (file == NULL && errno != ENOENT) { + CRT_fatalError("Cannot open " ARCSTATFILE); + } + + if (file != NULL) { + // skip the first two lines + fgets(buffer, sizeof buffer, file); + fgets(buffer, sizeof buffer, file); + + unsigned long long int arcsize = 0; + while (fgets(buffer, sizeof buffer, file)) { + #define tryRead(label, variable) do { if (String_startsWith(buffer, label) && sscanf(buffer + strlen(label), " %*d %llu", variable)) { break; } } while(0) + if (buffer[0] == 's') tryRead("size", &arcsize); + } + + this->arcSize = arcsize / 1024; + + fclose(file); + } else { + this->arcSize = 0; + } } static inline double LinuxProcessList_scanCPUTime(LinuxProcessList* this) { diff --git a/linux/LinuxProcessList.h b/linux/LinuxProcessList.h index f30b487..8f2edbb 100644 --- a/linux/LinuxProcessList.h +++ b/linux/LinuxProcessList.h @@ -77,6 +77,10 @@ typedef struct LinuxProcessList_ { #define PROCSTATFILE PROCDIR "/stat" #endif +#ifndef ARCSTATFILE +#define ARCSTATFILE PROCDIR "/spl/kstat/zfs/arcstats" +#endif + #ifndef PROCMEMINFOFILE #define PROCMEMINFOFILE PROCDIR "/meminfo" #endif diff --git a/linux/Platform.c b/linux/Platform.c index ab90ca7..fb78c4c 100644 --- a/linux/Platform.c +++ b/linux/Platform.c @@ -200,11 +200,12 @@ void Platform_setMemoryValues(Meter* this) { long int usedMem = pl->usedMem; long int buffersMem = pl->buffersMem; long int cachedMem = pl->cachedMem; - usedMem -= buffersMem + cachedMem; + long int arcSize = pl->arcSize; + usedMem -= buffersMem + cachedMem + arcSize; this->total = pl->totalMem; this->values[0] = usedMem; this->values[1] = buffersMem; - this->values[2] = cachedMem; + this->values[2] = cachedMem + arcSize; } void Platform_setSwapValues(Meter* this) { -- 2.20.1