diff --git a/pkg/kubelet/cm/memorymanager/policy_static.go b/pkg/kubelet/cm/memorymanager/policy_static.go index 130b62ab637..ecfbe0c206c 100644 --- a/pkg/kubelet/cm/memorymanager/policy_static.go +++ b/pkg/kubelet/cm/memorymanager/policy_static.go @@ -18,7 +18,6 @@ package memorymanager import ( "fmt" - "reflect" "sort" cadvisorapi "github.com/google/cadvisor/info/v1" @@ -682,10 +681,37 @@ func areMachineStatesEqual(ms1, ms2 state.NUMANodeMap) bool { return false } - if !reflect.DeepEqual(*memoryState1, *memoryState2) { + if memoryState1.TotalMemSize != memoryState2.TotalMemSize { klog.ErrorS(nil, "Memory states for the NUMA node and resource are different", "node", nodeID, "resource", resourceName, "memoryState1", *memoryState1, "memoryState2", *memoryState2) return false } + + if memoryState1.SystemReserved != memoryState2.SystemReserved { + klog.ErrorS(nil, "Memory states for the NUMA node and resource are different", "node", nodeID, "resource", resourceName, "memoryState1", *memoryState1, "memoryState2", *memoryState2) + return false + } + + if memoryState1.Allocatable != memoryState2.Allocatable { + klog.ErrorS(nil, "Memory states for the NUMA node and resource are different", "node", nodeID, "resource", resourceName, "memoryState1", *memoryState1, "memoryState2", *memoryState2) + return false + } + + totalFree1 := uint64(0) + totalReserved1 := uint64(0) + totalFree2 := uint64(0) + totalReserved2 := uint64(0) + for _, nodeId := range nodeState1.Cells { + totalFree1 += ms1[nodeId].MemoryMap[resourceName].Free + totalReserved1 += ms1[nodeId].MemoryMap[resourceName].Reserved + totalFree2 += ms2[nodeId].MemoryMap[resourceName].Free + totalReserved2 += ms2[nodeId].MemoryMap[resourceName].Reserved + } + + if totalFree1 != totalFree2 || totalReserved1 != totalReserved2 { + klog.ErrorS(nil, "Memory states for the NUMA node and resource are different", "node", nodeID, "resource", resourceName, "memoryState1", *memoryState1, "memoryState2", *memoryState2) + return false + } + } } return true diff --git a/pkg/kubelet/cm/memorymanager/policy_static_test.go b/pkg/kubelet/cm/memorymanager/policy_static_test.go index 7b105591580..9a6c3f5575d 100644 --- a/pkg/kubelet/cm/memorymanager/policy_static_test.go +++ b/pkg/kubelet/cm/memorymanager/policy_static_test.go @@ -1024,6 +1024,125 @@ func TestStaticPolicyStart(t *testing.T) { }, }, }, + { + description: "shoud equal", + expectedAssignments: state.ContainerMemoryAssignments{ + "pod1": map[string][]state.Block{ + "container1": { + { + NUMAAffinity: []int{0, 1}, + Type: v1.ResourceMemory, + Size: 240 * mb, + }, + }, + }, + "pod2": map[string][]state.Block{ + "container2": { + { + NUMAAffinity: []int{0, 1}, + Type: v1.ResourceMemory, + Size: 10 * mb, + }, + }, + }, + }, + assignments: state.ContainerMemoryAssignments{ + "pod1": map[string][]state.Block{ + "container1": { + { + NUMAAffinity: []int{0, 1}, + Type: v1.ResourceMemory, + Size: 240 * mb, + }, + }, + }, + "pod2": map[string][]state.Block{ + "container2": { + { + NUMAAffinity: []int{0, 1}, + Type: v1.ResourceMemory, + Size: 10 * mb, + }, + }, + }, + }, + expectedMachineState: state.NUMANodeMap{ + 0: &state.NUMANodeState{ + MemoryMap: map[v1.ResourceName]*state.MemoryTable{ + v1.ResourceMemory: { + Allocatable: 220 * mb, + Free: 30 * mb, + Reserved: 190 * mb, + SystemReserved: 20 * mb, + TotalMemSize: 240 * mb, + }, + }, + Cells: []int{0, 1}, + NumberOfAssignments: 2, + }, + 1: &state.NUMANodeState{ + MemoryMap: map[v1.ResourceName]*state.MemoryTable{ + v1.ResourceMemory: { + Allocatable: 220 * mb, + Free: 160 * mb, + Reserved: 60 * mb, + SystemReserved: 20 * mb, + TotalMemSize: 240 * mb, + }, + }, + Cells: []int{0, 1}, + NumberOfAssignments: 2, + }, + }, + machineState: state.NUMANodeMap{ + 0: &state.NUMANodeState{ + MemoryMap: map[v1.ResourceName]*state.MemoryTable{ + v1.ResourceMemory: { + Allocatable: 220 * mb, + Free: 10 * mb, + Reserved: 210 * mb, + SystemReserved: 20 * mb, + TotalMemSize: 240 * mb, + }, + }, + Cells: []int{0, 1}, + NumberOfAssignments: 2, + }, + 1: &state.NUMANodeState{ + MemoryMap: map[v1.ResourceName]*state.MemoryTable{ + v1.ResourceMemory: { + Allocatable: 220 * mb, + Free: 180 * mb, + Reserved: 40 * mb, + SystemReserved: 20 * mb, + TotalMemSize: 240 * mb, + }, + }, + Cells: []int{0, 1}, + NumberOfAssignments: 2, + }, + }, + systemReserved: systemReservedMemory{ + 0: map[v1.ResourceName]uint64{ + v1.ResourceMemory: 20 * mb, + }, + 1: map[v1.ResourceName]uint64{ + v1.ResourceMemory: 20 * mb, + }, + }, + machineInfo: &cadvisorapi.MachineInfo{ + Topology: []cadvisorapi.Node{ + { + Id: 0, + Memory: 240 * mb, + }, + { + Id: 1, + Memory: 240 * mb, + }, + }, + }, + }, } for _, testCase := range testCases {