blkio.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package cgroup
  2. import (
  3. "io/ioutil"
  4. "k8s.io/klog/v2"
  5. "path"
  6. "strconv"
  7. "strings"
  8. )
  9. type BlkioStat struct {
  10. ReadOps uint64
  11. WriteOps uint64
  12. ReadBytes uint64
  13. WrittenBytes uint64
  14. }
  15. func (cg *Cgroup) BlkioStat() (map[string]BlkioStat, error) {
  16. ops, err := readBlkioStatFile(path.Join(cgRoot, "blkio", cg.subsystems["blkio"], "blkio.throttle.io_serviced"))
  17. if err != nil {
  18. return nil, err
  19. }
  20. bytes, err := readBlkioStatFile(path.Join(cgRoot, "blkio", cg.subsystems["blkio"], "blkio.throttle.io_service_bytes"))
  21. if err != nil {
  22. return nil, err
  23. }
  24. res := map[string]BlkioStat{}
  25. for _, v := range ops {
  26. stat := res[v.majorMinor]
  27. switch v.name {
  28. case "Read":
  29. stat.ReadOps = v.value
  30. case "Write":
  31. stat.WriteOps = v.value
  32. }
  33. res[v.majorMinor] = stat
  34. }
  35. for _, v := range bytes {
  36. stat := res[v.majorMinor]
  37. switch v.name {
  38. case "Read":
  39. stat.ReadBytes = v.value
  40. case "Write":
  41. stat.WrittenBytes = v.value
  42. }
  43. res[v.majorMinor] = stat
  44. }
  45. return res, nil
  46. }
  47. type blkioVariable struct {
  48. majorMinor string
  49. name string
  50. value uint64
  51. }
  52. func readBlkioStatFile(filePath string) ([]blkioVariable, error) {
  53. data, err := ioutil.ReadFile(filePath)
  54. if err != nil {
  55. return nil, err
  56. }
  57. var res []blkioVariable
  58. for _, line := range strings.Split(string(data), "\n") {
  59. parts := strings.Fields(line)
  60. if len(parts) != 3 {
  61. continue
  62. }
  63. v, err := strconv.ParseUint(parts[2], 10, 64)
  64. if err != nil {
  65. klog.Warningf(`failed to parse blkio stat line "%s": %s`, line, err)
  66. continue
  67. }
  68. res = append(res, blkioVariable{
  69. majorMinor: parts[0],
  70. name: parts[1],
  71. value: v,
  72. })
  73. }
  74. return res, nil
  75. }