Skip to content

Commit d0f0b27

Browse files
authored
Merge pull request #627 from 283713406/find-correct-combination
Find correct combination with given NUMA node ID
2 parents 5fec391 + b5d4ee3 commit d0f0b27

File tree

2 files changed

+180
-0
lines changed

2 files changed

+180
-0
lines changed

pkg/noderesourcetopology/least_numa.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ func findSuitableCombination(identifier string, qos v1.PodQOSClass, numaNodes NU
197197
minDistance float32 = 256
198198
)
199199
for _, combination := range numaNodesCombination {
200+
if !isValidCombineResources(numaNodes, resources, combination) {
201+
continue
202+
}
200203
combinationResources := combineResources(numaNodes, combination)
201204
resourcesFit := checkResourcesFit(identifier, qos, resources, combinationResources)
202205

@@ -230,3 +233,14 @@ func checkResourcesFit(identifier string, qos v1.PodQOSClass, resources v1.Resou
230233

231234
return true
232235
}
236+
237+
func isValidCombineResources(numaNodes NUMANodeList, resources v1.ResourceList, combination []int) bool {
238+
for _, nodeIndex := range combination {
239+
for resourceName := range resources {
240+
if _, ok := numaNodes[nodeIndex].Resources[resourceName]; !ok {
241+
return false
242+
}
243+
}
244+
}
245+
return true
246+
}

pkg/noderesourcetopology/least_numa_test.go

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,104 @@ func TestNUMANodesRequired(t *testing.T) {
373373
expectedErr: nil,
374374
expectedMinDistance: true,
375375
},
376+
{
377+
description: "8 NUMA node non optimal distance, not sorted ids, odd digit NUMA node without memory",
378+
numaNodes: NUMANodeList{
379+
{
380+
NUMAID: 0,
381+
Resources: v1.ResourceList{
382+
gpuResource: resource.MustParse("1"),
383+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
384+
v1.ResourceMemory: resource.MustParse("5Gi"),
385+
},
386+
Costs: map[int]int{
387+
0: 10, 1: 20, 2: 40, 3: 30, 4: 20, 5: 30, 6: 50, 7: 40,
388+
},
389+
},
390+
{
391+
NUMAID: 3,
392+
Resources: v1.ResourceList{
393+
gpuResource: resource.MustParse("1"),
394+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
395+
},
396+
Costs: map[int]int{
397+
0: 30, 1: 40, 2: 20, 3: 10, 4: 30, 5: 20, 6: 40, 7: 50,
398+
},
399+
},
400+
{
401+
NUMAID: 5,
402+
Resources: v1.ResourceList{
403+
gpuResource: resource.MustParse("1"),
404+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
405+
},
406+
Costs: map[int]int{
407+
0: 30, 1: 20, 2: 50, 3: 20, 4: 50, 5: 10, 6: 50, 7: 40,
408+
},
409+
},
410+
{
411+
NUMAID: 7,
412+
Resources: v1.ResourceList{
413+
gpuResource: resource.MustParse("1"),
414+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
415+
},
416+
Costs: map[int]int{
417+
0: 40, 1: 50, 2: 30, 3: 50, 4: 20, 5: 40, 6: 30, 7: 10,
418+
},
419+
},
420+
{
421+
NUMAID: 1,
422+
Resources: v1.ResourceList{
423+
gpuResource: resource.MustParse("1"),
424+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
425+
},
426+
Costs: map[int]int{
427+
0: 20, 1: 10, 2: 30, 3: 40, 4: 50, 5: 20, 6: 40, 7: 50,
428+
},
429+
},
430+
{
431+
NUMAID: 6,
432+
Resources: v1.ResourceList{
433+
gpuResource: resource.MustParse("1"),
434+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
435+
v1.ResourceMemory: resource.MustParse("5Gi"),
436+
},
437+
Costs: map[int]int{
438+
0: 50, 1: 40, 2: 20, 3: 40, 4: 30, 5: 50, 6: 10, 7: 30,
439+
},
440+
},
441+
{
442+
NUMAID: 2,
443+
Resources: v1.ResourceList{
444+
gpuResource: resource.MustParse("1"),
445+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
446+
v1.ResourceMemory: resource.MustParse("5Gi"),
447+
},
448+
Costs: map[int]int{
449+
0: 40, 1: 30, 2: 10, 3: 20, 4: 40, 5: 50, 6: 20, 7: 30,
450+
},
451+
},
452+
{
453+
NUMAID: 4,
454+
Resources: v1.ResourceList{
455+
gpuResource: resource.MustParse("1"),
456+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
457+
v1.ResourceMemory: resource.MustParse("5Gi"),
458+
},
459+
Costs: map[int]int{
460+
0: 20, 1: 50, 2: 40, 3: 30, 4: 10, 5: 50, 6: 30, 7: 20,
461+
},
462+
},
463+
},
464+
podResources: v1.ResourceList{
465+
v1.ResourceCPU: *resource.NewQuantity(3, resource.DecimalSI),
466+
v1.ResourceMemory: resource.MustParse("2Gi"),
467+
gpuResource: resource.MustParse("3"),
468+
},
469+
node: node,
470+
expectedBitmask: NewTestBitmask(2, 4, 6),
471+
expectedErr: nil,
472+
expectedMinDistance: false,
473+
},
376474
{
377475
description: "4 NUMA node optimal distance, non sequential ids",
378476
numaNodes: NUMANodeList{
@@ -513,6 +611,74 @@ func TestNUMANodesRequired(t *testing.T) {
513611
expectedErr: nil,
514612
expectedMinDistance: false,
515613
},
614+
{
615+
description: "4 NUMA node non optimal distance, non sequential ids, NUMA node-2 and node-6 without memory",
616+
numaNodes: NUMANodeList{
617+
{
618+
NUMAID: 0,
619+
Resources: v1.ResourceList{
620+
gpuResource: resource.MustParse("1"),
621+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
622+
v1.ResourceMemory: resource.MustParse("5Gi"),
623+
},
624+
Costs: map[int]int{
625+
0: 10,
626+
2: 12,
627+
4: 20,
628+
6: 20,
629+
},
630+
},
631+
{
632+
NUMAID: 2,
633+
Resources: v1.ResourceList{
634+
gpuResource: resource.MustParse("1"),
635+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
636+
},
637+
Costs: map[int]int{
638+
0: 12,
639+
2: 10,
640+
4: 20,
641+
6: 20,
642+
},
643+
},
644+
{
645+
NUMAID: 4,
646+
Resources: v1.ResourceList{
647+
gpuResource: resource.MustParse("1"),
648+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
649+
v1.ResourceMemory: resource.MustParse("5Gi"),
650+
},
651+
Costs: map[int]int{
652+
0: 20,
653+
2: 20,
654+
4: 10,
655+
6: 12,
656+
},
657+
},
658+
{
659+
NUMAID: 6,
660+
Resources: v1.ResourceList{
661+
gpuResource: resource.MustParse("1"),
662+
v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI),
663+
},
664+
Costs: map[int]int{
665+
0: 20,
666+
2: 20,
667+
4: 12,
668+
6: 10,
669+
},
670+
},
671+
},
672+
podResources: v1.ResourceList{
673+
v1.ResourceCPU: *resource.NewQuantity(2, resource.DecimalSI),
674+
v1.ResourceMemory: resource.MustParse("2Gi"),
675+
gpuResource: resource.MustParse("2"),
676+
},
677+
node: node,
678+
expectedBitmask: NewTestBitmask(0, 4),
679+
expectedErr: nil,
680+
expectedMinDistance: false,
681+
},
516682
}
517683

518684
for _, tc := range testCases {

0 commit comments

Comments
 (0)