From 7694dbc82175baff3b3a42898ef8c29c7299eca3 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Sun, 29 May 2022 21:17:25 +0200 Subject: [PATCH] Implement PCP support for minimum ZFS ARC size --- pcp/PCPMetric.h | 1 + pcp/PCPProcessList.c | 2 ++ pcp/Platform.c | 10 ++++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pcp/PCPMetric.h b/pcp/PCPMetric.h index aa0e2a7a..84ccbb95 100644 --- a/pcp/PCPMetric.h +++ b/pcp/PCPMetric.h @@ -81,6 +81,7 @@ typedef enum PCPMetric_ { PCP_ZFS_ARC_BONUS_SIZE, /* zfs.arc.bonus_size */ PCP_ZFS_ARC_COMPRESSED_SIZE, /* zfs.arc.compressed_size */ PCP_ZFS_ARC_UNCOMPRESSED_SIZE, /* zfs.arc.uncompressed_size */ + PCP_ZFS_ARC_C_MIN, /* zfs.arc.c_min */ PCP_ZFS_ARC_C_MAX, /* zfs.arc.c_max */ PCP_ZFS_ARC_DBUF_SIZE, /* zfs.arc.dbuf_size */ PCP_ZFS_ARC_DNODE_SIZE, /* zfs.arc.dnode_size */ diff --git a/pcp/PCPProcessList.c b/pcp/PCPProcessList.c index ca82575a..045f7ae0 100644 --- a/pcp/PCPProcessList.c +++ b/pcp/PCPProcessList.c @@ -601,6 +601,8 @@ static inline void PCPProcessList_scanZfsArcstats(PCPProcessList* this) { memset(&this->zfs, 0, sizeof(ZfsArcStats)); if (PCPMetric_values(PCP_ZFS_ARC_ANON_SIZE, &value, 1, PM_TYPE_U64)) this->zfs.anon = value.ull / ONE_K; + if (PCPMetric_values(PCP_ZFS_ARC_C_MIN, &value, 1, PM_TYPE_U64)) + this->zfs.min = value.ull / ONE_K; if (PCPMetric_values(PCP_ZFS_ARC_C_MAX, &value, 1, PM_TYPE_U64)) this->zfs.max = value.ull / ONE_K; if (PCPMetric_values(PCP_ZFS_ARC_BONUS_SIZE, &value, 1, PM_TYPE_U64)) diff --git a/pcp/Platform.c b/pcp/Platform.c index b3d6ed4a..342bf439 100644 --- a/pcp/Platform.c +++ b/pcp/Platform.c @@ -178,6 +178,7 @@ static const char* Platform_metricNames[] = { [PCP_ZFS_ARC_BONUS_SIZE] = "zfs.arc.bonus_size", [PCP_ZFS_ARC_COMPRESSED_SIZE] = "zfs.arc.compressed_size", [PCP_ZFS_ARC_UNCOMPRESSED_SIZE] = "zfs.arc.uncompressed_size", + [PCP_ZFS_ARC_C_MIN] = "zfs.arc.c_min", [PCP_ZFS_ARC_C_MAX] = "zfs.arc.c_max", [PCP_ZFS_ARC_DBUF_SIZE] = "zfs.arc.dbuf_size", [PCP_ZFS_ARC_DNODE_SIZE] = "zfs.arc.dnode_size", @@ -510,8 +511,13 @@ void Platform_setMemoryValues(Meter* this) { this->values[4] = pl->availableMem; if (ppl->zfs.enabled != 0) { - this->values[0] -= ppl->zfs.size; - this->values[3] += ppl->zfs.size; + // ZFS does not shrink below the value of zfs_arc_min. + unsigned long long int shrinkableSize = 0; + if (ppl->zfs.size > ppl->zfs.min) + shrinkableSize = ppl->zfs.size - ppl->zfs.min; + this->values[0] -= shrinkableSize; + this->values[3] += shrinkableSize; + this->values[4] += shrinkableSize; } }