Carried: #14015
If kernel is compiled with CONFIG_FAIR_GROUP_SCHED disabled cpu.shares
doesn't exist.
If kernel is compiled with CONFIG_CFQ_GROUP_IOSCHED disabled blkio.weight
doesn't exist.
If kernel is compiled with CONFIG_CPUSETS disabled cpuset won't be
supported.
We need to handle these conditions by checking sysinfo and verifying them.
Signed-off-by: Zefan Li <lizefan@huawei.com>
Signed-off-by: Qiang Huang <h.huangqiang@huawei.com>
... | ... |
@@ -166,6 +166,11 @@ func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *runconfig.HostC |
166 | 166 |
return warnings, fmt.Errorf("Invalid value: %v, valid memory swappiness range is 0-100.", swappiness) |
167 | 167 |
} |
168 | 168 |
} |
169 |
+ if hostConfig.CPUShares > 0 && !daemon.SystemConfig().CPUShares { |
|
170 |
+ warnings = append(warnings, "Your kernel does not support CPU shares. Shares discarded.") |
|
171 |
+ logrus.Warnf("Your kernel does not support CPU shares. Shares discarded.") |
|
172 |
+ hostConfig.CPUShares = 0 |
|
173 |
+ } |
|
169 | 174 |
if hostConfig.CPUPeriod > 0 && !daemon.SystemConfig().CPUCfsPeriod { |
170 | 175 |
warnings = append(warnings, "Your kernel does not support CPU cfs period. Period discarded.") |
171 | 176 |
logrus.Warnf("Your kernel does not support CPU cfs period. Period discarded.") |
... | ... |
@@ -176,6 +181,17 @@ func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *runconfig.HostC |
176 | 176 |
logrus.Warnf("Your kernel does not support CPU cfs quota. Quota discarded.") |
177 | 177 |
hostConfig.CPUQuota = 0 |
178 | 178 |
} |
179 |
+ if (hostConfig.CpusetCpus != "" || hostConfig.CpusetMems != "") && !daemon.SystemConfig().Cpuset { |
|
180 |
+ warnings = append(warnings, "Your kernel does not support cpuset. Cpuset discarded.") |
|
181 |
+ logrus.Warnf("Your kernel does not support cpuset. Cpuset discarded.") |
|
182 |
+ hostConfig.CpusetCpus = "" |
|
183 |
+ hostConfig.CpusetMems = "" |
|
184 |
+ } |
|
185 |
+ if hostConfig.BlkioWeight > 0 && !daemon.SystemConfig().BlkioWeight { |
|
186 |
+ warnings = append(warnings, "Your kernel does not support Block I/O weight. Weight discarded.") |
|
187 |
+ logrus.Warnf("Your kernel does not support Block I/O weight. Weight discarded.") |
|
188 |
+ hostConfig.BlkioWeight = 0 |
|
189 |
+ } |
|
179 | 190 |
if hostConfig.BlkioWeight > 0 && (hostConfig.BlkioWeight < 10 || hostConfig.BlkioWeight > 1000) { |
180 | 191 |
return warnings, fmt.Errorf("Range of blkio weight is from 10 to 1000.") |
181 | 192 |
} |
... | ... |
@@ -8,6 +8,8 @@ type SysInfo struct { |
8 | 8 |
|
9 | 9 |
*cgroupMemInfo |
10 | 10 |
*cgroupCPUInfo |
11 |
+ *cgroupBlkioInfo |
|
12 |
+ *cgroupCpusetInfo |
|
11 | 13 |
|
12 | 14 |
// Whether IPv4 forwarding is supported or not, if this was disabled, networking will not work |
13 | 15 |
IPv4ForwardingDisabled bool |
... | ... |
@@ -37,9 +39,22 @@ type cgroupMemInfo struct { |
37 | 37 |
} |
38 | 38 |
|
39 | 39 |
type cgroupCPUInfo struct { |
40 |
+ // Whether CPU shares is supported or not |
|
41 |
+ CPUShares bool |
|
42 |
+ |
|
40 | 43 |
// Whether CPU CFS(Completely Fair Scheduler) period is supported or not |
41 | 44 |
CPUCfsPeriod bool |
42 | 45 |
|
43 | 46 |
// Whether CPU CFS(Completely Fair Scheduler) quota is supported or not |
44 | 47 |
CPUCfsQuota bool |
45 | 48 |
} |
49 |
+ |
|
50 |
+type cgroupBlkioInfo struct { |
|
51 |
+ // Whether Block IO weight is supported or not |
|
52 |
+ BlkioWeight bool |
|
53 |
+} |
|
54 |
+ |
|
55 |
+type cgroupCpusetInfo struct { |
|
56 |
+ // Whether Cpuset is supported or not |
|
57 |
+ Cpuset bool |
|
58 |
+} |
... | ... |
@@ -15,6 +15,8 @@ func New(quiet bool) *SysInfo { |
15 | 15 |
sysInfo := &SysInfo{} |
16 | 16 |
sysInfo.cgroupMemInfo = checkCgroupMem(quiet) |
17 | 17 |
sysInfo.cgroupCPUInfo = checkCgroupCPU(quiet) |
18 |
+ sysInfo.cgroupBlkioInfo = checkCgroupBlkioInfo(quiet) |
|
19 |
+ sysInfo.cgroupCpusetInfo = checkCgroupCpusetInfo(quiet) |
|
18 | 20 |
|
19 | 21 |
_, err := cgroups.FindCgroupMountpoint("devices") |
20 | 22 |
sysInfo.CgroupDevicesEnabled = err == nil |
... | ... |
@@ -68,6 +70,11 @@ func checkCgroupCPU(quiet bool) *cgroupCPUInfo { |
68 | 68 |
return info |
69 | 69 |
} |
70 | 70 |
|
71 |
+ info.CPUShares = cgroupEnabled(mountPoint, "cpu.shares") |
|
72 |
+ if !quiet && !info.CPUShares { |
|
73 |
+ logrus.Warn("Your kernel does not support cgroup cpu shares") |
|
74 |
+ } |
|
75 |
+ |
|
71 | 76 |
info.CPUCfsPeriod = cgroupEnabled(mountPoint, "cpu.cfs_period_us") |
72 | 77 |
if !quiet && !info.CPUCfsPeriod { |
73 | 78 |
logrus.Warn("Your kernel does not support cgroup cfs period") |
... | ... |
@@ -80,6 +87,37 @@ func checkCgroupCPU(quiet bool) *cgroupCPUInfo { |
80 | 80 |
return info |
81 | 81 |
} |
82 | 82 |
|
83 |
+func checkCgroupBlkioInfo(quiet bool) *cgroupBlkioInfo { |
|
84 |
+ info := &cgroupBlkioInfo{} |
|
85 |
+ mountPoint, err := cgroups.FindCgroupMountpoint("blkio") |
|
86 |
+ if err != nil { |
|
87 |
+ if !quiet { |
|
88 |
+ logrus.Warn(err) |
|
89 |
+ } |
|
90 |
+ return info |
|
91 |
+ } |
|
92 |
+ |
|
93 |
+ info.BlkioWeight = cgroupEnabled(mountPoint, "blkio.weight") |
|
94 |
+ if !quiet && !info.BlkioWeight { |
|
95 |
+ logrus.Warn("Your kernel does not support cgroup blkio weight") |
|
96 |
+ } |
|
97 |
+ return info |
|
98 |
+} |
|
99 |
+ |
|
100 |
+func checkCgroupCpusetInfo(quiet bool) *cgroupCpusetInfo { |
|
101 |
+ info := &cgroupCpusetInfo{} |
|
102 |
+ _, err := cgroups.FindCgroupMountpoint("cpuset") |
|
103 |
+ if err != nil { |
|
104 |
+ if !quiet { |
|
105 |
+ logrus.Warn(err) |
|
106 |
+ } |
|
107 |
+ return info |
|
108 |
+ } |
|
109 |
+ |
|
110 |
+ info.Cpuset = true |
|
111 |
+ return info |
|
112 |
+} |
|
113 |
+ |
|
83 | 114 |
func cgroupEnabled(mountPoint, name string) bool { |
84 | 115 |
_, err := os.Stat(path.Join(mountPoint, name)) |
85 | 116 |
return err == nil |