From 2d7715e3ba0986a00f8c95e4468a7782c03238db Mon Sep 17 00:00:00 2001 From: Herbert Date: Thu, 7 Mar 2024 10:11:02 +0800 Subject: [PATCH] koordlet: fix bug that cpu eviction does not take effect (#1932) Signed-off-by: Wang Xiaoqiang --- pkg/koordlet/util/node.go | 22 +++++++++++----- pkg/koordlet/util/node_test.go | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/pkg/koordlet/util/node.go b/pkg/koordlet/util/node.go index f40e38cc2..a2b3678a8 100644 --- a/pkg/koordlet/util/node.go +++ b/pkg/koordlet/util/node.go @@ -50,15 +50,23 @@ func GetBECgroupCurCPUSet() ([]int32, error) { if err != nil { return nil, err } - if len(containerPaths) != 0 { - targetCgroupDir = containerPaths[0] - } + containerPaths = append(containerPaths, targetCgroupDir) - cpus, err := resourceexecutor.NewCgroupReader().ReadCPUSet(targetCgroupDir) - if err != nil { - return nil, err + // find the minimal length of container's cpuset to avoid the interference of sandbox's cpuset + // since the cpuset's value of sandbox could always be set to all cpu ids of the machine by kubelet + var targetCpus []int32 + for _, path := range containerPaths { + cpuStr, err := resourceexecutor.NewCgroupReader().ReadCPUSet(path) + if err != nil { + return nil, err + } + curCpus := cpuset.ParseCPUSet(cpuStr) + if targetCpus == nil || len(curCpus) < len(targetCpus) { + targetCpus = curCpus + } } - return cpuset.ParseCPUSet(cpus), nil + + return targetCpus, nil } // GetBECPUSetPathsByMaxDepth gets all the be cpuset groups' paths recursively from upper to lower diff --git a/pkg/koordlet/util/node_test.go b/pkg/koordlet/util/node_test.go index 4c1003318..dd00d3772 100644 --- a/pkg/koordlet/util/node_test.go +++ b/pkg/koordlet/util/node_test.go @@ -269,3 +269,50 @@ func TestGetCgroupPathsByTargetDepth(t *testing.T) { }) } } + +func TestGetBECgroupCurCPUSet(t *testing.T) { + type fields struct { + prepareFn func(helper *system.FileTestUtil) + } + tests := []struct { + name string + fields fields + want []int32 + wantErr bool + }{ + { + name: "get the cpuset value of be containers fail", + wantErr: true, + }, + { + name: "get the cpuset value of be containers successcully", + fields: fields{ + prepareFn: func(helper *system.FileTestUtil) { + helper.SetCgroupsV2(false) + cpuset, _ := system.GetCgroupResource(system.CPUSetCPUSName) + qosCgroupDir := GetPodQoSRelativePath(corev1.PodQOSBestEffort) + helper.WriteCgroupFileContents(qosCgroupDir, cpuset, "0-63") + containerCgroupDir := filepath.Join(qosCgroupDir, "/kubepods-test-besteffort-pod-0.slice/cri-containerd-xxx.scope") + sandboxCgroupDir := filepath.Join(qosCgroupDir, "/kubepods-test-besteffort-pod-0.slice/cri-containerd-yyy.scope") + helper.WriteCgroupFileContents(containerCgroupDir, cpuset, "0-63") + helper.WriteCgroupFileContents(sandboxCgroupDir, cpuset, "0-1") + }, + }, + wantErr: false, + want: []int32{0, 1}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + helper := system.NewFileTestUtil(t) + defer helper.Cleanup() + if tt.fields.prepareFn != nil { + tt.fields.prepareFn(helper) + } + + got, gotErr := GetBECgroupCurCPUSet() + assert.Equal(t, tt.wantErr, gotErr != nil, gotErr) + assert.Equal(t, tt.want, got) + }) + } +}