From bd7b2f81484c0658297ab87a01ed35cc5dbd60c8 Mon Sep 17 00:00:00 2001 From: Isida Zyun'iti Date: Tue, 7 Aug 2018 20:00:00 +0900 Subject: [PATCH] Add mem(laundry) numbers on FreeBSD. After FreeBSD 11.1, mem number of cached replaced by laundry. https://reviews.freebsd.org/D8302 --- mem/mem.go | 4 ++++ mem/mem_freebsd.go | 20 +++++++++++++++----- mem/mem_test.go | 6 +++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/mem/mem.go b/mem/mem.go index 3d71d96..e505662 100644 --- a/mem/mem.go +++ b/mem/mem.go @@ -42,6 +42,10 @@ type VirtualMemoryStat struct { Inactive uint64 `json:"inactive"` Wired uint64 `json:"wired"` + // FreeBSD specific numbers: + // https://reviews.freebsd.org/D8467 + Laundry uint64 `json:"laundry"` + // Linux specific numbers // https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s2-proc-meminfo.html // https://www.kernel.org/doc/Documentation/filesystems/proc.txt diff --git a/mem/mem_freebsd.go b/mem/mem_freebsd.go index 69cdeff..a792281 100644 --- a/mem/mem_freebsd.go +++ b/mem/mem_freebsd.go @@ -35,10 +35,6 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { if err != nil { return nil, err } - cached, err := unix.SysctlUint32("vm.stats.vm.v_cache_count") - if err != nil { - return nil, err - } buffers, err := unix.SysctlUint64("vfs.bufspace") if err != nil { return nil, err @@ -47,6 +43,19 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { if err != nil { return nil, err } + var cached, laundry uint32 + osreldate, _ := unix.SysctlUint32("kern.osreldate") + if osreldate < 1102000 { + cached, err = unix.SysctlUint32("vm.stats.vm.v_cache_count") + if err != nil { + return nil, err + } + } else { + laundry, err = unix.SysctlUint32("vm.stats.vm.v_laundry_count") + if err != nil { + return nil, err + } + } p := uint64(pageSize) ret := &VirtualMemoryStat{ @@ -57,9 +66,10 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { Cached: uint64(cached) * p, Buffers: uint64(buffers), Wired: uint64(wired) * p, + Laundry: uint64(laundry) * p, } - ret.Available = ret.Inactive + ret.Cached + ret.Free + ret.Available = ret.Inactive + ret.Cached + ret.Free + ret.Laundry ret.Used = ret.Total - ret.Available ret.UsedPercent = float64(ret.Used) / float64(ret.Total) * 100.0 diff --git a/mem/mem_test.go b/mem/mem_test.go index 52428e6..2a18299 100644 --- a/mem/mem_test.go +++ b/mem/mem_test.go @@ -33,8 +33,8 @@ func TestVirtual_memory(t *testing.T) { totalStr = "used + available" } if runtime.GOOS == "freebsd" { - total = v.Used + v.Free + v.Cached + v.Inactive - totalStr = "used + free + cached + inactive" + total = v.Used + v.Free + v.Cached + v.Inactive + v.Laundry + totalStr = "used + free + cached + inactive + laundry" } assert.Equal(t, v.Total, total, "Total should be computable (%v): %v", totalStr, v) @@ -71,7 +71,7 @@ func TestVirtualMemoryStat_String(t *testing.T) { UsedPercent: 30.1, Free: 40, } - e := `{"total":10,"available":20,"used":30,"usedPercent":30.1,"free":40,"active":0,"inactive":0,"wired":0,"buffers":0,"cached":0,"writeback":0,"dirty":0,"writebacktmp":0,"shared":0,"slab":0,"pagetables":0,"swapcached":0,"commitlimit":0,"committedas":0,"hightotal":0,"highfree":0,"lowtotal":0,"lowfree":0,"swaptotal":0,"swapfree":0,"mapped":0,"vmalloctotal":0,"vmallocused":0,"vmallocchunk":0,"hugepagestotal":0,"hugepagesfree":0,"hugepagesize":0}` + e := `{"total":10,"available":20,"used":30,"usedPercent":30.1,"free":40,"active":0,"inactive":0,"wired":0,"laundry":0,"buffers":0,"cached":0,"writeback":0,"dirty":0,"writebacktmp":0,"shared":0,"slab":0,"pagetables":0,"swapcached":0,"commitlimit":0,"committedas":0,"hightotal":0,"highfree":0,"lowtotal":0,"lowfree":0,"swaptotal":0,"swapfree":0,"mapped":0,"vmalloctotal":0,"vmallocused":0,"vmallocchunk":0,"hugepagestotal":0,"hugepagesfree":0,"hugepagesize":0}` if e != fmt.Sprintf("%v", v) { t.Errorf("VirtualMemoryStat string is invalid: %v", v) }