Merge pull request #81951 from klueska/upstream-update-cpu-amanger-numa-mapping

Update the CPUManager to include NUMANodeID in its topology information
This commit is contained in:
Kubernetes Prow Robot 2019-08-28 08:55:40 -07:00 committed by GitHub
commit 35867b160a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 750 additions and 598 deletions

View File

@ -69,6 +69,7 @@ go_library(
"//pkg/apis/core/v1/helper:go_default_library", "//pkg/apis/core/v1/helper:go_default_library",
"//pkg/apis/core/v1/helper/qos:go_default_library", "//pkg/apis/core/v1/helper/qos:go_default_library",
"//pkg/kubelet/cadvisor:go_default_library", "//pkg/kubelet/cadvisor:go_default_library",
"//pkg/kubelet/cm/cpumanager/topology:go_default_library",
"//pkg/kubelet/cm/devicemanager:go_default_library", "//pkg/kubelet/cm/devicemanager:go_default_library",
"//pkg/kubelet/cm/util:go_default_library", "//pkg/kubelet/cm/util:go_default_library",
"//pkg/kubelet/events:go_default_library", "//pkg/kubelet/events:go_default_library",

View File

@ -47,6 +47,7 @@ import (
podresourcesapi "k8s.io/kubernetes/pkg/kubelet/apis/podresources/v1alpha1" podresourcesapi "k8s.io/kubernetes/pkg/kubelet/apis/podresources/v1alpha1"
"k8s.io/kubernetes/pkg/kubelet/cadvisor" "k8s.io/kubernetes/pkg/kubelet/cadvisor"
"k8s.io/kubernetes/pkg/kubelet/cm/cpumanager" "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager"
cputopology "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology"
"k8s.io/kubernetes/pkg/kubelet/cm/devicemanager" "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager"
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
cmutil "k8s.io/kubernetes/pkg/kubelet/cm/util" cmutil "k8s.io/kubernetes/pkg/kubelet/cm/util"
@ -226,6 +227,13 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Correct NUMA information is currently missing from cadvisor's
// MachineInfo struct, so we use the CPUManager's internal logic for
// gathering NUMANodeInfo to pass to components that care about it.
numaNodeInfo, err := cputopology.GetNUMANodeInfo()
if err != nil {
return nil, err
}
capacity := cadvisor.CapacityFromMachineInfo(machineInfo) capacity := cadvisor.CapacityFromMachineInfo(machineInfo)
for k, v := range capacity { for k, v := range capacity {
internalCapacity[k] = v internalCapacity[k] = v
@ -309,6 +317,7 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I
nodeConfig.ExperimentalCPUManagerPolicy, nodeConfig.ExperimentalCPUManagerPolicy,
nodeConfig.ExperimentalCPUManagerReconcilePeriod, nodeConfig.ExperimentalCPUManagerReconcilePeriod,
machineInfo, machineInfo,
numaNodeInfo,
cm.GetNodeAllocatableReservation(), cm.GetNodeAllocatableReservation(),
nodeConfig.KubeletRootDir, nodeConfig.KubeletRootDir,
cm.topologyManager, cm.topologyManager,

View File

@ -94,7 +94,7 @@ type manager struct {
// and the containerID of their containers // and the containerID of their containers
podStatusProvider status.PodStatusProvider podStatusProvider status.PodStatusProvider
machineInfo *cadvisorapi.MachineInfo topology *topology.CPUTopology
nodeAllocatableReservation v1.ResourceList nodeAllocatableReservation v1.ResourceList
} }
@ -102,7 +102,8 @@ type manager struct {
var _ Manager = &manager{} var _ Manager = &manager{}
// NewManager creates new cpu manager based on provided policy // NewManager creates new cpu manager based on provided policy
func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo *cadvisorapi.MachineInfo, nodeAllocatableReservation v1.ResourceList, stateFileDirectory string, affinity topologymanager.Store) (Manager, error) { func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo *cadvisorapi.MachineInfo, numaNodeInfo topology.NUMANodeInfo, nodeAllocatableReservation v1.ResourceList, stateFileDirectory string, affinity topologymanager.Store) (Manager, error) {
var topo *topology.CPUTopology
var policy Policy var policy Policy
switch policyName(cpuPolicyName) { switch policyName(cpuPolicyName) {
@ -111,7 +112,8 @@ func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo
policy = NewNonePolicy() policy = NewNonePolicy()
case PolicyStatic: case PolicyStatic:
topo, err := topology.Discover(machineInfo) var err error
topo, err := topology.Discover(machineInfo, numaNodeInfo)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -149,7 +151,7 @@ func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo
policy: policy, policy: policy,
reconcilePeriod: reconcilePeriod, reconcilePeriod: reconcilePeriod,
state: stateImpl, state: stateImpl,
machineInfo: machineInfo, topology: topo,
nodeAllocatableReservation: nodeAllocatableReservation, nodeAllocatableReservation: nodeAllocatableReservation,
} }
return manager, nil return manager, nil

View File

@ -343,7 +343,7 @@ func TestCPUManagerGenerate(t *testing.T) {
} }
defer os.RemoveAll(sDir) defer os.RemoveAll(sDir)
mgr, err := NewManager(testCase.cpuPolicyName, 5*time.Second, machineInfo, testCase.nodeAllocatableReservation, sDir, topologymanager.NewFakeManager()) mgr, err := NewManager(testCase.cpuPolicyName, 5*time.Second, machineInfo, nil, testCase.nodeAllocatableReservation, sDir, topologymanager.NewFakeManager())
if testCase.expectedError != nil { if testCase.expectedError != nil {
if !strings.Contains(err.Error(), testCase.expectedError.Error()) { if !strings.Contains(err.Error(), testCase.expectedError.Error()) {
t.Errorf("Unexpected error message. Have: %s wants %s", err.Error(), testCase.expectedError.Error()) t.Errorf("Unexpected error message. Have: %s wants %s", err.Error(), testCase.expectedError.Error())

View File

@ -220,8 +220,8 @@ func (p *staticPolicy) AddContainer(s state.State, pod *v1.Pod, container *v1.Co
hint := p.affinity.GetAffinity(string(pod.UID), container.Name) hint := p.affinity.GetAffinity(string(pod.UID), container.Name)
klog.Infof("[cpumanager] Pod %v, Container %v Topology Affinity is: %v", pod.UID, container.Name, hint) klog.Infof("[cpumanager] Pod %v, Container %v Topology Affinity is: %v", pod.UID, container.Name, hint)
// Allocate CPUs according to the socket affinity contained in the hint. // Allocate CPUs according to the NUMA affinity contained in the hint.
cpuset, err := p.allocateCPUs(s, numCPUs, hint.SocketAffinity) cpuset, err := p.allocateCPUs(s, numCPUs, hint.NUMANodeAffinity)
if err != nil { if err != nil {
klog.Errorf("[cpumanager] unable to allocate %d CPUs (container id: %s, error: %v)", numCPUs, containerID, err) klog.Errorf("[cpumanager] unable to allocate %d CPUs (container id: %s, error: %v)", numCPUs, containerID, err)
return err return err
@ -250,15 +250,15 @@ func (p *staticPolicy) RemoveContainer(s state.State, containerID string) (rerr
return nil return nil
} }
func (p *staticPolicy) allocateCPUs(s state.State, numCPUs int, socketmask socketmask.SocketMask) (cpuset.CPUSet, error) { func (p *staticPolicy) allocateCPUs(s state.State, numCPUs int, numaAffinity socketmask.SocketMask) (cpuset.CPUSet, error) {
klog.Infof("[cpumanager] allocateCpus: (numCPUs: %d, socket: %v)", numCPUs, socketmask) klog.Infof("[cpumanager] allocateCpus: (numCPUs: %d, socket: %v)", numCPUs, numaAffinity)
// If there are aligned CPUs in the socketmask, attempt to take those first. // If there are aligned CPUs in numaAffinity, attempt to take those first.
result := cpuset.NewCPUSet() result := cpuset.NewCPUSet()
if socketmask != nil { if numaAffinity != nil {
alignedCPUs := cpuset.NewCPUSet() alignedCPUs := cpuset.NewCPUSet()
for _, socketID := range socketmask.GetSockets() { for _, numaNodeID := range numaAffinity.GetSockets() {
alignedCPUs = alignedCPUs.Union(p.assignableCPUs(s).Intersection(p.topology.CPUDetails.CPUsInSocket(socketID))) alignedCPUs = alignedCPUs.Union(p.assignableCPUs(s).Intersection(p.topology.CPUDetails.CPUsInNUMANode(numaNodeID)))
} }
numAlignedToAlloc := alignedCPUs.Size() numAlignedToAlloc := alignedCPUs.Size()

View File

@ -26,14 +26,14 @@ var (
NumSockets: 1, NumSockets: 1,
NumCores: 4, NumCores: 4,
CPUDetails: map[int]topology.CPUInfo{ CPUDetails: map[int]topology.CPUInfo{
0: {CoreID: 0, SocketID: 0}, 0: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
1: {CoreID: 1, SocketID: 0}, 1: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
2: {CoreID: 2, SocketID: 0}, 2: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
3: {CoreID: 3, SocketID: 0}, 3: {CoreID: 3, SocketID: 0, NUMANodeID: 0},
4: {CoreID: 0, SocketID: 0}, 4: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
5: {CoreID: 1, SocketID: 0}, 5: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
6: {CoreID: 2, SocketID: 0}, 6: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
7: {CoreID: 3, SocketID: 0}, 7: {CoreID: 3, SocketID: 0, NUMANodeID: 0},
}, },
} }
@ -42,18 +42,18 @@ var (
NumSockets: 2, NumSockets: 2,
NumCores: 6, NumCores: 6,
CPUDetails: map[int]topology.CPUInfo{ CPUDetails: map[int]topology.CPUInfo{
0: {CoreID: 0, SocketID: 0}, 0: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
1: {CoreID: 1, SocketID: 1}, 1: {CoreID: 1, SocketID: 1, NUMANodeID: 1},
2: {CoreID: 2, SocketID: 0}, 2: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
3: {CoreID: 3, SocketID: 1}, 3: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
4: {CoreID: 4, SocketID: 0}, 4: {CoreID: 4, SocketID: 0, NUMANodeID: 0},
5: {CoreID: 5, SocketID: 1}, 5: {CoreID: 5, SocketID: 1, NUMANodeID: 1},
6: {CoreID: 0, SocketID: 0}, 6: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
7: {CoreID: 1, SocketID: 1}, 7: {CoreID: 1, SocketID: 1, NUMANodeID: 1},
8: {CoreID: 2, SocketID: 0}, 8: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
9: {CoreID: 3, SocketID: 1}, 9: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
10: {CoreID: 4, SocketID: 0}, 10: {CoreID: 4, SocketID: 0, NUMANodeID: 0},
11: {CoreID: 5, SocketID: 1}, 11: {CoreID: 5, SocketID: 1, NUMANodeID: 1},
}, },
} }
@ -62,14 +62,14 @@ var (
NumSockets: 2, NumSockets: 2,
NumCores: 8, NumCores: 8,
CPUDetails: map[int]topology.CPUInfo{ CPUDetails: map[int]topology.CPUInfo{
0: {CoreID: 0, SocketID: 0}, 0: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
1: {CoreID: 1, SocketID: 0}, 1: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
2: {CoreID: 2, SocketID: 0}, 2: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
3: {CoreID: 3, SocketID: 0}, 3: {CoreID: 3, SocketID: 0, NUMANodeID: 0},
4: {CoreID: 4, SocketID: 1}, 4: {CoreID: 4, SocketID: 1, NUMANodeID: 1},
5: {CoreID: 5, SocketID: 1}, 5: {CoreID: 5, SocketID: 1, NUMANodeID: 1},
6: {CoreID: 6, SocketID: 1}, 6: {CoreID: 6, SocketID: 1, NUMANodeID: 1},
7: {CoreID: 7, SocketID: 1}, 7: {CoreID: 7, SocketID: 1, NUMANodeID: 1},
}, },
} }
@ -97,294 +97,294 @@ var (
NumSockets: 4, NumSockets: 4,
NumCores: 72, NumCores: 72,
CPUDetails: map[int]topology.CPUInfo{ CPUDetails: map[int]topology.CPUInfo{
0: {CoreID: 0, SocketID: 0}, 0: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
169: {CoreID: 0, SocketID: 0}, 169: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
109: {CoreID: 0, SocketID: 0}, 109: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
229: {CoreID: 0, SocketID: 0}, 229: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
50: {CoreID: 1, SocketID: 0}, 50: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
170: {CoreID: 1, SocketID: 0}, 170: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
110: {CoreID: 1, SocketID: 0}, 110: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
230: {CoreID: 1, SocketID: 0}, 230: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
1: {CoreID: 64, SocketID: 0}, 1: {CoreID: 64, SocketID: 0, NUMANodeID: 0},
25: {CoreID: 64, SocketID: 0}, 25: {CoreID: 64, SocketID: 0, NUMANodeID: 0},
13: {CoreID: 64, SocketID: 0}, 13: {CoreID: 64, SocketID: 0, NUMANodeID: 0},
38: {CoreID: 64, SocketID: 0}, 38: {CoreID: 64, SocketID: 0, NUMANodeID: 0},
2: {CoreID: 65, SocketID: 0}, 2: {CoreID: 65, SocketID: 0, NUMANodeID: 0},
26: {CoreID: 65, SocketID: 0}, 26: {CoreID: 65, SocketID: 0, NUMANodeID: 0},
14: {CoreID: 65, SocketID: 0}, 14: {CoreID: 65, SocketID: 0, NUMANodeID: 0},
39: {CoreID: 65, SocketID: 0}, 39: {CoreID: 65, SocketID: 0, NUMANodeID: 0},
9: {CoreID: 72, SocketID: 0}, 9: {CoreID: 72, SocketID: 0, NUMANodeID: 0},
33: {CoreID: 72, SocketID: 0}, 33: {CoreID: 72, SocketID: 0, NUMANodeID: 0},
21: {CoreID: 72, SocketID: 0}, 21: {CoreID: 72, SocketID: 0, NUMANodeID: 0},
46: {CoreID: 72, SocketID: 0}, 46: {CoreID: 72, SocketID: 0, NUMANodeID: 0},
10: {CoreID: 73, SocketID: 0}, 10: {CoreID: 73, SocketID: 0, NUMANodeID: 0},
34: {CoreID: 73, SocketID: 0}, 34: {CoreID: 73, SocketID: 0, NUMANodeID: 0},
22: {CoreID: 73, SocketID: 0}, 22: {CoreID: 73, SocketID: 0, NUMANodeID: 0},
47: {CoreID: 73, SocketID: 0}, 47: {CoreID: 73, SocketID: 0, NUMANodeID: 0},
57: {CoreID: 8, SocketID: 0}, 57: {CoreID: 8, SocketID: 0, NUMANodeID: 0},
177: {CoreID: 8, SocketID: 0}, 177: {CoreID: 8, SocketID: 0, NUMANodeID: 0},
117: {CoreID: 8, SocketID: 0}, 117: {CoreID: 8, SocketID: 0, NUMANodeID: 0},
237: {CoreID: 8, SocketID: 0}, 237: {CoreID: 8, SocketID: 0, NUMANodeID: 0},
58: {CoreID: 9, SocketID: 0}, 58: {CoreID: 9, SocketID: 0, NUMANodeID: 0},
178: {CoreID: 9, SocketID: 0}, 178: {CoreID: 9, SocketID: 0, NUMANodeID: 0},
118: {CoreID: 9, SocketID: 0}, 118: {CoreID: 9, SocketID: 0, NUMANodeID: 0},
238: {CoreID: 9, SocketID: 0}, 238: {CoreID: 9, SocketID: 0, NUMANodeID: 0},
71: {CoreID: 24, SocketID: 0}, 71: {CoreID: 24, SocketID: 0, NUMANodeID: 0},
191: {CoreID: 24, SocketID: 0}, 191: {CoreID: 24, SocketID: 0, NUMANodeID: 0},
131: {CoreID: 24, SocketID: 0}, 131: {CoreID: 24, SocketID: 0, NUMANodeID: 0},
251: {CoreID: 24, SocketID: 0}, 251: {CoreID: 24, SocketID: 0, NUMANodeID: 0},
72: {CoreID: 25, SocketID: 0}, 72: {CoreID: 25, SocketID: 0, NUMANodeID: 0},
192: {CoreID: 25, SocketID: 0}, 192: {CoreID: 25, SocketID: 0, NUMANodeID: 0},
132: {CoreID: 25, SocketID: 0}, 132: {CoreID: 25, SocketID: 0, NUMANodeID: 0},
252: {CoreID: 25, SocketID: 0}, 252: {CoreID: 25, SocketID: 0, NUMANodeID: 0},
79: {CoreID: 32, SocketID: 0}, 79: {CoreID: 32, SocketID: 0, NUMANodeID: 0},
199: {CoreID: 32, SocketID: 0}, 199: {CoreID: 32, SocketID: 0, NUMANodeID: 0},
139: {CoreID: 32, SocketID: 0}, 139: {CoreID: 32, SocketID: 0, NUMANodeID: 0},
259: {CoreID: 32, SocketID: 0}, 259: {CoreID: 32, SocketID: 0, NUMANodeID: 0},
80: {CoreID: 33, SocketID: 0}, 80: {CoreID: 33, SocketID: 0, NUMANodeID: 0},
200: {CoreID: 33, SocketID: 0}, 200: {CoreID: 33, SocketID: 0, NUMANodeID: 0},
140: {CoreID: 33, SocketID: 0}, 140: {CoreID: 33, SocketID: 0, NUMANodeID: 0},
260: {CoreID: 33, SocketID: 0}, 260: {CoreID: 33, SocketID: 0, NUMANodeID: 0},
87: {CoreID: 40, SocketID: 0}, 87: {CoreID: 40, SocketID: 0, NUMANodeID: 0},
207: {CoreID: 40, SocketID: 0}, 207: {CoreID: 40, SocketID: 0, NUMANodeID: 0},
147: {CoreID: 40, SocketID: 0}, 147: {CoreID: 40, SocketID: 0, NUMANodeID: 0},
267: {CoreID: 40, SocketID: 0}, 267: {CoreID: 40, SocketID: 0, NUMANodeID: 0},
88: {CoreID: 41, SocketID: 0}, 88: {CoreID: 41, SocketID: 0, NUMANodeID: 0},
208: {CoreID: 41, SocketID: 0}, 208: {CoreID: 41, SocketID: 0, NUMANodeID: 0},
148: {CoreID: 41, SocketID: 0}, 148: {CoreID: 41, SocketID: 0, NUMANodeID: 0},
268: {CoreID: 41, SocketID: 0}, 268: {CoreID: 41, SocketID: 0, NUMANodeID: 0},
95: {CoreID: 48, SocketID: 0}, 95: {CoreID: 48, SocketID: 0, NUMANodeID: 0},
215: {CoreID: 48, SocketID: 0}, 215: {CoreID: 48, SocketID: 0, NUMANodeID: 0},
155: {CoreID: 48, SocketID: 0}, 155: {CoreID: 48, SocketID: 0, NUMANodeID: 0},
275: {CoreID: 48, SocketID: 0}, 275: {CoreID: 48, SocketID: 0, NUMANodeID: 0},
96: {CoreID: 49, SocketID: 0}, 96: {CoreID: 49, SocketID: 0, NUMANodeID: 0},
216: {CoreID: 49, SocketID: 0}, 216: {CoreID: 49, SocketID: 0, NUMANodeID: 0},
156: {CoreID: 49, SocketID: 0}, 156: {CoreID: 49, SocketID: 0, NUMANodeID: 0},
276: {CoreID: 49, SocketID: 0}, 276: {CoreID: 49, SocketID: 0, NUMANodeID: 0},
103: {CoreID: 56, SocketID: 0}, 103: {CoreID: 56, SocketID: 0, NUMANodeID: 0},
223: {CoreID: 56, SocketID: 0}, 223: {CoreID: 56, SocketID: 0, NUMANodeID: 0},
163: {CoreID: 56, SocketID: 0}, 163: {CoreID: 56, SocketID: 0, NUMANodeID: 0},
283: {CoreID: 56, SocketID: 0}, 283: {CoreID: 56, SocketID: 0, NUMANodeID: 0},
104: {CoreID: 57, SocketID: 0}, 104: {CoreID: 57, SocketID: 0, NUMANodeID: 0},
224: {CoreID: 57, SocketID: 0}, 224: {CoreID: 57, SocketID: 0, NUMANodeID: 0},
164: {CoreID: 57, SocketID: 0}, 164: {CoreID: 57, SocketID: 0, NUMANodeID: 0},
284: {CoreID: 57, SocketID: 0}, 284: {CoreID: 57, SocketID: 0, NUMANodeID: 0},
3: {CoreID: 66, SocketID: 1}, 3: {CoreID: 66, SocketID: 1, NUMANodeID: 1},
27: {CoreID: 66, SocketID: 1}, 27: {CoreID: 66, SocketID: 1, NUMANodeID: 1},
15: {CoreID: 66, SocketID: 1}, 15: {CoreID: 66, SocketID: 1, NUMANodeID: 1},
40: {CoreID: 66, SocketID: 1}, 40: {CoreID: 66, SocketID: 1, NUMANodeID: 1},
4: {CoreID: 67, SocketID: 1}, 4: {CoreID: 67, SocketID: 1, NUMANodeID: 1},
28: {CoreID: 67, SocketID: 1}, 28: {CoreID: 67, SocketID: 1, NUMANodeID: 1},
16: {CoreID: 67, SocketID: 1}, 16: {CoreID: 67, SocketID: 1, NUMANodeID: 1},
41: {CoreID: 67, SocketID: 1}, 41: {CoreID: 67, SocketID: 1, NUMANodeID: 1},
11: {CoreID: 74, SocketID: 1}, 11: {CoreID: 74, SocketID: 1, NUMANodeID: 1},
35: {CoreID: 74, SocketID: 1}, 35: {CoreID: 74, SocketID: 1, NUMANodeID: 1},
23: {CoreID: 74, SocketID: 1}, 23: {CoreID: 74, SocketID: 1, NUMANodeID: 1},
48: {CoreID: 74, SocketID: 1}, 48: {CoreID: 74, SocketID: 1, NUMANodeID: 1},
12: {CoreID: 75, SocketID: 1}, 12: {CoreID: 75, SocketID: 1, NUMANodeID: 1},
36: {CoreID: 75, SocketID: 1}, 36: {CoreID: 75, SocketID: 1, NUMANodeID: 1},
24: {CoreID: 75, SocketID: 1}, 24: {CoreID: 75, SocketID: 1, NUMANodeID: 1},
49: {CoreID: 75, SocketID: 1}, 49: {CoreID: 75, SocketID: 1, NUMANodeID: 1},
51: {CoreID: 2, SocketID: 1}, 51: {CoreID: 2, SocketID: 1, NUMANodeID: 1},
171: {CoreID: 2, SocketID: 1}, 171: {CoreID: 2, SocketID: 1, NUMANodeID: 1},
111: {CoreID: 2, SocketID: 1}, 111: {CoreID: 2, SocketID: 1, NUMANodeID: 1},
231: {CoreID: 2, SocketID: 1}, 231: {CoreID: 2, SocketID: 1, NUMANodeID: 1},
52: {CoreID: 3, SocketID: 1}, 52: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
172: {CoreID: 3, SocketID: 1}, 172: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
112: {CoreID: 3, SocketID: 1}, 112: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
232: {CoreID: 3, SocketID: 1}, 232: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
59: {CoreID: 10, SocketID: 1}, 59: {CoreID: 10, SocketID: 1, NUMANodeID: 1},
179: {CoreID: 10, SocketID: 1}, 179: {CoreID: 10, SocketID: 1, NUMANodeID: 1},
119: {CoreID: 10, SocketID: 1}, 119: {CoreID: 10, SocketID: 1, NUMANodeID: 1},
239: {CoreID: 10, SocketID: 1}, 239: {CoreID: 10, SocketID: 1, NUMANodeID: 1},
60: {CoreID: 11, SocketID: 1}, 60: {CoreID: 11, SocketID: 1, NUMANodeID: 1},
180: {CoreID: 11, SocketID: 1}, 180: {CoreID: 11, SocketID: 1, NUMANodeID: 1},
120: {CoreID: 11, SocketID: 1}, 120: {CoreID: 11, SocketID: 1, NUMANodeID: 1},
240: {CoreID: 11, SocketID: 1}, 240: {CoreID: 11, SocketID: 1, NUMANodeID: 1},
65: {CoreID: 18, SocketID: 1}, 65: {CoreID: 18, SocketID: 1, NUMANodeID: 1},
185: {CoreID: 18, SocketID: 1}, 185: {CoreID: 18, SocketID: 1, NUMANodeID: 1},
125: {CoreID: 18, SocketID: 1}, 125: {CoreID: 18, SocketID: 1, NUMANodeID: 1},
245: {CoreID: 18, SocketID: 1}, 245: {CoreID: 18, SocketID: 1, NUMANodeID: 1},
66: {CoreID: 19, SocketID: 1}, 66: {CoreID: 19, SocketID: 1, NUMANodeID: 1},
186: {CoreID: 19, SocketID: 1}, 186: {CoreID: 19, SocketID: 1, NUMANodeID: 1},
126: {CoreID: 19, SocketID: 1}, 126: {CoreID: 19, SocketID: 1, NUMANodeID: 1},
246: {CoreID: 19, SocketID: 1}, 246: {CoreID: 19, SocketID: 1, NUMANodeID: 1},
73: {CoreID: 26, SocketID: 1}, 73: {CoreID: 26, SocketID: 1, NUMANodeID: 1},
193: {CoreID: 26, SocketID: 1}, 193: {CoreID: 26, SocketID: 1, NUMANodeID: 1},
133: {CoreID: 26, SocketID: 1}, 133: {CoreID: 26, SocketID: 1, NUMANodeID: 1},
253: {CoreID: 26, SocketID: 1}, 253: {CoreID: 26, SocketID: 1, NUMANodeID: 1},
74: {CoreID: 27, SocketID: 1}, 74: {CoreID: 27, SocketID: 1, NUMANodeID: 1},
194: {CoreID: 27, SocketID: 1}, 194: {CoreID: 27, SocketID: 1, NUMANodeID: 1},
134: {CoreID: 27, SocketID: 1}, 134: {CoreID: 27, SocketID: 1, NUMANodeID: 1},
254: {CoreID: 27, SocketID: 1}, 254: {CoreID: 27, SocketID: 1, NUMANodeID: 1},
81: {CoreID: 34, SocketID: 1}, 81: {CoreID: 34, SocketID: 1, NUMANodeID: 1},
201: {CoreID: 34, SocketID: 1}, 201: {CoreID: 34, SocketID: 1, NUMANodeID: 1},
141: {CoreID: 34, SocketID: 1}, 141: {CoreID: 34, SocketID: 1, NUMANodeID: 1},
261: {CoreID: 34, SocketID: 1}, 261: {CoreID: 34, SocketID: 1, NUMANodeID: 1},
82: {CoreID: 35, SocketID: 1}, 82: {CoreID: 35, SocketID: 1, NUMANodeID: 1},
202: {CoreID: 35, SocketID: 1}, 202: {CoreID: 35, SocketID: 1, NUMANodeID: 1},
142: {CoreID: 35, SocketID: 1}, 142: {CoreID: 35, SocketID: 1, NUMANodeID: 1},
262: {CoreID: 35, SocketID: 1}, 262: {CoreID: 35, SocketID: 1, NUMANodeID: 1},
89: {CoreID: 42, SocketID: 1}, 89: {CoreID: 42, SocketID: 1, NUMANodeID: 1},
209: {CoreID: 42, SocketID: 1}, 209: {CoreID: 42, SocketID: 1, NUMANodeID: 1},
149: {CoreID: 42, SocketID: 1}, 149: {CoreID: 42, SocketID: 1, NUMANodeID: 1},
269: {CoreID: 42, SocketID: 1}, 269: {CoreID: 42, SocketID: 1, NUMANodeID: 1},
90: {CoreID: 43, SocketID: 1}, 90: {CoreID: 43, SocketID: 1, NUMANodeID: 1},
210: {CoreID: 43, SocketID: 1}, 210: {CoreID: 43, SocketID: 1, NUMANodeID: 1},
150: {CoreID: 43, SocketID: 1}, 150: {CoreID: 43, SocketID: 1, NUMANodeID: 1},
270: {CoreID: 43, SocketID: 1}, 270: {CoreID: 43, SocketID: 1, NUMANodeID: 1},
97: {CoreID: 50, SocketID: 1}, 97: {CoreID: 50, SocketID: 1, NUMANodeID: 1},
217: {CoreID: 50, SocketID: 1}, 217: {CoreID: 50, SocketID: 1, NUMANodeID: 1},
157: {CoreID: 50, SocketID: 1}, 157: {CoreID: 50, SocketID: 1, NUMANodeID: 1},
277: {CoreID: 50, SocketID: 1}, 277: {CoreID: 50, SocketID: 1, NUMANodeID: 1},
98: {CoreID: 51, SocketID: 1}, 98: {CoreID: 51, SocketID: 1, NUMANodeID: 1},
218: {CoreID: 51, SocketID: 1}, 218: {CoreID: 51, SocketID: 1, NUMANodeID: 1},
158: {CoreID: 51, SocketID: 1}, 158: {CoreID: 51, SocketID: 1, NUMANodeID: 1},
278: {CoreID: 51, SocketID: 1}, 278: {CoreID: 51, SocketID: 1, NUMANodeID: 1},
5: {CoreID: 68, SocketID: 2}, 5: {CoreID: 68, SocketID: 2, NUMANodeID: 2},
29: {CoreID: 68, SocketID: 2}, 29: {CoreID: 68, SocketID: 2, NUMANodeID: 2},
17: {CoreID: 68, SocketID: 2}, 17: {CoreID: 68, SocketID: 2, NUMANodeID: 2},
42: {CoreID: 68, SocketID: 2}, 42: {CoreID: 68, SocketID: 2, NUMANodeID: 2},
6: {CoreID: 69, SocketID: 2}, 6: {CoreID: 69, SocketID: 2, NUMANodeID: 2},
30: {CoreID: 69, SocketID: 2}, 30: {CoreID: 69, SocketID: 2, NUMANodeID: 2},
18: {CoreID: 69, SocketID: 2}, 18: {CoreID: 69, SocketID: 2, NUMANodeID: 2},
43: {CoreID: 69, SocketID: 2}, 43: {CoreID: 69, SocketID: 2, NUMANodeID: 2},
53: {CoreID: 4, SocketID: 2}, 53: {CoreID: 4, SocketID: 2, NUMANodeID: 2},
173: {CoreID: 4, SocketID: 2}, 173: {CoreID: 4, SocketID: 2, NUMANodeID: 2},
113: {CoreID: 4, SocketID: 2}, 113: {CoreID: 4, SocketID: 2, NUMANodeID: 2},
233: {CoreID: 4, SocketID: 2}, 233: {CoreID: 4, SocketID: 2, NUMANodeID: 2},
54: {CoreID: 5, SocketID: 2}, 54: {CoreID: 5, SocketID: 2, NUMANodeID: 2},
174: {CoreID: 5, SocketID: 2}, 174: {CoreID: 5, SocketID: 2, NUMANodeID: 2},
114: {CoreID: 5, SocketID: 2}, 114: {CoreID: 5, SocketID: 2, NUMANodeID: 2},
234: {CoreID: 5, SocketID: 2}, 234: {CoreID: 5, SocketID: 2, NUMANodeID: 2},
61: {CoreID: 12, SocketID: 2}, 61: {CoreID: 12, SocketID: 2, NUMANodeID: 2},
181: {CoreID: 12, SocketID: 2}, 181: {CoreID: 12, SocketID: 2, NUMANodeID: 2},
121: {CoreID: 12, SocketID: 2}, 121: {CoreID: 12, SocketID: 2, NUMANodeID: 2},
241: {CoreID: 12, SocketID: 2}, 241: {CoreID: 12, SocketID: 2, NUMANodeID: 2},
62: {CoreID: 13, SocketID: 2}, 62: {CoreID: 13, SocketID: 2, NUMANodeID: 2},
182: {CoreID: 13, SocketID: 2}, 182: {CoreID: 13, SocketID: 2, NUMANodeID: 2},
122: {CoreID: 13, SocketID: 2}, 122: {CoreID: 13, SocketID: 2, NUMANodeID: 2},
242: {CoreID: 13, SocketID: 2}, 242: {CoreID: 13, SocketID: 2, NUMANodeID: 2},
67: {CoreID: 20, SocketID: 2}, 67: {CoreID: 20, SocketID: 2, NUMANodeID: 2},
187: {CoreID: 20, SocketID: 2}, 187: {CoreID: 20, SocketID: 2, NUMANodeID: 2},
127: {CoreID: 20, SocketID: 2}, 127: {CoreID: 20, SocketID: 2, NUMANodeID: 2},
247: {CoreID: 20, SocketID: 2}, 247: {CoreID: 20, SocketID: 2, NUMANodeID: 2},
68: {CoreID: 21, SocketID: 2}, 68: {CoreID: 21, SocketID: 2, NUMANodeID: 2},
188: {CoreID: 21, SocketID: 2}, 188: {CoreID: 21, SocketID: 2, NUMANodeID: 2},
128: {CoreID: 21, SocketID: 2}, 128: {CoreID: 21, SocketID: 2, NUMANodeID: 2},
248: {CoreID: 21, SocketID: 2}, 248: {CoreID: 21, SocketID: 2, NUMANodeID: 2},
75: {CoreID: 28, SocketID: 2}, 75: {CoreID: 28, SocketID: 2, NUMANodeID: 2},
195: {CoreID: 28, SocketID: 2}, 195: {CoreID: 28, SocketID: 2, NUMANodeID: 2},
135: {CoreID: 28, SocketID: 2}, 135: {CoreID: 28, SocketID: 2, NUMANodeID: 2},
255: {CoreID: 28, SocketID: 2}, 255: {CoreID: 28, SocketID: 2, NUMANodeID: 2},
76: {CoreID: 29, SocketID: 2}, 76: {CoreID: 29, SocketID: 2, NUMANodeID: 2},
196: {CoreID: 29, SocketID: 2}, 196: {CoreID: 29, SocketID: 2, NUMANodeID: 2},
136: {CoreID: 29, SocketID: 2}, 136: {CoreID: 29, SocketID: 2, NUMANodeID: 2},
256: {CoreID: 29, SocketID: 2}, 256: {CoreID: 29, SocketID: 2, NUMANodeID: 2},
83: {CoreID: 36, SocketID: 2}, 83: {CoreID: 36, SocketID: 2, NUMANodeID: 2},
203: {CoreID: 36, SocketID: 2}, 203: {CoreID: 36, SocketID: 2, NUMANodeID: 2},
143: {CoreID: 36, SocketID: 2}, 143: {CoreID: 36, SocketID: 2, NUMANodeID: 2},
263: {CoreID: 36, SocketID: 2}, 263: {CoreID: 36, SocketID: 2, NUMANodeID: 2},
84: {CoreID: 37, SocketID: 2}, 84: {CoreID: 37, SocketID: 2, NUMANodeID: 2},
204: {CoreID: 37, SocketID: 2}, 204: {CoreID: 37, SocketID: 2, NUMANodeID: 2},
144: {CoreID: 37, SocketID: 2}, 144: {CoreID: 37, SocketID: 2, NUMANodeID: 2},
264: {CoreID: 37, SocketID: 2}, 264: {CoreID: 37, SocketID: 2, NUMANodeID: 2},
91: {CoreID: 44, SocketID: 2}, 91: {CoreID: 44, SocketID: 2, NUMANodeID: 2},
211: {CoreID: 44, SocketID: 2}, 211: {CoreID: 44, SocketID: 2, NUMANodeID: 2},
151: {CoreID: 44, SocketID: 2}, 151: {CoreID: 44, SocketID: 2, NUMANodeID: 2},
271: {CoreID: 44, SocketID: 2}, 271: {CoreID: 44, SocketID: 2, NUMANodeID: 2},
92: {CoreID: 45, SocketID: 2}, 92: {CoreID: 45, SocketID: 2, NUMANodeID: 2},
212: {CoreID: 45, SocketID: 2}, 212: {CoreID: 45, SocketID: 2, NUMANodeID: 2},
152: {CoreID: 45, SocketID: 2}, 152: {CoreID: 45, SocketID: 2, NUMANodeID: 2},
272: {CoreID: 45, SocketID: 2}, 272: {CoreID: 45, SocketID: 2, NUMANodeID: 2},
99: {CoreID: 52, SocketID: 2}, 99: {CoreID: 52, SocketID: 2, NUMANodeID: 2},
219: {CoreID: 52, SocketID: 2}, 219: {CoreID: 52, SocketID: 2, NUMANodeID: 2},
159: {CoreID: 52, SocketID: 2}, 159: {CoreID: 52, SocketID: 2, NUMANodeID: 2},
279: {CoreID: 52, SocketID: 2}, 279: {CoreID: 52, SocketID: 2, NUMANodeID: 2},
100: {CoreID: 53, SocketID: 2}, 100: {CoreID: 53, SocketID: 2, NUMANodeID: 2},
220: {CoreID: 53, SocketID: 2}, 220: {CoreID: 53, SocketID: 2, NUMANodeID: 2},
160: {CoreID: 53, SocketID: 2}, 160: {CoreID: 53, SocketID: 2, NUMANodeID: 2},
280: {CoreID: 53, SocketID: 2}, 280: {CoreID: 53, SocketID: 2, NUMANodeID: 2},
105: {CoreID: 60, SocketID: 2}, 105: {CoreID: 60, SocketID: 2, NUMANodeID: 2},
225: {CoreID: 60, SocketID: 2}, 225: {CoreID: 60, SocketID: 2, NUMANodeID: 2},
165: {CoreID: 60, SocketID: 2}, 165: {CoreID: 60, SocketID: 2, NUMANodeID: 2},
285: {CoreID: 60, SocketID: 2}, 285: {CoreID: 60, SocketID: 2, NUMANodeID: 2},
106: {CoreID: 61, SocketID: 2}, 106: {CoreID: 61, SocketID: 2, NUMANodeID: 2},
226: {CoreID: 61, SocketID: 2}, 226: {CoreID: 61, SocketID: 2, NUMANodeID: 2},
166: {CoreID: 61, SocketID: 2}, 166: {CoreID: 61, SocketID: 2, NUMANodeID: 2},
286: {CoreID: 61, SocketID: 2}, 286: {CoreID: 61, SocketID: 2, NUMANodeID: 2},
7: {CoreID: 70, SocketID: 3}, 7: {CoreID: 70, SocketID: 3, NUMANodeID: 3},
31: {CoreID: 70, SocketID: 3}, 31: {CoreID: 70, SocketID: 3, NUMANodeID: 3},
19: {CoreID: 70, SocketID: 3}, 19: {CoreID: 70, SocketID: 3, NUMANodeID: 3},
44: {CoreID: 70, SocketID: 3}, 44: {CoreID: 70, SocketID: 3, NUMANodeID: 3},
8: {CoreID: 71, SocketID: 3}, 8: {CoreID: 71, SocketID: 3, NUMANodeID: 3},
32: {CoreID: 71, SocketID: 3}, 32: {CoreID: 71, SocketID: 3, NUMANodeID: 3},
20: {CoreID: 71, SocketID: 3}, 20: {CoreID: 71, SocketID: 3, NUMANodeID: 3},
45: {CoreID: 71, SocketID: 3}, 45: {CoreID: 71, SocketID: 3, NUMANodeID: 3},
37: {CoreID: 63, SocketID: 3}, 37: {CoreID: 63, SocketID: 3, NUMANodeID: 3},
168: {CoreID: 63, SocketID: 3}, 168: {CoreID: 63, SocketID: 3, NUMANodeID: 3},
108: {CoreID: 63, SocketID: 3}, 108: {CoreID: 63, SocketID: 3, NUMANodeID: 3},
228: {CoreID: 63, SocketID: 3}, 228: {CoreID: 63, SocketID: 3, NUMANodeID: 3},
107: {CoreID: 62, SocketID: 3}, 107: {CoreID: 62, SocketID: 3, NUMANodeID: 3},
227: {CoreID: 62, SocketID: 3}, 227: {CoreID: 62, SocketID: 3, NUMANodeID: 3},
167: {CoreID: 62, SocketID: 3}, 167: {CoreID: 62, SocketID: 3, NUMANodeID: 3},
287: {CoreID: 62, SocketID: 3}, 287: {CoreID: 62, SocketID: 3, NUMANodeID: 3},
55: {CoreID: 6, SocketID: 3}, 55: {CoreID: 6, SocketID: 3, NUMANodeID: 3},
175: {CoreID: 6, SocketID: 3}, 175: {CoreID: 6, SocketID: 3, NUMANodeID: 3},
115: {CoreID: 6, SocketID: 3}, 115: {CoreID: 6, SocketID: 3, NUMANodeID: 3},
235: {CoreID: 6, SocketID: 3}, 235: {CoreID: 6, SocketID: 3, NUMANodeID: 3},
56: {CoreID: 7, SocketID: 3}, 56: {CoreID: 7, SocketID: 3, NUMANodeID: 3},
176: {CoreID: 7, SocketID: 3}, 176: {CoreID: 7, SocketID: 3, NUMANodeID: 3},
116: {CoreID: 7, SocketID: 3}, 116: {CoreID: 7, SocketID: 3, NUMANodeID: 3},
236: {CoreID: 7, SocketID: 3}, 236: {CoreID: 7, SocketID: 3, NUMANodeID: 3},
63: {CoreID: 14, SocketID: 3}, 63: {CoreID: 14, SocketID: 3, NUMANodeID: 3},
183: {CoreID: 14, SocketID: 3}, 183: {CoreID: 14, SocketID: 3, NUMANodeID: 3},
123: {CoreID: 14, SocketID: 3}, 123: {CoreID: 14, SocketID: 3, NUMANodeID: 3},
243: {CoreID: 14, SocketID: 3}, 243: {CoreID: 14, SocketID: 3, NUMANodeID: 3},
64: {CoreID: 15, SocketID: 3}, 64: {CoreID: 15, SocketID: 3, NUMANodeID: 3},
184: {CoreID: 15, SocketID: 3}, 184: {CoreID: 15, SocketID: 3, NUMANodeID: 3},
124: {CoreID: 15, SocketID: 3}, 124: {CoreID: 15, SocketID: 3, NUMANodeID: 3},
244: {CoreID: 15, SocketID: 3}, 244: {CoreID: 15, SocketID: 3, NUMANodeID: 3},
69: {CoreID: 22, SocketID: 3}, 69: {CoreID: 22, SocketID: 3, NUMANodeID: 3},
189: {CoreID: 22, SocketID: 3}, 189: {CoreID: 22, SocketID: 3, NUMANodeID: 3},
129: {CoreID: 22, SocketID: 3}, 129: {CoreID: 22, SocketID: 3, NUMANodeID: 3},
249: {CoreID: 22, SocketID: 3}, 249: {CoreID: 22, SocketID: 3, NUMANodeID: 3},
70: {CoreID: 23, SocketID: 3}, 70: {CoreID: 23, SocketID: 3, NUMANodeID: 3},
190: {CoreID: 23, SocketID: 3}, 190: {CoreID: 23, SocketID: 3, NUMANodeID: 3},
130: {CoreID: 23, SocketID: 3}, 130: {CoreID: 23, SocketID: 3, NUMANodeID: 3},
250: {CoreID: 23, SocketID: 3}, 250: {CoreID: 23, SocketID: 3, NUMANodeID: 3},
77: {CoreID: 30, SocketID: 3}, 77: {CoreID: 30, SocketID: 3, NUMANodeID: 3},
197: {CoreID: 30, SocketID: 3}, 197: {CoreID: 30, SocketID: 3, NUMANodeID: 3},
137: {CoreID: 30, SocketID: 3}, 137: {CoreID: 30, SocketID: 3, NUMANodeID: 3},
257: {CoreID: 30, SocketID: 3}, 257: {CoreID: 30, SocketID: 3, NUMANodeID: 3},
78: {CoreID: 31, SocketID: 3}, 78: {CoreID: 31, SocketID: 3, NUMANodeID: 3},
198: {CoreID: 31, SocketID: 3}, 198: {CoreID: 31, SocketID: 3, NUMANodeID: 3},
138: {CoreID: 31, SocketID: 3}, 138: {CoreID: 31, SocketID: 3, NUMANodeID: 3},
258: {CoreID: 31, SocketID: 3}, 258: {CoreID: 31, SocketID: 3, NUMANodeID: 3},
85: {CoreID: 38, SocketID: 3}, 85: {CoreID: 38, SocketID: 3, NUMANodeID: 3},
205: {CoreID: 38, SocketID: 3}, 205: {CoreID: 38, SocketID: 3, NUMANodeID: 3},
145: {CoreID: 38, SocketID: 3}, 145: {CoreID: 38, SocketID: 3, NUMANodeID: 3},
265: {CoreID: 38, SocketID: 3}, 265: {CoreID: 38, SocketID: 3, NUMANodeID: 3},
86: {CoreID: 39, SocketID: 3}, 86: {CoreID: 39, SocketID: 3, NUMANodeID: 3},
206: {CoreID: 39, SocketID: 3}, 206: {CoreID: 39, SocketID: 3, NUMANodeID: 3},
146: {CoreID: 39, SocketID: 3}, 146: {CoreID: 39, SocketID: 3, NUMANodeID: 3},
266: {CoreID: 39, SocketID: 3}, 266: {CoreID: 39, SocketID: 3, NUMANodeID: 3},
93: {CoreID: 46, SocketID: 3}, 93: {CoreID: 46, SocketID: 3, NUMANodeID: 3},
213: {CoreID: 46, SocketID: 3}, 213: {CoreID: 46, SocketID: 3, NUMANodeID: 3},
153: {CoreID: 46, SocketID: 3}, 153: {CoreID: 46, SocketID: 3, NUMANodeID: 3},
273: {CoreID: 46, SocketID: 3}, 273: {CoreID: 46, SocketID: 3, NUMANodeID: 3},
94: {CoreID: 47, SocketID: 3}, 94: {CoreID: 47, SocketID: 3, NUMANodeID: 3},
214: {CoreID: 47, SocketID: 3}, 214: {CoreID: 47, SocketID: 3, NUMANodeID: 3},
154: {CoreID: 47, SocketID: 3}, 154: {CoreID: 47, SocketID: 3, NUMANodeID: 3},
274: {CoreID: 47, SocketID: 3}, 274: {CoreID: 47, SocketID: 3, NUMANodeID: 3},
101: {CoreID: 54, SocketID: 3}, 101: {CoreID: 54, SocketID: 3, NUMANodeID: 3},
221: {CoreID: 54, SocketID: 3}, 221: {CoreID: 54, SocketID: 3, NUMANodeID: 3},
161: {CoreID: 54, SocketID: 3}, 161: {CoreID: 54, SocketID: 3, NUMANodeID: 3},
281: {CoreID: 54, SocketID: 3}, 281: {CoreID: 54, SocketID: 3, NUMANodeID: 3},
102: {CoreID: 55, SocketID: 3}, 102: {CoreID: 55, SocketID: 3, NUMANodeID: 3},
222: {CoreID: 55, SocketID: 3}, 222: {CoreID: 55, SocketID: 3, NUMANodeID: 3},
162: {CoreID: 55, SocketID: 3}, 162: {CoreID: 55, SocketID: 3, NUMANodeID: 3},
282: {CoreID: 55, SocketID: 3}, 282: {CoreID: 55, SocketID: 3, NUMANodeID: 3},
}, },
} }
) )

View File

@ -33,5 +33,8 @@ go_test(
name = "go_default_test", name = "go_default_test",
srcs = ["topology_test.go"], srcs = ["topology_test.go"],
embed = [":go_default_library"], embed = [":go_default_library"],
deps = ["//vendor/github.com/google/cadvisor/info/v1:go_default_library"], deps = [
"//pkg/kubelet/cm/cpuset:go_default_library",
"//vendor/github.com/google/cadvisor/info/v1:go_default_library",
],
) )

View File

@ -18,13 +18,19 @@ package topology
import ( import (
"fmt" "fmt"
"io/ioutil"
"strings"
cadvisorapi "github.com/google/cadvisor/info/v1" cadvisorapi "github.com/google/cadvisor/info/v1"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/kubernetes/pkg/kubelet/cm/cpuset" "k8s.io/kubernetes/pkg/kubelet/cm/cpuset"
) )
// CPUDetails is a map from CPU ID to Core ID and Socket ID. // NUMANodeInfo is a map from NUMANode ID to a list of CPU IDs associated with
// that NUMANode.
type NUMANodeInfo map[int]cpuset.CPUSet
// CPUDetails is a map from CPU ID to Core ID, Socket ID, and NUMA ID.
type CPUDetails map[int]CPUInfo type CPUDetails map[int]CPUInfo
// CPUTopology contains details of node cpu, where : // CPUTopology contains details of node cpu, where :
@ -56,8 +62,9 @@ func (topo *CPUTopology) CPUsPerSocket() int {
return topo.NumCPUs / topo.NumSockets return topo.NumCPUs / topo.NumSockets
} }
// CPUInfo contains the socket and core IDs associated with a CPU. // CPUInfo contains the NUMA, socket, and core IDs associated with a CPU.
type CPUInfo struct { type CPUInfo struct {
NUMANodeID int
SocketID int SocketID int
CoreID int CoreID int
} }
@ -73,6 +80,28 @@ func (d CPUDetails) KeepOnly(cpus cpuset.CPUSet) CPUDetails {
return result return result
} }
// NUMANodes returns all of the NUMANode IDs associated with the CPUs in this
// CPUDetails.
func (d CPUDetails) NUMANodes() cpuset.CPUSet {
b := cpuset.NewBuilder()
for _, info := range d {
b.Add(info.NUMANodeID)
}
return b.Result()
}
// NUMANodesInSocket returns all of the logical NUMANode IDs associated with
// the given Socket ID in this CPUDetails.
func (d CPUDetails) NUMANodesInSocket(id int) cpuset.CPUSet {
b := cpuset.NewBuilder()
for _, info := range d {
if info.SocketID == id {
b.Add(info.NUMANodeID)
}
}
return b.Result()
}
// Sockets returns all of the socket IDs associated with the CPUs in this // Sockets returns all of the socket IDs associated with the CPUs in this
// CPUDetails. // CPUDetails.
func (d CPUDetails) Sockets() cpuset.CPUSet { func (d CPUDetails) Sockets() cpuset.CPUSet {
@ -95,6 +124,18 @@ func (d CPUDetails) CPUsInSocket(id int) cpuset.CPUSet {
return b.Result() return b.Result()
} }
// SocketsInNUMANode returns all of the logical Socket IDs associated with the
// given NUMANode ID in this CPUDetails.
func (d CPUDetails) SocketsInNUMANode(id int) cpuset.CPUSet {
b := cpuset.NewBuilder()
for _, info := range d {
if info.NUMANodeID == id {
b.Add(info.SocketID)
}
}
return b.Result()
}
// Cores returns all of the core IDs associated with the CPUs in this // Cores returns all of the core IDs associated with the CPUs in this
// CPUDetails. // CPUDetails.
func (d CPUDetails) Cores() cpuset.CPUSet { func (d CPUDetails) Cores() cpuset.CPUSet {
@ -105,6 +146,18 @@ func (d CPUDetails) Cores() cpuset.CPUSet {
return b.Result() return b.Result()
} }
// CoresInNUMANode returns all of the core IDs associated with the given
// NUMA ID in this CPUDetails.
func (d CPUDetails) CoresInNUMANode(id int) cpuset.CPUSet {
b := cpuset.NewBuilder()
for _, info := range d {
if info.NUMANodeID == id {
b.Add(info.CoreID)
}
}
return b.Result()
}
// CoresInSocket returns all of the core IDs associated with the given // CoresInSocket returns all of the core IDs associated with the given
// socket ID in this CPUDetails. // socket ID in this CPUDetails.
func (d CPUDetails) CoresInSocket(id int) cpuset.CPUSet { func (d CPUDetails) CoresInSocket(id int) cpuset.CPUSet {
@ -126,6 +179,18 @@ func (d CPUDetails) CPUs() cpuset.CPUSet {
return b.Result() return b.Result()
} }
// CPUsInNUMANode returns all of the logical CPU IDs associated with the given
// NUMANode ID in this CPUDetails.
func (d CPUDetails) CPUsInNUMANode(id int) cpuset.CPUSet {
b := cpuset.NewBuilder()
for cpu, info := range d {
if info.NUMANodeID == id {
b.Add(cpu)
}
}
return b.Result()
}
// CPUsInCore returns all of the logical CPU IDs associated with the // CPUsInCore returns all of the logical CPU IDs associated with the
// given core ID in this CPUDetails. // given core ID in this CPUDetails.
func (d CPUDetails) CPUsInCore(id int) cpuset.CPUSet { func (d CPUDetails) CPUsInCore(id int) cpuset.CPUSet {
@ -139,7 +204,7 @@ func (d CPUDetails) CPUsInCore(id int) cpuset.CPUSet {
} }
// Discover returns CPUTopology based on cadvisor node info // Discover returns CPUTopology based on cadvisor node info
func Discover(machineInfo *cadvisorapi.MachineInfo) (*CPUTopology, error) { func Discover(machineInfo *cadvisorapi.MachineInfo, numaNodeInfo NUMANodeInfo) (*CPUTopology, error) {
if machineInfo.NumCores == 0 { if machineInfo.NumCores == 0 {
return nil, fmt.Errorf("could not detect number of cpus") return nil, fmt.Errorf("could not detect number of cpus")
} }
@ -152,9 +217,16 @@ func Discover(machineInfo *cadvisorapi.MachineInfo) (*CPUTopology, error) {
for _, core := range socket.Cores { for _, core := range socket.Cores {
if coreID, err := getUniqueCoreID(core.Threads); err == nil { if coreID, err := getUniqueCoreID(core.Threads); err == nil {
for _, cpu := range core.Threads { for _, cpu := range core.Threads {
numaNodeID := 0
for id, cset := range numaNodeInfo {
if cset.Contains(cpu) {
numaNodeID = id
}
}
CPUDetails[cpu] = CPUInfo{ CPUDetails[cpu] = CPUInfo{
CoreID: coreID, CoreID: coreID,
SocketID: socket.Id, SocketID: socket.Id,
NUMANodeID: numaNodeID,
} }
} }
} else { } else {
@ -194,3 +266,49 @@ func getUniqueCoreID(threads []int) (coreID int, err error) {
return min, nil return min, nil
} }
// GetNUMANodeInfo uses sysfs to return a map of NUMANode id to the list of
// CPUs associated with that NUMANode.
//
// TODO: This is a temporary workaround until cadvisor provides this
// information directly in machineInfo. We should remove this once this
// information is available from cadvisor.
func GetNUMANodeInfo() (NUMANodeInfo, error) {
// Get the possible NUMA nodes on this machine. If reading this file
// is not possible, this is not an error. Instead, we just return a
// nil NUMANodeInfo, indicating that no NUMA information is available
// on this machine. This should implicitly be interpreted as having a
// single NUMA node with id 0 for all CPUs.
nodelist, err := ioutil.ReadFile("/sys/devices/system/node/possible")
if err != nil {
return nil, nil
}
// Parse the nodelist into a set of Node IDs
nodes, err := cpuset.Parse(strings.TrimSpace(string(nodelist)))
if err != nil {
return nil, err
}
info := make(NUMANodeInfo)
// For each node...
for _, node := range nodes.ToSlice() {
// Read the 'cpulist' of the NUMA node from sysfs.
path := fmt.Sprintf("/sys/devices/system/node/node%d/cpulist", node)
cpulist, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
// Convert the 'cpulist' into a set of CPUs.
cpus, err := cpuset.Parse(strings.TrimSpace(string(cpulist)))
if err != nil {
return nil, err
}
info[node] = cpus
}
return info, nil
}

View File

@ -21,27 +21,30 @@ import (
"testing" "testing"
cadvisorapi "github.com/google/cadvisor/info/v1" cadvisorapi "github.com/google/cadvisor/info/v1"
"k8s.io/kubernetes/pkg/kubelet/cm/cpuset"
) )
func Test_Discover(t *testing.T) { func Test_Discover(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
args *cadvisorapi.MachineInfo machineInfo cadvisorapi.MachineInfo
numaNodeInfo NUMANodeInfo
want *CPUTopology want *CPUTopology
wantErr bool wantErr bool
}{ }{
{ {
name: "FailNumCores", name: "FailNumCores",
args: &cadvisorapi.MachineInfo{ machineInfo: cadvisorapi.MachineInfo{
NumCores: 0, NumCores: 0,
}, },
numaNodeInfo: NUMANodeInfo{},
want: &CPUTopology{}, want: &CPUTopology{},
wantErr: true, wantErr: true,
}, },
{ {
name: "OneSocketHT", name: "OneSocketHT",
args: &cadvisorapi.MachineInfo{ machineInfo: cadvisorapi.MachineInfo{
NumCores: 8, NumCores: 8,
Topology: []cadvisorapi.Node{ Topology: []cadvisorapi.Node{
{Id: 0, {Id: 0,
@ -54,26 +57,29 @@ func Test_Discover(t *testing.T) {
}, },
}, },
}, },
numaNodeInfo: NUMANodeInfo{
0: cpuset.NewCPUSet(0, 1, 2, 3, 4, 5, 6, 7),
},
want: &CPUTopology{ want: &CPUTopology{
NumCPUs: 8, NumCPUs: 8,
NumSockets: 1, NumSockets: 1,
NumCores: 4, NumCores: 4,
CPUDetails: map[int]CPUInfo{ CPUDetails: map[int]CPUInfo{
0: {CoreID: 0, SocketID: 0}, 0: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
1: {CoreID: 1, SocketID: 0}, 1: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
2: {CoreID: 2, SocketID: 0}, 2: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
3: {CoreID: 3, SocketID: 0}, 3: {CoreID: 3, SocketID: 0, NUMANodeID: 0},
4: {CoreID: 0, SocketID: 0}, 4: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
5: {CoreID: 1, SocketID: 0}, 5: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
6: {CoreID: 2, SocketID: 0}, 6: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
7: {CoreID: 3, SocketID: 0}, 7: {CoreID: 3, SocketID: 0, NUMANodeID: 0},
}, },
}, },
wantErr: false, wantErr: false,
}, },
{ {
name: "DualSocketNoHT", name: "DualSocketNoHT",
args: &cadvisorapi.MachineInfo{ machineInfo: cadvisorapi.MachineInfo{
NumCores: 4, NumCores: 4,
Topology: []cadvisorapi.Node{ Topology: []cadvisorapi.Node{
{Id: 0, {Id: 0,
@ -90,22 +96,26 @@ func Test_Discover(t *testing.T) {
}, },
}, },
}, },
numaNodeInfo: NUMANodeInfo{
0: cpuset.NewCPUSet(0, 2),
1: cpuset.NewCPUSet(1, 3),
},
want: &CPUTopology{ want: &CPUTopology{
NumCPUs: 4, NumCPUs: 4,
NumSockets: 2, NumSockets: 2,
NumCores: 4, NumCores: 4,
CPUDetails: map[int]CPUInfo{ CPUDetails: map[int]CPUInfo{
0: {CoreID: 0, SocketID: 0}, 0: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
1: {CoreID: 1, SocketID: 1}, 1: {CoreID: 1, SocketID: 1, NUMANodeID: 1},
2: {CoreID: 2, SocketID: 0}, 2: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
3: {CoreID: 3, SocketID: 1}, 3: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
}, },
}, },
wantErr: false, wantErr: false,
}, },
{ {
name: "DualSocketHT - non unique Core'ID's", name: "DualSocketHT - non unique Core'ID's",
args: &cadvisorapi.MachineInfo{ machineInfo: cadvisorapi.MachineInfo{
NumCores: 12, NumCores: 12,
Topology: []cadvisorapi.Node{ Topology: []cadvisorapi.Node{
{Id: 0, {Id: 0,
@ -124,30 +134,34 @@ func Test_Discover(t *testing.T) {
}, },
}, },
}, },
numaNodeInfo: NUMANodeInfo{
0: cpuset.NewCPUSet(0, 6, 1, 7, 2, 8),
1: cpuset.NewCPUSet(3, 9, 4, 10, 5, 11),
},
want: &CPUTopology{ want: &CPUTopology{
NumCPUs: 12, NumCPUs: 12,
NumSockets: 2, NumSockets: 2,
NumCores: 6, NumCores: 6,
CPUDetails: map[int]CPUInfo{ CPUDetails: map[int]CPUInfo{
0: {CoreID: 0, SocketID: 0}, 0: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
1: {CoreID: 1, SocketID: 0}, 1: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
2: {CoreID: 2, SocketID: 0}, 2: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
3: {CoreID: 3, SocketID: 1}, 3: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
4: {CoreID: 4, SocketID: 1}, 4: {CoreID: 4, SocketID: 1, NUMANodeID: 1},
5: {CoreID: 5, SocketID: 1}, 5: {CoreID: 5, SocketID: 1, NUMANodeID: 1},
6: {CoreID: 0, SocketID: 0}, 6: {CoreID: 0, SocketID: 0, NUMANodeID: 0},
7: {CoreID: 1, SocketID: 0}, 7: {CoreID: 1, SocketID: 0, NUMANodeID: 0},
8: {CoreID: 2, SocketID: 0}, 8: {CoreID: 2, SocketID: 0, NUMANodeID: 0},
9: {CoreID: 3, SocketID: 1}, 9: {CoreID: 3, SocketID: 1, NUMANodeID: 1},
10: {CoreID: 4, SocketID: 1}, 10: {CoreID: 4, SocketID: 1, NUMANodeID: 1},
11: {CoreID: 5, SocketID: 1}, 11: {CoreID: 5, SocketID: 1, NUMANodeID: 1},
}, },
}, },
wantErr: false, wantErr: false,
}, },
{ {
name: "OneSocketHT fail", name: "OneSocketHT fail",
args: &cadvisorapi.MachineInfo{ machineInfo: cadvisorapi.MachineInfo{
NumCores: 8, NumCores: 8,
Topology: []cadvisorapi.Node{ Topology: []cadvisorapi.Node{
{Id: 0, {Id: 0,
@ -160,12 +174,13 @@ func Test_Discover(t *testing.T) {
}, },
}, },
}, },
numaNodeInfo: NUMANodeInfo{},
want: &CPUTopology{}, want: &CPUTopology{},
wantErr: true, wantErr: true,
}, },
{ {
name: "OneSocketHT fail", name: "OneSocketHT fail",
args: &cadvisorapi.MachineInfo{ machineInfo: cadvisorapi.MachineInfo{
NumCores: 8, NumCores: 8,
Topology: []cadvisorapi.Node{ Topology: []cadvisorapi.Node{
{Id: 0, {Id: 0,
@ -178,13 +193,14 @@ func Test_Discover(t *testing.T) {
}, },
}, },
}, },
numaNodeInfo: NUMANodeInfo{},
want: &CPUTopology{}, want: &CPUTopology{},
wantErr: true, wantErr: true,
}, },
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, err := Discover(tt.args) got, err := Discover(&tt.machineInfo, tt.numaNodeInfo)
if err != nil { if err != nil {
if tt.wantErr { if tt.wantErr {
t.Logf("Discover() expected error = %v", err) t.Logf("Discover() expected error = %v", err)

View File

@ -20,7 +20,6 @@ import (
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology"
"k8s.io/kubernetes/pkg/kubelet/cm/cpuset" "k8s.io/kubernetes/pkg/kubelet/cm/cpuset"
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask"
@ -69,29 +68,21 @@ func (m *manager) GetTopologyHints(pod v1.Pod, container v1.Container) map[strin
// available CPUs and the number of CPUs being requested. // available CPUs and the number of CPUs being requested.
// //
// It follows the convention of marking all hints that have the same number of // It follows the convention of marking all hints that have the same number of
// bits set as the narrowest matching SocketAffinity with 'Preferred: true', and // bits set as the narrowest matching NUMANodeAffinity with 'Preferred: true', and
// marking all others with 'Preferred: false'. // marking all others with 'Preferred: false'.
func (m *manager) generateCPUTopologyHints(availableCPUs cpuset.CPUSet, request int) []topologymanager.TopologyHint { func (m *manager) generateCPUTopologyHints(availableCPUs cpuset.CPUSet, request int) []topologymanager.TopologyHint {
// Discover topology in order to establish the number
// of available CPUs per socket.
topo, err := topology.Discover(m.machineInfo)
if err != nil {
klog.Warningf("[cpu manager] Error discovering topology for TopologyHint generation")
return nil
}
// Initialize minAffinity to a full affinity mask. // Initialize minAffinity to a full affinity mask.
minAffinity, _ := socketmask.NewSocketMask() minAffinity, _ := socketmask.NewSocketMask()
minAffinity.Fill() minAffinity.Fill()
// Iterate through all combinations of socketMasks and build hints from them. // Iterate through all combinations of socketMasks and build hints from them.
hints := []topologymanager.TopologyHint{} hints := []topologymanager.TopologyHint{}
socketmask.IterateSocketMasks(topo.CPUDetails.Sockets().ToSlice(), func(mask socketmask.SocketMask) { socketmask.IterateSocketMasks(m.topology.CPUDetails.NUMANodes().ToSlice(), func(mask socketmask.SocketMask) {
// Check to see if we have enough CPUs available on the current // Check to see if we have enough CPUs available on the current
// SocketMask to satisfy the CPU request. // SocketMask to satisfy the CPU request.
numMatching := 0 numMatching := 0
for _, c := range availableCPUs.ToSlice() { for _, c := range availableCPUs.ToSlice() {
if mask.IsSet(topo.CPUDetails[c].SocketID) { if mask.IsSet(m.topology.CPUDetails[c].NUMANodeID) {
numMatching++ numMatching++
} }
} }
@ -105,7 +96,7 @@ func (m *manager) generateCPUTopologyHints(availableCPUs cpuset.CPUSet, request
// list of hints. We set all hint preferences to 'false' on the first // list of hints. We set all hint preferences to 'false' on the first
// pass through. // pass through.
hints = append(hints, topologymanager.TopologyHint{ hints = append(hints, topologymanager.TopologyHint{
SocketAffinity: mask, NUMANodeAffinity: mask,
Preferred: false, Preferred: false,
}) })
@ -120,7 +111,7 @@ func (m *manager) generateCPUTopologyHints(availableCPUs cpuset.CPUSet, request
// to the minAffinity. Only those with an equal number of bits set will be // to the minAffinity. Only those with an equal number of bits set will be
// considered preferred. // considered preferred.
for i := range hints { for i := range hints {
if hints[i].SocketAffinity.Count() == minAffinity.Count() { if hints[i].NUMANodeAffinity.Count() == minAffinity.Count() {
hints[i].Preferred = true hints[i].Preferred = true
} }
} }

View File

@ -23,6 +23,7 @@ import (
cadvisorapi "github.com/google/cadvisor/info/v1" cadvisorapi "github.com/google/cadvisor/info/v1"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology"
"k8s.io/kubernetes/pkg/kubelet/cm/cpuset" "k8s.io/kubernetes/pkg/kubelet/cm/cpuset"
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask"
@ -32,7 +33,7 @@ func topologyHintLessThan(a topologymanager.TopologyHint, b topologymanager.Topo
if a.Preferred != b.Preferred { if a.Preferred != b.Preferred {
return a.Preferred == true return a.Preferred == true
} }
return a.SocketAffinity.IsNarrowerThan(b.SocketAffinity) return a.NUMANodeAffinity.IsNarrowerThan(b.NUMANodeAffinity)
} }
func TestGetTopologyHints(t *testing.T) { func TestGetTopologyHints(t *testing.T) {
@ -49,9 +50,7 @@ func TestGetTopologyHints(t *testing.T) {
secondSocketMask, _ := socketmask.NewSocketMask(1) secondSocketMask, _ := socketmask.NewSocketMask(1)
crossSocketMask, _ := socketmask.NewSocketMask(0, 1) crossSocketMask, _ := socketmask.NewSocketMask(0, 1)
m := manager{ machineInfo := cadvisorapi.MachineInfo{
policy: &staticPolicy{},
machineInfo: &cadvisorapi.MachineInfo{
NumCores: 12, NumCores: 12,
Topology: []cadvisorapi.Node{ Topology: []cadvisorapi.Node{
{Id: 0, {Id: 0,
@ -69,10 +68,23 @@ func TestGetTopologyHints(t *testing.T) {
}, },
}, },
}, },
}
numaNodeInfo := topology.NUMANodeInfo{
0: cpuset.NewCPUSet(0, 6, 1, 7, 2, 8),
1: cpuset.NewCPUSet(3, 9, 4, 10, 5, 11),
}
topology, _ := topology.Discover(&machineInfo, numaNodeInfo)
m := manager{
policy: &staticPolicy{
topology: topology,
}, },
state: &mockState{ state: &mockState{
defaultCPUSet: cpuset.NewCPUSet(2, 3, 4, 5, 6, 7, 8, 9, 10, 11), defaultCPUSet: cpuset.NewCPUSet(2, 3, 4, 5, 6, 7, 8, 9, 10, 11),
}, },
topology: topology,
} }
tcases := []struct { tcases := []struct {
@ -87,15 +99,15 @@ func TestGetTopologyHints(t *testing.T) {
container: *testContainer1, container: *testContainer1,
expectedHints: []topologymanager.TopologyHint{ expectedHints: []topologymanager.TopologyHint{
{ {
SocketAffinity: firstSocketMask, NUMANodeAffinity: firstSocketMask,
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: secondSocketMask, NUMANodeAffinity: secondSocketMask,
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: crossSocketMask, NUMANodeAffinity: crossSocketMask,
Preferred: false, Preferred: false,
}, },
}, },
@ -106,11 +118,11 @@ func TestGetTopologyHints(t *testing.T) {
container: *testContainer2, container: *testContainer2,
expectedHints: []topologymanager.TopologyHint{ expectedHints: []topologymanager.TopologyHint{
{ {
SocketAffinity: secondSocketMask, NUMANodeAffinity: secondSocketMask,
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: crossSocketMask, NUMANodeAffinity: crossSocketMask,
Preferred: false, Preferred: false,
}, },
}, },
@ -121,7 +133,7 @@ func TestGetTopologyHints(t *testing.T) {
container: *testContainer3, container: *testContainer3,
expectedHints: []topologymanager.TopologyHint{ expectedHints: []topologymanager.TopologyHint{
{ {
SocketAffinity: crossSocketMask, NUMANodeAffinity: crossSocketMask,
Preferred: true, Preferred: true,
}, },
}, },

View File

@ -62,10 +62,10 @@ type Store interface {
GetAffinity(podUID string, containerName string) TopologyHint GetAffinity(podUID string, containerName string) TopologyHint
} }
//TopologyHint is a struct containing a SocketMask for a Container //TopologyHint is a struct containing the NUMANodeAffinity for a Container
type TopologyHint struct { type TopologyHint struct {
SocketAffinity socketmask.SocketMask NUMANodeAffinity socketmask.SocketMask
// Preferred is set to true when the SocketMask encodes a preferred // Preferred is set to true when the NUMANodeAffinity encodes a preferred
// allocation for the Container. It is set to false otherwise. // allocation for the Container. It is set to false otherwise.
Preferred bool Preferred bool
} }
@ -149,7 +149,7 @@ func (m *manager) iterateAllProviderTopologyHints(allProviderHints [][]TopologyH
// Merge the hints from all hint providers to find the best one. // Merge the hints from all hint providers to find the best one.
func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) TopologyHint { func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) TopologyHint {
// Set the default hint to return from this function as an any-socket // Set the default hint to return from this function as an any-numa
// affinity with an unpreferred allocation. This will only be returned if // affinity with an unpreferred allocation. This will only be returned if
// no better hint can be found when merging hints from each hint provider. // no better hint can be found when merging hints from each hint provider.
defaultAffinity, _ := socketmask.NewSocketMask() defaultAffinity, _ := socketmask.NewSocketMask()
@ -164,9 +164,9 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
// Get the TopologyHints from a provider. // Get the TopologyHints from a provider.
hints := provider.GetTopologyHints(pod, container) hints := provider.GetTopologyHints(pod, container)
// If hints is empty, insert a single, preferred any-socket hint into allProviderHints. // If hints is nil, insert a single, preferred any-numa hint into allProviderHints.
if len(hints) == 0 { if len(hints) == 0 {
klog.Infof("[topologymanager] Hint Provider has no preference for socket affinity with any resource") klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with any resource")
affinity, _ := socketmask.NewSocketMask() affinity, _ := socketmask.NewSocketMask()
affinity.Fill() affinity.Fill()
allProviderHints = append(allProviderHints, []TopologyHint{{affinity, true}}) allProviderHints = append(allProviderHints, []TopologyHint{{affinity, true}})
@ -176,7 +176,7 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
// Otherwise, accumulate the hints for each resource type into allProviderHints. // Otherwise, accumulate the hints for each resource type into allProviderHints.
for resource := range hints { for resource := range hints {
if hints[resource] == nil { if hints[resource] == nil {
klog.Infof("[topologymanager] Hint Provider has no preference for socket affinity with resource '%s'", resource) klog.Infof("[topologymanager] Hint Provider has no preference for NUMA affinity with resource '%s'", resource)
affinity, _ := socketmask.NewSocketMask() affinity, _ := socketmask.NewSocketMask()
affinity.Fill() affinity.Fill()
allProviderHints = append(allProviderHints, []TopologyHint{{affinity, true}}) allProviderHints = append(allProviderHints, []TopologyHint{{affinity, true}})
@ -184,7 +184,7 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
} }
if len(hints[resource]) == 0 { if len(hints[resource]) == 0 {
klog.Infof("[topologymanager] Hint Provider has no possible socket affinities for resource '%s'", resource) klog.Infof("[topologymanager] Hint Provider has no possible NUMA affinities for resource '%s'", resource)
affinity, _ := socketmask.NewSocketMask() affinity, _ := socketmask.NewSocketMask()
affinity.Fill() affinity.Fill()
allProviderHints = append(allProviderHints, []TopologyHint{{affinity, false}}) allProviderHints = append(allProviderHints, []TopologyHint{{affinity, false}})
@ -197,37 +197,37 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
// Iterate over all permutations of hints in 'allProviderHints'. Merge the // Iterate over all permutations of hints in 'allProviderHints'. Merge the
// hints in each permutation by taking the bitwise-and of their affinity masks. // hints in each permutation by taking the bitwise-and of their affinity masks.
// Return the hint with the narrowest SocketAffinity of all merged // Return the hint with the narrowest NUMANodeAffinity of all merged
// permutations that have at least one socket set. If no merged mask can be // permutations that have at least one NUMA ID set. If no merged mask can be
// found that has at least one socket set, return the 'defaultHint'. // found that has at least one NUMA ID set, return the 'defaultHint'.
bestHint := defaultHint bestHint := defaultHint
m.iterateAllProviderTopologyHints(allProviderHints, func(permutation []TopologyHint) { m.iterateAllProviderTopologyHints(allProviderHints, func(permutation []TopologyHint) {
// Get the SocketAffinity from each hint in the permutation and see if any // Get the NUMANodeAffinity from each hint in the permutation and see if any
// of them encode unpreferred allocations. // of them encode unpreferred allocations.
preferred := true preferred := true
var socketAffinities []socketmask.SocketMask var numaAffinities []socketmask.SocketMask
for _, hint := range permutation { for _, hint := range permutation {
// Only consider hints that have an actual SocketAffinity set. // Only consider hints that have an actual NUMANodeAffinity set.
if hint.SocketAffinity != nil { if hint.NUMANodeAffinity != nil {
if !hint.Preferred { if !hint.Preferred {
preferred = false preferred = false
} }
socketAffinities = append(socketAffinities, hint.SocketAffinity) numaAffinities = append(numaAffinities, hint.NUMANodeAffinity)
} }
} }
// Merge the affinities using a bitwise-and operation. // Merge the affinities using a bitwise-and operation.
mergedAffinity, _ := socketmask.NewSocketMask() mergedAffinity, _ := socketmask.NewSocketMask()
mergedAffinity.Fill() mergedAffinity.Fill()
mergedAffinity.And(socketAffinities...) mergedAffinity.And(numaAffinities...)
// Build a mergedHintfrom the merged affinity mask, indicating if an // Build a mergedHintfrom the merged affinity mask, indicating if an
// preferred allocation was used to generate the affinity mask or not. // preferred allocation was used to generate the affinity mask or not.
mergedHint := TopologyHint{mergedAffinity, preferred} mergedHint := TopologyHint{mergedAffinity, preferred}
// Only consider mergedHints that result in a SocketAffinity > 0 to // Only consider mergedHints that result in a NUMANodeAffinity > 0 to
// replace the current bestHint. // replace the current bestHint.
if mergedHint.SocketAffinity.Count() == 0 { if mergedHint.NUMANodeAffinity.Count() == 0 {
return return
} }
@ -246,9 +246,9 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
} }
// If mergedHint and bestHint has the same preference, only consider // If mergedHint and bestHint has the same preference, only consider
// mergedHints that have a narrower SocketAffinity than the // mergedHints that have a narrower NUMANodeAffinity than the
// SocketAffinity in the current bestHint. // NUMANodeAffinity in the current bestHint.
if !mergedHint.SocketAffinity.IsNarrowerThan(bestHint.SocketAffinity) { if !mergedHint.NUMANodeAffinity.IsNarrowerThan(bestHint.NUMANodeAffinity) {
return return
} }

View File

@ -120,7 +120,7 @@ func TestCalculateAffinity(t *testing.T) {
name: "TopologyHint not set", name: "TopologyHint not set",
hp: []HintProvider{}, hp: []HintProvider{},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), NUMANodeAffinity: NewTestSocketMaskFull(),
Preferred: true, Preferred: true,
}, },
}, },
@ -132,7 +132,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), NUMANodeAffinity: NewTestSocketMaskFull(),
Preferred: true, Preferred: true,
}, },
}, },
@ -146,7 +146,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), NUMANodeAffinity: NewTestSocketMaskFull(),
Preferred: true, Preferred: true,
}, },
}, },
@ -160,18 +160,18 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), NUMANodeAffinity: NewTestSocketMaskFull(),
Preferred: false, Preferred: false,
}, },
}, },
{ {
name: "Single TopologyHint with Preferred as true and SocketAffinity as nil", name: "Single TopologyHint with Preferred as true and NUMANodeAffinity as nil",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: nil, NUMANodeAffinity: nil,
Preferred: true, Preferred: true,
}, },
}, },
@ -179,18 +179,18 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), NUMANodeAffinity: NewTestSocketMaskFull(),
Preferred: true, Preferred: true,
}, },
}, },
{ {
name: "Single TopologyHint with Preferred as false and SocketAffinity as nil", name: "Single TopologyHint with Preferred as false and NUMANodeAffinity as nil",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: nil, NUMANodeAffinity: nil,
Preferred: false, Preferred: false,
}, },
}, },
@ -198,7 +198,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), NUMANodeAffinity: NewTestSocketMaskFull(),
Preferred: true, Preferred: true,
}, },
}, },
@ -209,7 +209,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -219,7 +219,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -227,7 +227,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -238,7 +238,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -248,7 +248,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -256,7 +256,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -267,7 +267,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -277,7 +277,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: true, Preferred: true,
}, },
}, },
@ -285,7 +285,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -296,7 +296,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -306,7 +306,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: true, Preferred: true,
}, },
}, },
@ -314,7 +314,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -325,7 +325,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -335,7 +335,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -343,7 +343,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), NUMANodeAffinity: NewTestSocketMaskFull(),
Preferred: false, Preferred: false,
}, },
}, },
@ -354,7 +354,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -364,7 +364,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: false, Preferred: false,
}, },
}, },
@ -372,7 +372,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: false, Preferred: false,
}, },
}, },
@ -383,7 +383,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -393,7 +393,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: false, Preferred: false,
}, },
}, },
@ -401,7 +401,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: false, Preferred: false,
}, },
}, },
@ -413,7 +413,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -421,7 +421,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -433,7 +433,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -441,7 +441,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -452,11 +452,11 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -466,7 +466,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -474,7 +474,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -485,11 +485,11 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -499,7 +499,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -507,7 +507,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -518,11 +518,11 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -532,7 +532,7 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -540,7 +540,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: false, Preferred: false,
}, },
}, },
@ -551,11 +551,11 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -565,11 +565,11 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -577,7 +577,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
@ -588,11 +588,11 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -602,15 +602,15 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -618,7 +618,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -629,25 +629,25 @@ func TestCalculateAffinity(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource1": { "resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
"resource2": { "resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -655,7 +655,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
@ -665,8 +665,8 @@ func TestCalculateAffinity(t *testing.T) {
mngr := manager{} mngr := manager{}
mngr.hintProviders = tc.hp mngr.hintProviders = tc.hp
actual := mngr.calculateAffinity(v1.Pod{}, v1.Container{}) actual := mngr.calculateAffinity(v1.Pod{}, v1.Container{})
if !actual.SocketAffinity.IsEqual(tc.expected.SocketAffinity) { if !actual.NUMANodeAffinity.IsEqual(tc.expected.NUMANodeAffinity) {
t.Errorf("Expected SocketAffinity in result to be %v, got %v", tc.expected.SocketAffinity, actual.SocketAffinity) t.Errorf("Expected NUMANodeAffinity in result to be %v, got %v", tc.expected.NUMANodeAffinity, actual.NUMANodeAffinity)
} }
if actual.Preferred != tc.expected.Preferred { if actual.Preferred != tc.expected.Preferred {
t.Errorf("Expected Affinity preference in result to be %v, got %v", tc.expected.Preferred, actual.Preferred) t.Errorf("Expected Affinity preference in result to be %v, got %v", tc.expected.Preferred, actual.Preferred)
@ -801,11 +801,11 @@ func TestAdmit(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -823,15 +823,15 @@ func TestAdmit(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -849,7 +849,7 @@ func TestAdmit(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -867,11 +867,11 @@ func TestAdmit(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -889,15 +889,15 @@ func TestAdmit(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: NewTestSocketMask(0), NUMANodeAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(1), NUMANodeAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },
@ -915,7 +915,7 @@ func TestAdmit(t *testing.T) {
map[string][]TopologyHint{ map[string][]TopologyHint{
"resource": { "resource": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), NUMANodeAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
}, },
}, },