cpu.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package node
  2. import (
  3. "io/ioutil"
  4. "path"
  5. "regexp"
  6. "strconv"
  7. "strings"
  8. )
  9. const CLOCKS_PER_SEC = float64(100)
  10. var (
  11. cpuCorePrefix = regexp.MustCompile(`cpu\d+`)
  12. )
  13. func cpuStat(procRoot string) (CpuStat, error) {
  14. stat := CpuStat{}
  15. data, err := ioutil.ReadFile(path.Join(procRoot, "stat"))
  16. if err != nil {
  17. return stat, err
  18. }
  19. for _, line := range strings.Split(string(data), "\n") {
  20. if strings.HasPrefix(line, "cpu ") {
  21. parts := strings.Fields(line)
  22. if stat.TotalUsage.User, err = strconv.ParseFloat(parts[1], 64); err != nil {
  23. return stat, err
  24. }
  25. if stat.TotalUsage.Nice, err = strconv.ParseFloat(parts[2], 64); err != nil {
  26. return stat, err
  27. }
  28. if stat.TotalUsage.System, err = strconv.ParseFloat(parts[3], 64); err != nil {
  29. return stat, err
  30. }
  31. if stat.TotalUsage.Idle, err = strconv.ParseFloat(parts[4], 64); err != nil {
  32. return stat, err
  33. }
  34. if stat.TotalUsage.IoWait, err = strconv.ParseFloat(parts[5], 64); err != nil {
  35. return stat, err
  36. }
  37. if stat.TotalUsage.Irq, err = strconv.ParseFloat(parts[6], 64); err != nil {
  38. return stat, err
  39. }
  40. if stat.TotalUsage.SoftIrq, err = strconv.ParseFloat(parts[7], 64); err != nil {
  41. return stat, err
  42. }
  43. if stat.TotalUsage.Steal, err = strconv.ParseFloat(parts[8], 64); err != nil {
  44. return stat, err
  45. }
  46. } else if cpuCorePrefix.MatchString(line) {
  47. stat.LogicalCores++
  48. }
  49. }
  50. stat.TotalUsage.User /= CLOCKS_PER_SEC
  51. stat.TotalUsage.Nice /= CLOCKS_PER_SEC
  52. stat.TotalUsage.System /= CLOCKS_PER_SEC
  53. stat.TotalUsage.Idle /= CLOCKS_PER_SEC
  54. stat.TotalUsage.IoWait /= CLOCKS_PER_SEC
  55. stat.TotalUsage.Irq /= CLOCKS_PER_SEC
  56. stat.TotalUsage.SoftIrq /= CLOCKS_PER_SEC
  57. stat.TotalUsage.Steal /= CLOCKS_PER_SEC
  58. return stat, nil
  59. }