2026-06-09 18:10:19 +08:00
|
|
|
//go:build linux
|
|
|
|
|
// +build linux
|
2020-08-21 11:17:48 +08:00
|
|
|
|
|
|
|
|
package staros
|
|
|
|
|
|
2026-06-09 18:10:19 +08:00
|
|
|
import (
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
|
|
|
|
"syscall"
|
|
|
|
|
)
|
2020-08-21 11:17:48 +08:00
|
|
|
|
|
|
|
|
// Memory 系统内存信息
|
2021-06-04 10:44:53 +08:00
|
|
|
func Memory() (MemStatus, error) {
|
2020-08-21 11:17:48 +08:00
|
|
|
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
|
2020-08-21 11:17:48 +08:00
|
|
|
}
|
2026-06-09 18:10:19 +08:00
|
|
|
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
|
2020-08-21 11:17:48 +08:00
|
|
|
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
|
2020-08-21 11:17:48 +08:00
|
|
|
}
|
2026-06-09 18:10:19 +08:00
|
|
|
|
|
|
|
|
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
|
|
|
|
|
}
|