From 47ed6aaebd83708af12247e8cd09c3903e13c5fc Mon Sep 17 00:00:00 2001 From: Minje Park Date: Wed, 13 Feb 2019 00:55:05 +0900 Subject: [PATCH] activefile and inactivefile fields were removed from VirtualMemoryStat --- mem/mem.go | 2 -- mem/mem_linux.go | 23 ++++++++++++++--------- mem/mem_test.go | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/mem/mem.go b/mem/mem.go index 47dbb13..995364f 100644 --- a/mem/mem.go +++ b/mem/mem.go @@ -50,8 +50,6 @@ type VirtualMemoryStat struct { // https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s2-proc-meminfo.html // https://www.kernel.org/doc/Documentation/filesystems/proc.txt // https://www.kernel.org/doc/Documentation/vm/overcommit-accounting - ActiveFile uint64 `json:"activefile"` - InactiveFile uint64 `json:"inactivefile"` Buffers uint64 `json:"buffers"` Cached uint64 `json:"cached"` Writeback uint64 `json:"writeback"` diff --git a/mem/mem_linux.go b/mem/mem_linux.go index 7e46abd..0fe6209 100644 --- a/mem/mem_linux.go +++ b/mem/mem_linux.go @@ -13,6 +13,11 @@ import ( "golang.org/x/sys/unix" ) +type VirtualMemoryExStat struct { + ActiveFile uint64 `json:"activefile"` + InactiveFile uint64 `json:"inactivefile"` +} + func VirtualMemory() (*VirtualMemoryStat, error) { return VirtualMemoryWithContext(context.Background()) } @@ -28,6 +33,8 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { sReclaimable := false // "SReclaimable:" not available: 2.6.19 / Nov 2006 ret := &VirtualMemoryStat{} + retEx := &VirtualMemoryExStat{} + for _, line := range lines { fields := strings.Split(line, ":") if len(fields) != 2 { @@ -54,17 +61,15 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { case "Cached": ret.Cached = t * 1024 case "Active": - activeFile = true ret.Active = t * 1024 case "Inactive": - inactiveFile = true ret.Inactive = t * 1024 case "Active(file)": activeFile = true - ret.ActiveFile = t * 1024 + retEx.ActiveFile = t * 1024 case "InActive(file)": inactiveFile = true - ret.InactiveFile = t * 1024 + retEx.InactiveFile = t * 1024 case "Writeback": ret.Writeback = t * 1024 case "WritebackTmp": @@ -118,10 +123,10 @@ func VirtualMemoryWithContext(ctx context.Context) (*VirtualMemoryStat, error) { ret.Cached += ret.SReclaimable if !memavail { - if !(activeFile && inactiveFile && sReclaimable) { - ret.Available = ret.Cached + ret.Free + if (activeFile && inactiveFile && sReclaimable) { + ret.Available = calcuateAvailVmem(ret, retEx) } else { - ret.Available = calcuateAvailVmem(ret) + ret.Available = ret.Cached + ret.Free } } @@ -180,7 +185,7 @@ func SwapMemoryWithContext(ctx context.Context) (*SwapMemoryStat, error) { // calcuateAvailVmem is a fallback under kernel 3.14 where /proc/meminfo does not provide // "MemAvailable:" column. It reimplements an algorithm from the link below // https://github.com/giampaolo/psutil/pull/890 -func calcuateAvailVmem(ret *VirtualMemoryStat) uint64 { +func calcuateAvailVmem(ret *VirtualMemoryStat, retEx *VirtualMemoryExStat) uint64 { var watermarkLow uint64 fn := common.HostProc("zoneinfo") @@ -209,7 +214,7 @@ func calcuateAvailVmem(ret *VirtualMemoryStat) uint64 { watermarkLow *= pagesize availMemory := ret.Free - watermarkLow - pageCache := ret.ActiveFile + ret.InactiveFile + pageCache := retEx.ActiveFile + retEx.InactiveFile pageCache -= uint64(math.Min(float64(pageCache/2), float64(watermarkLow))) availMemory += pageCache availMemory += ret.SReclaimable - uint64(math.Min(float64(ret.SReclaimable/2.0), float64(watermarkLow))) diff --git a/mem/mem_test.go b/mem/mem_test.go index fe3acfb..c0272aa 100644 --- a/mem/mem_test.go +++ b/mem/mem_test.go @@ -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,"laundry":0,"activefile":0,"inactivefile":0,"buffers":0,"cached":0,"writeback":0,"dirty":0,"writebacktmp":0,"shared":0,"slab":0,"sreclaimable":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,"sreclaimable":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}` fmt.Println(v) fmt.Println(e)