Skip to content

Commit 51db93c

Browse files
committed
Use pod level hugepage limits for cgroup when unset in container
1 parent e3f4c6e commit 51db93c

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

pkg/kubelet/kuberuntime/kuberuntime_container_linux.go

+32-16
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func (m *kubeGenericRuntimeManager) generateLinuxContainerResources(pod *v1.Pod,
143143
lcr.OomScoreAdj = int64(qos.GetContainerOOMScoreAdjust(pod, container,
144144
int64(m.machineInfo.MemoryCapacity)))
145145

146-
lcr.HugepageLimits = GetHugepageLimitsFromResources(container.Resources)
146+
lcr.HugepageLimits = GetHugepageLimitsFromResources(pod, container.Resources)
147147

148148
// Configure swap for the container
149149
m.configureContainerSwapResources(lcr, pod, container)
@@ -300,7 +300,7 @@ func (m *kubeGenericRuntimeManager) calculateLinuxResources(cpuRequest, cpuLimit
300300
}
301301

302302
// GetHugepageLimitsFromResources returns limits of each hugepages from resources.
303-
func GetHugepageLimitsFromResources(resources v1.ResourceRequirements) []*runtimeapi.HugepageLimit {
303+
func GetHugepageLimitsFromResources(pod *v1.Pod, resources v1.ResourceRequirements) []*runtimeapi.HugepageLimit {
304304
var hugepageLimits []*runtimeapi.HugepageLimit
305305

306306
// For each page size, limit to 0.
@@ -312,23 +312,20 @@ func GetHugepageLimitsFromResources(resources v1.ResourceRequirements) []*runtim
312312
}
313313

314314
requiredHugepageLimits := map[string]uint64{}
315-
for resourceObj, amountObj := range resources.Limits {
316-
if !v1helper.IsHugePageResourceName(resourceObj) {
317-
continue
318-
}
319315

320-
pageSize, err := v1helper.HugePageSizeFromResourceName(resourceObj)
321-
if err != nil {
322-
klog.InfoS("Failed to get hugepage size from resource", "object", resourceObj, "err", err)
323-
continue
316+
// When hugepage limits are specified at pod level, the container limit will
317+
// match the pod level limit, however if the container also specifies,
318+
// its limit will have precedence over the pod level limit
319+
if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.PodLevelResources) && resourcehelper.IsPodLevelResourcesSet(pod) {
320+
for limitName, limitAmount := range pod.Spec.Resources.Limits {
321+
readAndDefineRequiredHugepageLimit(requiredHugepageLimits, limitName, limitAmount)
324322
}
323+
}
325324

326-
sizeString, err := v1helper.HugePageUnitSizeFromByteSize(pageSize.Value())
327-
if err != nil {
328-
klog.InfoS("Size is invalid", "object", resourceObj, "err", err)
329-
continue
330-
}
331-
requiredHugepageLimits[sizeString] = uint64(amountObj.Value())
325+
// If the container and the pod specify, the container will have precedence,
326+
// overriding the pod level limit
327+
for resourceObj, amountObj := range resources.Limits {
328+
readAndDefineRequiredHugepageLimit(requiredHugepageLimits, resourceObj, amountObj)
332329
}
333330

334331
for _, hugepageLimit := range hugepageLimits {
@@ -340,6 +337,25 @@ func GetHugepageLimitsFromResources(resources v1.ResourceRequirements) []*runtim
340337
return hugepageLimits
341338
}
342339

340+
func readAndDefineRequiredHugepageLimit(requiredHugepageLimits map[string]uint64, resourceObj v1.ResourceName, amountObj resource.Quantity) {
341+
if !v1helper.IsHugePageResourceName(resourceObj) {
342+
return
343+
}
344+
345+
pageSize, err := v1helper.HugePageSizeFromResourceName(resourceObj)
346+
if err != nil {
347+
klog.InfoS("Failed to get hugepage size from resource", "object", resourceObj, "err", err)
348+
return
349+
}
350+
351+
sizeString, err := v1helper.HugePageUnitSizeFromByteSize(pageSize.Value())
352+
if err != nil {
353+
klog.InfoS("Size is invalid", "object", resourceObj, "err", err)
354+
return
355+
}
356+
requiredHugepageLimits[sizeString] = uint64(amountObj.Value())
357+
}
358+
343359
func toKubeContainerResources(statusResources *runtimeapi.ContainerResources) *kubecontainer.ContainerResources {
344360
var cStatusResources *kubecontainer.ContainerResources
345361
runtimeStatusResources := statusResources.GetLinux()

0 commit comments

Comments
 (0)