[libgtop/wip/lantw/freebsd-laundry-memory-and-zfs-arc] freebsd: Support laundry memory and ZFS ARC



commit bb118fa9d6d3ceb35db36bdcaa85cfc78c28997d
Author: Ting-Wei Lan <lantw src gnome org>
Date:   Thu Oct 25 00:30:12 2018 +0800

    freebsd: Support laundry memory and ZFS ARC
    
    FreeBSD 11.1 removes cache memory and adds laundry memory. The MIB of
    cache memory still exists, but its value is always set to zero.
    According to the man page of top(1), the value of laundry memory means
    number of dirty pages queued for laundering, suggesting that it should
    be added to the 'user' in libgtop because it cannot be freed immediately
    without writing out data. Laundry memory was part of inactive memory in
    older FreeBSD releases.
    
    FreeBSD systems running on ZFS usually have a large portion of memory
    used as ZFS ARC, which has similar purpose to buffer cache of other
    filesystems. ZFS ARC can usually be freed quickly when the system needs
    more memory, so we don't want to put it in 'user' in libgtop. However,
    both buffer cache and ZFS ARC are parts of wired memory, and wired
    memory is counted in 'user'. Therefore, we subtract the size of ZFS ARC
    from wired memory when calculating 'user' value, making it more useful
    to FreeBSD users.
    
    This patch is based on the patch submiited three years ago by
    BenoƮt Dejean <bdejean gmail com>.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=748928
    https://gitlab.gnome.org/GNOME/libgtop/issues/31

 sysdeps/freebsd/mem.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)
---
diff --git a/sysdeps/freebsd/mem.c b/sysdeps/freebsd/mem.c
index 22f560ed..fa7e86b6 100644
--- a/sysdeps/freebsd/mem.c
+++ b/sysdeps/freebsd/mem.c
@@ -55,6 +55,16 @@ static gulong mem_get_by_bytes (glibtop *server, const char *name) {
        return result;
 }
 
+static gulong try_mem_get_by_bytes (glibtop *server, const char *name) {
+       gulong result = 0;
+       size_t len = sizeof (result);
+
+       if (sysctlbyname (name, &result, &len, NULL, 0)) {
+               return 0;
+       }
+       return result;
+}
+
 static gulong mem_get_by_pages (glibtop *server, const char *name) {
        guint result = 0;
        size_t len = sizeof (result);
@@ -71,29 +81,35 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
        gulong memtotal;
        gulong memactive;
        gulong meminactive;
+       gulong memlaundry;
        gulong memwired;
        gulong memcached;
        gulong membuffer;
        gulong memfree;
+       gulong zfs_arc_size;
 
        memset (buf, 0, sizeof *buf);
 
        memtotal = mem_get_by_bytes (server, "hw.physmem");
        memactive = mem_get_by_pages (server, "vm.stats.vm.v_active_count");
        meminactive = mem_get_by_pages (server, "vm.stats.vm.v_inactive_count");
+       memlaundry = mem_get_by_pages (server, "vm.stats.vm.v_laundry_count");
        memwired = mem_get_by_pages (server, "vm.stats.vm.v_wire_count");
        memcached = mem_get_by_pages (server, "vm.stats.vm.v_cache_count");
        membuffer = mem_get_by_bytes (server, "vfs.bufspace");
        memfree = mem_get_by_pages (server, "vm.stats.vm.v_free_count");
 
+       zfs_arc_size = try_mem_get_by_bytes (server, "kstat.zfs.misc.arcstats.size");
+
        buf->total = memtotal;
        buf->used = memtotal - memfree;
        buf->free = memfree;
        buf->shared = 0;
        buf->buffer = membuffer;
-       buf->cached = memcached;
+       buf->cached = memcached + zfs_arc_size;
        buf->locked = 0;
 
-       buf->user = memactive + memwired;
+       buf->user = memactive + memlaundry + memwired - zfs_arc_size;
+
        buf->flags = _glibtop_sysdeps_mem;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]