staros/memory_unix.go

57 lines
1.2 KiB
Go
Raw Permalink Normal View History

//go:build linux
// +build linux
package staros
import (
"io/ioutil"
"strconv"
"strings"
"syscall"
)
// Memory 系统内存信息
2021-06-04 10:44:53 +08:00
func Memory() (MemStatus, error) {
var mem MemStatus
ram := new(syscall.Sysinfo_t)
if err := syscall.Sysinfo(ram); err != nil {
2021-06-04 10:44:53 +08:00
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)
2021-06-04 10:44:53 +08:00
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
}