cgroup2_linux.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package sysinfo // import "github.com/docker/docker/pkg/sysinfo"
  2. import (
  3. "io/ioutil"
  4. "path"
  5. "strings"
  6. cgroupsV2 "github.com/containerd/cgroups/v2"
  7. rsystem "github.com/opencontainers/runc/libcontainer/system"
  8. "github.com/sirupsen/logrus"
  9. )
  10. type infoCollectorV2 func(info *SysInfo, controllers map[string]struct{}, dirPath string) (warnings []string)
  11. func newV2(quiet bool, opts *opts) *SysInfo {
  12. var warnings []string
  13. sysInfo := &SysInfo{
  14. CgroupUnified: true,
  15. }
  16. g := opts.cg2GroupPath
  17. if g == "" {
  18. g = "/"
  19. }
  20. m, err := cgroupsV2.LoadManager("/sys/fs/cgroup", g)
  21. if err != nil {
  22. logrus.Warn(err)
  23. } else {
  24. controllersM := make(map[string]struct{})
  25. controllers, err := m.Controllers()
  26. if err != nil {
  27. logrus.Warn(err)
  28. }
  29. for _, c := range controllers {
  30. controllersM[c] = struct{}{}
  31. }
  32. opsV2 := []infoCollectorV2{
  33. applyMemoryCgroupInfoV2,
  34. applyCPUCgroupInfoV2,
  35. applyIOCgroupInfoV2,
  36. applyCPUSetCgroupInfoV2,
  37. applyPIDSCgroupInfoV2,
  38. applyDevicesCgroupInfoV2,
  39. }
  40. dirPath := path.Join("/sys/fs/cgroup", path.Clean(g))
  41. for _, o := range opsV2 {
  42. w := o(sysInfo, controllersM, dirPath)
  43. warnings = append(warnings, w...)
  44. }
  45. }
  46. ops := []infoCollector{
  47. applyNetworkingInfo,
  48. applyAppArmorInfo,
  49. applySeccompInfo,
  50. applyCgroupNsInfo,
  51. }
  52. for _, o := range ops {
  53. w := o(sysInfo, nil)
  54. warnings = append(warnings, w...)
  55. }
  56. if !quiet {
  57. for _, w := range warnings {
  58. logrus.Warn(w)
  59. }
  60. }
  61. return sysInfo
  62. }
  63. func applyMemoryCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
  64. var warnings []string
  65. if _, ok := controllers["memory"]; !ok {
  66. warnings = append(warnings, "Unable to find memory controller")
  67. return warnings
  68. }
  69. info.MemoryLimit = true
  70. info.SwapLimit = true
  71. info.MemoryReservation = true
  72. info.OomKillDisable = false
  73. info.MemorySwappiness = false
  74. info.KernelMemory = false
  75. info.KernelMemoryTCP = false
  76. return warnings
  77. }
  78. func applyCPUCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
  79. var warnings []string
  80. if _, ok := controllers["cpu"]; !ok {
  81. warnings = append(warnings, "Unable to find cpu controller")
  82. return warnings
  83. }
  84. info.CPUShares = true
  85. info.CPUCfsPeriod = true
  86. info.CPUCfsQuota = true
  87. info.CPURealtimePeriod = false
  88. info.CPURealtimeRuntime = false
  89. return warnings
  90. }
  91. func applyIOCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
  92. var warnings []string
  93. if _, ok := controllers["io"]; !ok {
  94. warnings = append(warnings, "Unable to find io controller")
  95. return warnings
  96. }
  97. info.BlkioWeight = true
  98. info.BlkioWeightDevice = true
  99. info.BlkioReadBpsDevice = true
  100. info.BlkioWriteBpsDevice = true
  101. info.BlkioReadIOpsDevice = true
  102. info.BlkioWriteIOpsDevice = true
  103. return warnings
  104. }
  105. func applyCPUSetCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, dirPath string) []string {
  106. var warnings []string
  107. if _, ok := controllers["cpuset"]; !ok {
  108. warnings = append(warnings, "Unable to find cpuset controller")
  109. return warnings
  110. }
  111. info.Cpuset = true
  112. cpus, err := ioutil.ReadFile(path.Join(dirPath, "cpuset.cpus.effective"))
  113. if err != nil {
  114. return warnings
  115. }
  116. info.Cpus = strings.TrimSpace(string(cpus))
  117. mems, err := ioutil.ReadFile(path.Join(dirPath, "cpuset.mems.effective"))
  118. if err != nil {
  119. return warnings
  120. }
  121. info.Mems = strings.TrimSpace(string(mems))
  122. return warnings
  123. }
  124. func applyPIDSCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
  125. var warnings []string
  126. if _, ok := controllers["pids"]; !ok {
  127. warnings = append(warnings, "Unable to find pids controller")
  128. return warnings
  129. }
  130. info.PidsLimit = true
  131. return warnings
  132. }
  133. func applyDevicesCgroupInfoV2(info *SysInfo, controllers map[string]struct{}, _ string) []string {
  134. info.CgroupDevicesEnabled = !rsystem.RunningInUserNS()
  135. return nil
  136. }