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