//go:build linux // +build linux package staros import ( "io/ioutil" "strconv" "strings" "syscall" ) // Memory 系统内存信息 func Memory() (MemStatus, error) { var mem MemStatus ram := new(syscall.Sysinfo_t) if err := syscall.Sysinfo(ram); err != nil { return mem, err } unit := uint64(ram.Unit) if unit == 0 { unit = 1 } mem.All = uint64(ram.Totalram) * unit mem.BuffCache = uint64(ram.Bufferram) * unit mem.Free = uint64(ram.Freeram) * unit mem.Shared = uint64(ram.Sharedram) * unit mem.Available = mem.Free + mem.Shared + mem.BuffCache if available, ok := linuxMemAvailable(); ok { mem.Available = available } mem.SwapAll = uint64(ram.Totalswap) * unit mem.SwapFree = uint64(ram.Freeswap) * unit mem.SwapUsed = uint64(mem.SwapAll - mem.SwapFree) mem.Used = uint64(mem.All - mem.Free) return mem, nil } func linuxMemAvailable() (uint64, bool) { data, err := ioutil.ReadFile("/proc/meminfo") if err != nil { return 0, false } for _, line := range strings.Split(string(data), "\n") { fields := strings.Fields(line) if len(fields) < 2 || fields[0] != "MemAvailable:" { continue } value, err := strconv.ParseUint(fields[1], 10, 64) if err != nil { return 0, false } return value * 1024, true } return 0, false }