c4fb0432ae
GitOrigin-RevId: 3fc1143a04da49a92c3663813c6a0c1e8ccd477f
119 lines
3.6 KiB
Diff
119 lines
3.6 KiB
Diff
From d1dadae5674222a0134092b3313383e088deda89 Mon Sep 17 00:00:00 2001
|
|
From: multiplexd <multi@in-addr.xyz>
|
|
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
|
|
|