func LoadAvg() (*LoadAvgStat, error) { values, err := common.DoSysctrl("vm.loadavg") if err != nil { return nil, err } load1, err := strconv.ParseFloat(values[0], 64) if err != nil { return nil, err } load5, err := strconv.ParseFloat(values[1], 64) if err != nil { return nil, err } load15, err := strconv.ParseFloat(values[2], 64) if err != nil { return nil, err } ret := &LoadAvgStat{ Load1: float64(load1), Load5: float64(load5), Load15: float64(load15), } return ret, nil }
// VirtualMemory returns VirtualmemoryStat. func VirtualMemory() (*VirtualMemoryStat, error) { p, err := getPageSize() if err != nil { return nil, err } total, err := common.DoSysctrl("hw.memsize") if err != nil { return nil, err } free, err := common.DoSysctrl("vm.page_free_count") if err != nil { return nil, err } parsed := make([]uint64, 0, 7) vv := []string{ total[0], free[0], } for _, target := range vv { t, err := strconv.ParseUint(target, 10, 64) if err != nil { return nil, err } parsed = append(parsed, t) } ret := &VirtualMemoryStat{ Total: parsed[0], Free: parsed[1] * p, } // TODO: platform independent (worked freebsd?) ret.Available = ret.Free + ret.Buffers + ret.Cached ret.Used = ret.Total - ret.Free ret.UsedPercent = float64(ret.Total-ret.Available) / float64(ret.Total) * 100.0 return ret, nil }
// SwapMemory returns swapinfo. func SwapMemory() (*SwapMemoryStat, error) { var ret *SwapMemoryStat swapUsage, err := common.DoSysctrl("vm.swapusage") if err != nil { return ret, err } total := strings.Replace(swapUsage[2], "M", "", 1) used := strings.Replace(swapUsage[5], "M", "", 1) free := strings.Replace(swapUsage[8], "M", "", 1) total_v, err := strconv.ParseFloat(total, 64) if err != nil { return nil, err } used_v, err := strconv.ParseFloat(used, 64) if err != nil { return nil, err } free_v, err := strconv.ParseFloat(free, 64) if err != nil { return nil, err } u := float64(0) if total_v != 0 { u = ((total_v - free_v) / total_v) * 100.0 } // vm.swapusage shows "M", multiply 1000 ret = &SwapMemoryStat{ Total: uint64(total_v * 1000), Used: uint64(used_v * 1000), Free: uint64(free_v * 1000), UsedPercent: u, } return ret, nil }
func VirtualMemory() (*VirtualMemoryStat, error) { pageSize, err := common.DoSysctrl("vm.stats.vm.v_page_size") if err != nil { return nil, err } p, err := strconv.ParseUint(pageSize[0], 10, 64) if err != nil { return nil, err } pageCount, err := common.DoSysctrl("vm.stats.vm.v_page_count") if err != nil { return nil, err } free, err := common.DoSysctrl("vm.stats.vm.v_free_count") if err != nil { return nil, err } active, err := common.DoSysctrl("vm.stats.vm.v_active_count") if err != nil { return nil, err } inactive, err := common.DoSysctrl("vm.stats.vm.v_inactive_count") if err != nil { return nil, err } cache, err := common.DoSysctrl("vm.stats.vm.v_cache_count") if err != nil { return nil, err } buffer, err := common.DoSysctrl("vfs.bufspace") if err != nil { return nil, err } wired, err := common.DoSysctrl("vm.stats.vm.v_wire_count") if err != nil { return nil, err } parsed := make([]uint64, 0, 7) vv := []string{ pageCount[0], free[0], active[0], inactive[0], cache[0], buffer[0], wired[0], } for _, target := range vv { t, err := strconv.ParseUint(target, 10, 64) if err != nil { return nil, err } parsed = append(parsed, t) } ret := &VirtualMemoryStat{ Total: parsed[0] * p, Free: parsed[1] * p, Active: parsed[2] * p, Inactive: parsed[3] * p, Cached: parsed[4] * p, Buffers: parsed[5], Wired: parsed[6] * p, } // TODO: platform independent (worked freebsd?) ret.Available = ret.Free + ret.Buffers + ret.Cached ret.Used = ret.Total - ret.Free ret.UsedPercent = float64(ret.Total-ret.Available) / float64(ret.Total) * 100.0 return ret, nil }