memory.go 831 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package node
  2. import (
  3. "io/ioutil"
  4. "k8s.io/klog/v2"
  5. "path"
  6. "strconv"
  7. "strings"
  8. )
  9. func memoryInfo(procRoot string) (MemoryStat, error) {
  10. mem := MemoryStat{}
  11. data, err := ioutil.ReadFile(path.Join(procRoot, "meminfo"))
  12. if err != nil {
  13. return mem, err
  14. }
  15. for _, line := range strings.Split(string(data), "\n") {
  16. parts := strings.Fields(line)
  17. if len(parts) < 2 {
  18. continue
  19. }
  20. mul := float64(1)
  21. if len(parts) == 3 && parts[2] == "kB" {
  22. mul = 1000
  23. }
  24. v, err := strconv.ParseFloat(parts[1], 64)
  25. if err != nil {
  26. klog.Warningln("broken meminfo line:", line)
  27. }
  28. switch parts[0] {
  29. case "MemTotal:":
  30. mem.TotalBytes = v * mul
  31. case "MemFree:":
  32. mem.FreeBytes = v * mul
  33. case "MemAvailable:":
  34. mem.AvailableBytes = v * mul
  35. case "Cached:":
  36. mem.CachedBytes = v * mul
  37. }
  38. }
  39. return mem, nil
  40. }