From 1ba3abd3ab77261ed4a75bc7cacf929b9a4a0b87 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Mon, 5 Apr 2010 15:51:47 -0700 Subject: [PATCH] (SIGAR-188) implement mem actual free/used on Solaris --- src/os/solaris/solaris_sigar.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/os/solaris/solaris_sigar.c b/src/os/solaris/solaris_sigar.c index ef9472f1..2286d4a3 100644 --- a/src/os/solaris/solaris_sigar.c +++ b/src/os/solaris/solaris_sigar.c @@ -187,6 +187,7 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) { kstat_ctl_t *kc = sigar->kc; kstat_t *ksp; + sigar_uint64_t kern = 0; SIGAR_ZERO(mem); @@ -211,8 +212,28 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) sigar_koffsets_init_mempages(sigar, ksp); } - mem->actual_free = mem->free; - mem->actual_used = mem->used; + /* XXX mdb ::memstat cachelist/freelist not available to kstat, see: */ + /* http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6821980 */ + + /* ZFS ARC cache. see: http://opensolaris.org/jive/thread.jspa?messageID=393695 */ + if ((ksp = kstat_lookup(sigar->kc, "zfs", 0, "arcstats")) && + (kstat_read(sigar->kc, ksp, NULL) != -1)) + { + kstat_named_t *kn; + + if ((kn = (kstat_named_t *)kstat_data_lookup(ksp, "size"))) { + kern = kn->value.i64; + } + if ((kn = (kstat_named_t *)kstat_data_lookup(ksp, "c_min"))) { + /* c_min cannot be reclaimed they say */ + if (kern > kn->value.i64) { + kern -= kn->value.i64; + } + } + } + + mem->actual_free = mem->free + kern; + mem->actual_used = mem->used - kern; sigar_mem_calc_ram(sigar, mem);