in providers/linux/memory_linux.go [26:72]
func parseMemInfo(content []byte) (*types.HostMemoryInfo, error) {
memInfo := &types.HostMemoryInfo{
Metrics: map[string]uint64{},
}
hasAvailable := false
err := parseKeyValue(content, ':', func(key, value []byte) error {
num, err := parseBytesOrNumber(value)
if err != nil {
return fmt.Errorf("failed to parse %v value of %v: %w", string(key), string(value), err)
}
k := string(key)
switch k {
case "MemTotal":
memInfo.Total = num
case "MemAvailable":
hasAvailable = true
memInfo.Available = num
case "MemFree":
memInfo.Free = num
case "SwapTotal":
memInfo.VirtualTotal = num
case "SwapFree":
memInfo.VirtualFree = num
default:
memInfo.Metrics[k] = num
}
return nil
})
if err != nil {
return nil, err
}
memInfo.Used = memInfo.Total - memInfo.Free
memInfo.VirtualUsed = memInfo.VirtualTotal - memInfo.VirtualFree
// MemAvailable was added in kernel 3.14.
if !hasAvailable {
// Linux uses this for the calculation (but we are using a simpler calculation).
// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
memInfo.Available = memInfo.Free + memInfo.Metrics["Buffers"] + memInfo.Metrics["Cached"]
}
return memInfo, nil
}