From a09ad348e0fffdaa8e75d6dbe637e36f228c74fa Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Tue, 12 Mar 2024 10:51:19 +0200 Subject: [PATCH 1/6] sysfs: add support for hybrid core architectures. Add support for hybrid core architectures by introducing core types. Add an interface for querying the available core types. Define core types for P- and E-cores and implement detection for those types. Signed-off-by: Krisztian Litkey --- pkg/sysfs/system.go | 137 ++++++++++++++++++++++++++++- pkg/sysfs/system_test.go | 16 ++++ pkg/sysfs/test-data-sample1.tar.xz | Bin 29860 -> 29952 bytes 3 files changed, 152 insertions(+), 1 deletion(-) diff --git a/pkg/sysfs/system.go b/pkg/sysfs/system.go index 606e36e28..de990de5c 100644 --- a/pkg/sysfs/system.go +++ b/pkg/sysfs/system.go @@ -100,6 +100,9 @@ type System interface { OnlineCPUs() cpuset.CPUSet IsolatedCPUs() cpuset.CPUSet OfflineCPUs() cpuset.CPUSet + CoreKindCPUs(CoreKind) cpuset.CPUSet + CoreKinds() []CoreKind + AllThreadsForCPUs(cpuset.CPUSet) cpuset.CPUSet Offlined() cpuset.CPUSet Isolated() cpuset.CPUSet @@ -118,6 +121,7 @@ type system struct { presentCPUs idset.IDSet // set of present CPUs onlineCPUs idset.IDSet // set of online CPUs isolatedCPUs idset.IDSet // set of isolated CPUs + coreKindCPUs map[CoreKind]idset.IDSet // CPU cores by kind (P-/E-cores) threads int // hyperthreads per core } @@ -194,6 +198,7 @@ type CPU interface { GetCacheByIndex(int) *Cache GetLastLevelCaches() []*Cache GetLastLevelCacheCPUSet() cpuset.CPUSet + CoreKind() CoreKind } type cpu struct { @@ -212,6 +217,7 @@ type cpu struct { isolated bool // whether this CPU is isolated sstClos int // SST-CP CLOS the CPU is associated with caches []*Cache // caches for this CPU + coreKind CoreKind // P- or E-core } // CPUFreq is a CPU frequency scaling range @@ -232,6 +238,25 @@ const ( EPPUnknown ) +// CoreKind represents high-level classification of CPU cores, currently P- and E-cores +type CoreKind int + +const ( + PerformanceCore CoreKind = iota + EfficientCore +) + +var ( + coreKindCPUPath = map[CoreKind]string{ + PerformanceCore: "devices/cpu_core/cpus", + EfficientCore: "devices/cpu_atom/cpus", + } + coreKindNames = map[CoreKind]string{ + PerformanceCore: "P-core", + EfficientCore: "E-core", + } +) + // MemInfo contains data read from a NUMA node meminfo file. type MemInfo struct { MemTotal uint64 @@ -352,6 +377,12 @@ func (sys *system) Discover(flags DiscoveryFlag) error { sys.Debug(" - offline: %s", sys.OfflineCPUs()) sys.Debug(" - isolated: %s", sys.IsolatedCPUs()) + for kind, name := range coreKindNames { + if cpus := sys.CoreKindCPUs(kind); !cpus.IsEmpty() { + sys.Debug(" - %8s: %s", name, sys.CoreKindCPUs(kind)) + } + } + for _, id := range sys.PackageIDs() { pkg := sys.packages[id] sys.Info("package #%d:", id) @@ -388,7 +419,7 @@ func (sys *system) Discover(flags DiscoveryFlag) error { sys.Debug(" die: %d", cpu.die) sys.Debug(" cluster: %d", cpu.cluster) sys.Debug(" node: %d", cpu.node) - sys.Debug(" core: %d", cpu.core) + sys.Debug(" core: %d (%s)", cpu.core, cpu.coreKind) sys.Debug(" threads: %s", cpu.threads) sys.Debug(" base freq: %d", cpu.baseFreq) sys.Debug(" freq: %d - %d", cpu.freq.min, cpu.freq.max) @@ -599,6 +630,30 @@ func (sys *system) OfflineCPUs() cpuset.CPUSet { return CPUSetFromIDSet(offline) } +// CoreKindCPUs gets the set of CPU cores by kind. +func (sys *system) CoreKindCPUs(kind CoreKind) cpuset.CPUSet { + return CPUSetFromIDSet(sys.coreKindCPUs[kind]) +} + +// CoreKinds gets CPU cores kinds present in the system. +func (sys *system) CoreKinds() []CoreKind { + kinds := []CoreKind{} + for kind := range sys.coreKindCPUs { + kinds = append(kinds, kind) + } + return kinds +} + +func (sys *system) AllThreadsForCPUs(cpus cpuset.CPUSet) cpuset.CPUSet { + all := cpuset.New() + for _, id := range cpus.UnsortedList() { + if cpu, ok := sys.cpus[id]; ok { + all = all.Union(cpu.ThreadCPUSet()) + } + } + return all +} + // Offlined gets the set of offlined CPUs. func (sys *system) Offlined() cpuset.CPUSet { return sys.OfflineCPUs() @@ -638,6 +693,22 @@ func (sys *system) discoverCPUs() error { sys.Error("failed to get set of isolated cpus: %v", err) } + sys.coreKindCPUs = make(map[CoreKind]idset.IDSet) + + for kind, entry := range coreKindCPUPath { + cpus := idset.NewIDSet() + _, err = readSysfsEntry(sys.path, entry, &cpus, ",") + if err != nil { + sys.Error("failed to get set of %s cpus: %v", kind, err) + if kind == PerformanceCore { + cpus = sys.onlineCPUs.Clone() + } + } + if cpus.Size() > 0 { + sys.coreKindCPUs[kind] = cpus + } + } + entries, _ := filepath.Glob(filepath.Join(sys.path, sysfsCPUPath, "cpu[0-9]*")) for _, entry := range entries { if err := sys.discoverCPU(entry); err != nil { @@ -645,6 +716,61 @@ func (sys *system) discoverCPUs() error { } } + for kind, ids := range sys.coreKindCPUs { + for id := range ids { + if !sys.OnlineCPUs().Contains(id) { + continue + } + cpu := sys.cpus[id] + cpu.coreKind = kind + } + } + + if err := sys.checkCoreKinds(); err != nil { + return err + } + + return nil +} + +// Perform a basic sanity checks of hybrid cores. +func (sys *system) checkCoreKinds() error { + // If we have not detected any explicit core types, assume all cores to be P-cores. + if len(sys.coreKindCPUs) == 0 { + sys.coreKindCPUs[PerformanceCore] = sys.onlineCPUs.Clone() + return nil + } + + var ( + kinds = map[CoreKind]cpuset.CPUSet{} + all = cpuset.New() + ) + + for kind := range sys.coreKindCPUs { + cores := sys.CoreKindCPUs(kind) + + // All core types must be thread-complete. + if missing := sys.AllThreadsForCPUs(cores).Difference(cores); !missing.IsEmpty() { + return fmt.Errorf("%s CPUs (%s) miss threads (%s)", kind, cores, missing) + } + + // A core can be of one type only. + for k, c := range kinds { + if common := cores.Intersection(c); !common.IsEmpty() { + return fmt.Errorf("%s CPUs (%s) and %s CPUs (%s) overlap (%s)", + kind, cores, k, c, common) + } + } + + kinds[kind] = cores + all = all.Union(cores) + } + + // All cores must be advertised as some type. + if missing := sys.OnlineCPUs().Difference(all); !missing.IsEmpty() { + return fmt.Errorf("some CPUs (%s) are neither marked to be of any core type", missing) + } + return nil } @@ -890,6 +1016,11 @@ func (c *cpu) GetLastLevelCacheCPUSet() cpuset.CPUSet { return cpus } +// CoreKind returns the core kind (P-/E-core) for this CPU. +func (c *cpu) CoreKind() CoreKind { + return c.coreKind +} + func (c *Cache) ID() int { if c == nil { return 0 @@ -1454,3 +1585,7 @@ func (t CacheType) String() string { } return "" } + +func (k CoreKind) String() string { + return coreKindNames[k] +} diff --git a/pkg/sysfs/system_test.go b/pkg/sysfs/system_test.go index 5c11284c5..d172ecc71 100644 --- a/pkg/sysfs/system_test.go +++ b/pkg/sysfs/system_test.go @@ -29,6 +29,7 @@ type ( ID = idset.ID System = sysfs.System CacheType = sysfs.CacheType + CoreKind = sysfs.CoreKind ) var ( @@ -42,6 +43,9 @@ const ( Instruction = sysfs.InstructionCache Unified = sysfs.UnifiedCache K = uint64(1024) + + PerformanceCore = sysfs.PerformanceCore + EfficientCore = sysfs.EfficientCore ) var _ = BeforeSuite(func() { @@ -195,3 +199,15 @@ var _ = DescribeTable("Logical/hyperthread-filtered cluster CPUSet", Entry("die #0, cluster #32", "sample1", 0, 0, 32, "8-11"), Entry("die #0, cluster #40", "sample1", 0, 0, 40, "12-15"), ) + +var _ = DescribeTable("P-/E-Core CPU detection", + func(sample string, kind CoreKind, cpus string) { + sys := sampleSysfs[sample] + Expect(sys).ToNot(BeNil()) + cset := sys.CoreKindCPUs(kind) + Expect(cset.String()).To(Equal(cpus)) + }, + + Entry("P-Cores", "sample1", PerformanceCore, "0-7"), + Entry("E-Cores", "sample1", EfficientCore, "8-15"), +) diff --git a/pkg/sysfs/test-data-sample1.tar.xz b/pkg/sysfs/test-data-sample1.tar.xz index 8d57e5ddb2b319506d45f2a7cf5511019ee8ca60..39535d63d1561ba366cbce07f8a65e705adcb56d 100644 GIT binary patch literal 29952 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 P6c;-%0{{R300dcD_Nnd< literal 29860 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

5^r=)9}RyKA32O&aS?9b5&2Rh(z>i$Ek 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 Date: Mon, 18 Mar 2024 11:24:34 +0200 Subject: [PATCH 2/6] sysfs: allow overriding core type detection. Allow overriding automatic core type detection using environment variables. Among other things, this can be used for e2e tests to emulate a hybrid architecture on non-hybrid hosts. Signed-off-by: Krisztian Litkey --- pkg/sysfs/system.go | 98 +++++++++++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 25 deletions(-) diff --git a/pkg/sysfs/system.go b/pkg/sysfs/system.go index de990de5c..0cd8bcc80 100644 --- a/pkg/sysfs/system.go +++ b/pkg/sysfs/system.go @@ -18,6 +18,7 @@ import ( "errors" "fmt" "io/fs" + "os" "path/filepath" "sort" "strconv" @@ -255,6 +256,10 @@ var ( PerformanceCore: "P-core", EfficientCore: "E-core", } + coreKindEnvOverrides = map[CoreKind]string{ + PerformanceCore: "OVERRIDE_SYS_CORE_CPUS", + EfficientCore: "OVERRIDE_SYS_ATOM_CPUS", + } ) // MemInfo contains data read from a NUMA node meminfo file. @@ -695,17 +700,32 @@ func (sys *system) discoverCPUs() error { sys.coreKindCPUs = make(map[CoreKind]idset.IDSet) - for kind, entry := range coreKindCPUPath { - cpus := idset.NewIDSet() - _, err = readSysfsEntry(sys.path, entry, &cpus, ",") - if err != nil { - sys.Error("failed to get set of %s cpus: %v", kind, err) - if kind == PerformanceCore { - cpus = sys.onlineCPUs.Clone() + for kind, name := range coreKindEnvOverrides { + if override := os.Getenv(name); override != "" { + log.Warn("using CPU core kind environment override (%s=%s)...", name, override) + cpus, err := cpuset.Parse(override) + if err != nil { + return fmt.Errorf("failed to parse %s env. override %q: %v", kind, override, err) + } + if cpus.Size() > 0 { + sys.coreKindCPUs[kind] = idset.NewIDSet(cpus.UnsortedList()...) } } - if cpus.Size() > 0 { - sys.coreKindCPUs[kind] = cpus + } + + if len(sys.coreKindCPUs) == 0 { + for kind, entry := range coreKindCPUPath { + cpus := idset.NewIDSet() + _, err = readSysfsEntry(sys.path, entry, &cpus, ",") + if err != nil { + sys.Error("failed to get set of %s cpus: %v", kind, err) + if kind == PerformanceCore { + cpus = sys.onlineCPUs.Clone() + } + } + if cpus.Size() > 0 { + sys.coreKindCPUs[kind] = cpus + } } } @@ -716,16 +736,6 @@ func (sys *system) discoverCPUs() error { } } - for kind, ids := range sys.coreKindCPUs { - for id := range ids { - if !sys.OnlineCPUs().Contains(id) { - continue - } - cpu := sys.cpus[id] - cpu.coreKind = kind - } - } - if err := sys.checkCoreKinds(); err != nil { return err } @@ -735,12 +745,41 @@ func (sys *system) discoverCPUs() error { // Perform a basic sanity checks of hybrid cores. func (sys *system) checkCoreKinds() error { - // If we have not detected any explicit core types, assume all cores to be P-cores. - if len(sys.coreKindCPUs) == 0 { + switch len(sys.coreKindCPUs) { + case 0: + // If we have not detected any explicit core types, assume all cores to be P-cores. sys.coreKindCPUs[PerformanceCore] = sys.onlineCPUs.Clone() - return nil + + case 1: + // Allow and fix up partial core type overrides. If we only have one core type, + // expand that type to be thread-complete. Since currently we only know of two + // core types, set up the other type to cover all the remaining/missing cores. + for kind, ids := range sys.coreKindCPUs { + given := kind + gcset := sys.AllThreadsForCPUs(CPUSetFromIDSet(ids)) + + if !gcset.Equals(sys.OnlineCPUs()) { + var other CoreKind + + if given == PerformanceCore { + other = EfficientCore + } else { + other = PerformanceCore + } + + ocset := sys.OnlineCPUs().Difference(gcset) + sys.coreKindCPUs[given] = idset.NewIDSet(gcset.UnsortedList()...) + sys.coreKindCPUs[other] = idset.NewIDSet(ocset.UnsortedList()...) + break + } + } } + // Perform sanity checks on the core types: + // - all core types must be thread-complete. + // - a core can be of one type only + // - all cores must be of some type + var ( kinds = map[CoreKind]cpuset.CPUSet{} all = cpuset.New() @@ -749,12 +788,12 @@ func (sys *system) checkCoreKinds() error { for kind := range sys.coreKindCPUs { cores := sys.CoreKindCPUs(kind) - // All core types must be thread-complete. + // core types must be thread-complete if missing := sys.AllThreadsForCPUs(cores).Difference(cores); !missing.IsEmpty() { return fmt.Errorf("%s CPUs (%s) miss threads (%s)", kind, cores, missing) } - // A core can be of one type only. + // a core can belong to only one type for k, c := range kinds { if common := cores.Intersection(c); !common.IsEmpty() { return fmt.Errorf("%s CPUs (%s) and %s CPUs (%s) overlap (%s)", @@ -766,11 +805,20 @@ func (sys *system) checkCoreKinds() error { all = all.Union(cores) } - // All cores must be advertised as some type. + // all cores must be of sometype if missing := sys.OnlineCPUs().Difference(all); !missing.IsEmpty() { return fmt.Errorf("some CPUs (%s) are neither marked to be of any core type", missing) } + // set/store core types per CPU + for kind, ids := range sys.coreKindCPUs { + for id := range ids { + if cpu, ok := sys.cpus[id]; ok { + cpu.coreKind = kind + } + } + } + return nil } From 7cdc6cc0e05eaac0a32d752135b75c170b9156b0 Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Mon, 18 Mar 2024 15:36:13 +0200 Subject: [PATCH 3/6] cpuallocator: update test data. Update sample/test sysfs data to report multiple/hybrid core types. Signed-off-by: Krisztian Litkey --- pkg/cpuallocator/testdata/sysfs.tar.bz2 | Bin 79541 -> 83740 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pkg/cpuallocator/testdata/sysfs.tar.bz2 b/pkg/cpuallocator/testdata/sysfs.tar.bz2 index 715dcf3ebc1d31a9bb911f9ff87b1f2a19b2a49d..ea325d12fe6bde65ce270e02066f9d6fe8542069 100644 GIT binary patch literal 83740 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 jfl>11 za14_IQ+|UiED0GOE&M_VDO@7uBxwFMa{)s}>KZni1HDESC-MvuL1ah3VAZck+V>~T z%n!_3fA)JNg|k$;YY4t{Ua=EnCLLUHEQ-w#vQ6e z#?RLvW5Z4)Nt^_W>4fBHX)x12_|pO&hDmBoT;n6h-~$i+qT>1w9H34HW-U%}GcFCm z71jsg1O=Og*Ai)zRLFejc+E7C*FQQd5Ri-F<0{4S#4N3QFBYEFI;_E;409eqy>M=v zwS#*>Ul`aV^m^ zyQX7Cre}ShEA4iLp6fo^OmZ#EY}xRb(zuOgs=XiE2<{aqf-fQeO^~E z+V7~E$lC9zI?CwGC4BXK9l=

A4>E_Ie#p|9MZ9P)esWVZ!%yJY(^J>bM1es`u+c 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 z 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 lGm|zMBglY^#ehe+ia?IQ`ph|V&Y5{Q>2e9G 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%0D4Mnyt168cyL<*(bVxb@eGHF- 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 From fe9be5aa2ee453e0839d9941bf3b37b8177871b9 Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Mon, 18 Mar 2024 16:13:20 +0200 Subject: [PATCH 4/6] cpuallocator: prefer E-cores for low-prio allocation. Classify all cores reported as E-cores by sysfs as low priority cores without looking at their cpufreq range. When sorting CPU sets for low-prio allocations, prefer the tightest fitting set which can satisfy the request with low-prio CPUs. Signed-off-by: Krisztian Litkey --- pkg/cpuallocator/allocator.go | 63 +++- pkg/cpuallocator/cpuallocator_test.go | 430 ++++++++++++++++++++++++++ 2 files changed, 480 insertions(+), 13 deletions(-) diff --git a/pkg/cpuallocator/allocator.go b/pkg/cpuallocator/allocator.go index ea8ad4282..c0af6dd07 100644 --- a/pkg/cpuallocator/allocator.go +++ b/pkg/cpuallocator/allocator.go @@ -88,10 +88,10 @@ type topologyCache struct { pkg map[idset.ID]cpuset.CPUSet node map[idset.ID]cpuset.CPUSet core map[idset.ID]cpuset.CPUSet + kind map[sysfs.CoreKind]cpuset.CPUSet cpuPriorities cpuPriorities // CPU priority mapping clusters []*cpuCluster // CPU clusters - } type cpuPriorities [NumCPUPriorities]cpuset.CPUSet @@ -101,6 +101,7 @@ type cpuCluster struct { die idset.ID cluster idset.ID cpus cpuset.CPUSet + kind sysfs.CoreKind } // IDFilter helps filtering Ids. @@ -200,6 +201,17 @@ func (a *allocatorHelper) takeIdleClusters() { var ( offline = a.sys.OfflineCPUs() pickIdle = func(c *cpuCluster) (bool, cpuset.CPUSet) { + // we only take E-clusters for low-prio requests + if a.prefer != PriorityLow && c.kind == sysfs.EfficientCore { + a.Debug(" - omit %s, CPU preference is %s", c, a.prefer) + return false, emptyCPUSet + } + // we only take P-clusters for other than low-prio requests + if a.prefer == PriorityLow && c.kind == sysfs.PerformanceCore { + a.Debug(" - omit %s, CPU preference is %s", c, a.prefer) + return false, emptyCPUSet + } + // we only take fully idle clusters cset := c.cpus.Difference(offline) free := cset.Intersection(a.from) @@ -826,7 +838,7 @@ func (c *topologyCache) sstClosPriority(sys sysfs.System, pkgID idset.ID) map[in func (c *topologyCache) discoverCpufreqPriority(sys sysfs.System, pkgID idset.ID) [NumCPUPriorities][]idset.ID { var prios [NumCPUPriorities][]idset.ID - // Group cpus by base frequency and energy performance profile + // Group cpus by base frequency, core kind and energy performance profile freqs := map[uint64][]idset.ID{} epps := map[sysfs.EPP][]idset.ID{} cpuIDs := c.pkg[pkgID].List() @@ -874,14 +886,19 @@ func (c *topologyCache) discoverCpufreqPriority(sys sysfs.System, pkgID idset.ID } } - // All cpus NOT in the lowest performance epp are considered high prio + // All E-cores are unconditionally considered low prio. + // All cpus NOT in the lowest performance epp are considered high prio. // NOTE: higher EPP value denotes lower performance preference - if len(eppList) > 1 { - epp := cpu.EPP() - if int(epp) < eppList[len(eppList)-1] { - p = PriorityHigh - } else { - p = PriorityLow + if cpu.CoreKind() == sysfs.EfficientCore { + p = PriorityLow + } else { + if len(eppList) > 1 { + epp := cpu.EPP() + if int(epp) < eppList[len(eppList)-1] { + p = PriorityHigh + } else { + p = PriorityLow + } } } @@ -907,18 +924,24 @@ func (c *topologyCache) discoverCPUClusters(sys sysfs.System) { die: die, cluster: cl, cpus: cpus, + kind: sys.CPU(cpus.List()[0]).CoreKind(), }) } } if len(clusters) > 1 { log.Debug("package #%d has %d clusters:", id, len(clusters)) for _, cl := range clusters { - log.Debug(" die #%d, cluster #%d: cpus %s", - cl.die, cl.cluster, cl.cpus) + log.Debug(" die #%d, cluster #%d: %s cpus %s", + cl.die, cl.cluster, cl.kind, cl.cpus) } c.clusters = append(c.clusters, clusters...) } } + + c.kind = map[sysfs.CoreKind]cpuset.CPUSet{} + for _, kind := range sys.CoreKinds() { + c.kind[kind] = sys.CoreKindCPUs(kind) + } } func (p CPUPriority) String() string { @@ -943,6 +966,20 @@ func (c *cpuPriorities) cmpCPUSet(csetA, csetB cpuset.CPUSet, prefer CPUPriority return 0 } + // For low prio request, favor cpuset with the tightest fit. + if cpuCnt > 0 && prefer == PriorityLow { + prefA := csetA.Intersection(c[prefer]).Size() + prefB := csetB.Intersection(c[prefer]).Size() + // both sets have enough preferred CPUs, return the smaller one (tighter fit) + if prefA >= cpuCnt && prefB >= cpuCnt { + return prefB - prefA + } + // only one set has enough preferred CPUs, return the bigger/only one + if prefA >= cpuCnt || prefB >= cpuCnt { + return prefA - prefB + } + } + // Favor cpuset having CPUs with priorities equal to or lower than what was requested for prio := prefer; prio < NumCPUPriorities; prio++ { prefA := csetA.Intersection(c[prio]).Size() @@ -984,6 +1021,6 @@ func (c *cpuCluster) HasSmallerIDsThan(o *cpuCluster) bool { } func (c *cpuCluster) String() string { - return fmt.Sprintf("cluster #%d/%d/%d, %d CPUs (%s)", c.pkg, c.die, c.cluster, - c.cpus.Size(), c.cpus) + return fmt.Sprintf("cluster #%d/%d/%d, %d %s CPUs (%s)", c.pkg, c.die, c.cluster, + c.cpus.Size(), c.kind, c.cpus) } diff --git a/pkg/cpuallocator/cpuallocator_test.go b/pkg/cpuallocator/cpuallocator_test.go index bfaeed5d6..c4dd6dc3b 100644 --- a/pkg/cpuallocator/cpuallocator_test.go +++ b/pkg/cpuallocator/cpuallocator_test.go @@ -317,3 +317,433 @@ func TestClusteredAllocation(t *testing.T) { }) } } + +func TestClusteredCoreKindAllocation(t *testing.T) { + if v := os.Getenv("ENABLE_DEBUG"); v != "" { + logger.EnableDebug(logSource) + } + + // Create tmpdir and decompress testdata there + tmpdir, err := ioutil.TempDir("", "nri-resource-policy-test-") + if err != nil { + t.Fatalf("failed to create tmpdir: %v", err) + } + defer os.RemoveAll(tmpdir) + + if err := utils.UncompressTbz2(path.Join("testdata", "sysfs.tar.bz2"), tmpdir); err != nil { + t.Fatalf("failed to decompress testdata: %v", err) + } + + // Discover mock system from the testdata + sys, err := sysfs.DiscoverSystemAt( + path.Join(tmpdir, "sysfs", "2-socket-4-node-40-core", "sys"), + sysfs.DiscoverCPUTopology, sysfs.DiscoverMemTopology) + if err != nil { + t.Fatalf("failed to discover mock system: %v", err) + } + + cluster1 := []*cpuCluster{ + { + pkg: 0, + die: 0, + cluster: 0, + cpus: cpuset.MustParse("0-3"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 1, + cpus: cpuset.MustParse("4-7"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 2, + cpus: cpuset.MustParse("8-11"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 3, + cpus: cpuset.MustParse("12-15"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 4, + cpus: cpuset.MustParse("16-19"), + kind: sysfs.EfficientCore, + }, + { + pkg: 0, + die: 0, + cluster: 5, + cpus: cpuset.MustParse("40-43"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 6, + cpus: cpuset.MustParse("44-47"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 7, + cpus: cpuset.MustParse("48-51"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 8, + cpus: cpuset.MustParse("52-55"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 9, + cpus: cpuset.MustParse("56-59"), + kind: sysfs.EfficientCore, + }, + + { + pkg: 1, + die: 0, + cluster: 0, + cpus: cpuset.MustParse("20,22,24,26"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 1, + cpus: cpuset.MustParse("21,23,25,27"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 2, + cpus: cpuset.MustParse("28-31"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 3, + cpus: cpuset.MustParse("32-35"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 4, + cpus: cpuset.MustParse("36-39"), + kind: sysfs.EfficientCore, + }, + { + pkg: 1, + die: 0, + cluster: 5, + cpus: cpuset.MustParse("60-63"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 6, + cpus: cpuset.MustParse("64-67"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 7, + cpus: cpuset.MustParse("68-71"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 8, + cpus: cpuset.MustParse("72-75"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 9, + cpus: cpuset.MustParse("76-79"), + kind: sysfs.EfficientCore, + }, + } + + cluster2 := []*cpuCluster{ + { + pkg: 0, + die: 0, + cluster: 0, + cpus: cpuset.MustParse("0-3"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 1, + cpus: cpuset.MustParse("4-7"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 2, + cpus: cpuset.MustParse("8-11"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 3, + cpus: cpuset.MustParse("12-15"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 4, + cpus: cpuset.MustParse("16-19"), + kind: sysfs.EfficientCore, + }, + { + pkg: 0, + die: 0, + cluster: 5, + cpus: cpuset.MustParse("40-43"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 6, + cpus: cpuset.MustParse("44-47"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 7, + cpus: cpuset.MustParse("48-51"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 8, + cpus: cpuset.MustParse("52-55"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 0, + die: 0, + cluster: 9, + cpus: cpuset.MustParse("56-59"), + kind: sysfs.EfficientCore, + }, + + { + pkg: 1, + die: 0, + cluster: 0, + cpus: cpuset.MustParse("20,22,24,26"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 1, + cpus: cpuset.MustParse("21,23,25,27"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 2, + cpus: cpuset.MustParse("28-31"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 3, + cpus: cpuset.MustParse("32-35"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 4, + cpus: cpuset.MustParse("36-37"), + kind: sysfs.EfficientCore, + }, + { + pkg: 1, + die: 0, + cluster: 5, + cpus: cpuset.MustParse("38-39"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 6, + cpus: cpuset.MustParse("60-63"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 7, + cpus: cpuset.MustParse("64-67"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 8, + cpus: cpuset.MustParse("68-71"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 9, + cpus: cpuset.MustParse("72-75"), + kind: sysfs.PerformanceCore, + }, + { + pkg: 1, + die: 0, + cluster: 10, + cpus: cpuset.MustParse("76-79"), + kind: sysfs.EfficientCore, + }, + } + + pkg0 := cpuset.MustParse("0-19,40-59") + pkg1 := cpuset.MustParse("20-39,60-79") + all := pkg0.Union(pkg1) + + tcs := []struct { + description string + clusters []*cpuCluster + from cpuset.CPUSet + prefer CPUPriority + cnt int + expected cpuset.CPUSet + }{ + { + description: "P-cores worth one cluster", + clusters: cluster1, + from: all, + prefer: PriorityNormal, + cnt: 4, + expected: cpuset.MustParse("0-3"), + }, + { + description: "P-cores worth 2 clusters", + clusters: cluster1, + from: all, + prefer: PriorityNormal, + cnt: 8, + expected: cpuset.MustParse("0-7"), + }, + { + description: "P-cores worth all clusters in a package", + clusters: cluster1, + from: all, + prefer: PriorityNormal, + cnt: 32, + expected: cpuset.MustParse("0-15,40-55"), + }, + { + description: "E-cores worth 1 cluster", + clusters: cluster1, + from: all, + prefer: PriorityLow, + cnt: 4, + expected: cpuset.MustParse("16-19"), + }, + { + description: "E-cores worth 2 clusters", + clusters: cluster1, + from: all, + prefer: PriorityLow, + cnt: 8, + expected: cpuset.MustParse("16-19,56-59"), + }, + { + description: "P-cores worth 1 cluster more than in the 1st package", + clusters: cluster1, + from: all, + prefer: PriorityNormal, + cnt: 36, + expected: cpuset.MustParse("0-15,40-55,20,22,24,26"), + }, + { + description: "P-cores worth 2 clusters more than in the 1st package", + clusters: cluster1, + from: all, + prefer: PriorityNormal, + cnt: 40, + expected: cpuset.MustParse("0-15,20-27,40-55"), + }, + { + description: "E-cores worth 1 clusters, should take tighter fit", + clusters: cluster2, + from: all, + prefer: PriorityLow, + cnt: 2, + expected: cpuset.MustParse("36-37"), + }, + { + description: "E-cores worth 2 clusters, should take tighter fit", + clusters: cluster2, + from: all, + prefer: PriorityLow, + cnt: 6, + expected: cpuset.MustParse("36-37,76-79"), + }, + { + description: "E-cores worth 2 clusters, should take single die", + clusters: cluster2, + from: all, + prefer: PriorityLow, + cnt: 8, + expected: cpuset.MustParse("16-19,56-59"), + }, + } + + // Run tests + for _, tc := range tcs { + t.Run(tc.description, func(t *testing.T) { + topoCache := newTopologyCache(sys) + topoCache.clusters = tc.clusters + a := newAllocatorHelper(sys, topoCache) + a.from = tc.from + a.prefer = tc.prefer + a.cnt = tc.cnt + result := a.allocate() + if !result.Equals(tc.expected) { + t.Errorf("expected %q, result was %q", tc.expected, result) + } + }) + } +} From dbf3a3a55d1bcb42cf91103da34e2123451766c0 Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Sat, 23 Mar 2024 19:58:19 +0200 Subject: [PATCH 5/6] cpuallocator: prefer P-cores for high-prio allocation. When sorting CPU sets for high-prio allocations, prefer the tightest fitting set which can satisfy the request with high-prio or normal-prio CPUs. Signed-off-by: Krisztian Litkey --- pkg/cpuallocator/allocator.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pkg/cpuallocator/allocator.go b/pkg/cpuallocator/allocator.go index c0af6dd07..c94d8e834 100644 --- a/pkg/cpuallocator/allocator.go +++ b/pkg/cpuallocator/allocator.go @@ -980,6 +980,24 @@ func (c *cpuPriorities) cmpCPUSet(csetA, csetB cpuset.CPUSet, prefer CPUPriority } } + // For high prio request, favor the tightest fit falling back to normal prio + if cpuCnt > 0 && prefer == PriorityHigh { + prefA := csetA.Intersection(c[prefer]).Size() + prefB := csetB.Intersection(c[prefer]).Size() + if prefA == 0 && prefB == 0 { + prefA = csetA.Intersection(c[PriorityNormal]).Size() + prefB = csetB.Intersection(c[PriorityNormal]).Size() + } + // both sets have enough preferred CPUs, return the smaller one (tighter fit) + if prefA >= cpuCnt && prefB >= cpuCnt { + return prefB - prefA + } + // only one set has enough preferred CPUs, return the bigger/only one + if prefA >= cpuCnt || prefB >= cpuCnt { + return prefA - prefB + } + } + // Favor cpuset having CPUs with priorities equal to or lower than what was requested for prio := prefer; prio < NumCPUPriorities; prio++ { prefA := csetA.Intersection(c[prio]).Size() From fef72fc11e05ea3ee9e985c7dcc09eedb638b203 Mon Sep 17 00:00:00 2001 From: Krisztian Litkey Date: Mon, 18 Mar 2024 15:44:22 +0200 Subject: [PATCH 6/6] cpuallocator: make idle package allocation core type aware. When allocating idle packages, consider a package idle if all online cores *with preferred priorities* for that allocation are idle. Also, from the picked packages take cores with this same restriction. In particular, on hybrid architectures with multiple core types, this will exclude - E-cores from allocations with Priority{Normal,High} preference - P-cores from allocations with PriorityLow preference Signed-off-by: Krisztian Litkey --- pkg/cpuallocator/allocator.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pkg/cpuallocator/allocator.go b/pkg/cpuallocator/allocator.go index c94d8e834..5be5b8c71 100644 --- a/pkg/cpuallocator/allocator.go +++ b/pkg/cpuallocator/allocator.go @@ -160,7 +160,14 @@ func (a *allocatorHelper) takeIdlePackages() { // pick idle packages pkgs := pickIds(a.sys.PackageIDs(), func(id idset.ID) bool { + // Consider a package idle if all online preferred CPUs are idle. + // In particular, on hybrid core architectures exclude + // - exclude E-cores from allocations with <= PriorityNormal preference + // - exclude P-cores from allocations with > PriorityLow preferences cset := a.topology.pkg[id].Difference(offline) + if a.prefer < NumCPUPriorities { + cset = cset.Intersection(a.topology.cpuPriorities[a.prefer]) + } return cset.Intersection(a.from).Equals(cset) }) @@ -178,6 +185,9 @@ func (a *allocatorHelper) takeIdlePackages() { // take as many idle packages as we need/can for _, id := range pkgs { cset := a.topology.pkg[id].Difference(offline) + if a.prefer < NumCPUPriorities { + cset = cset.Intersection(a.topology.cpuPriorities[a.prefer]) + } a.Debug(" => considering package %v (#%s)...", id, cset) if a.cnt >= cset.Size() { a.Debug(" => taking package %v...", id) @@ -704,9 +714,17 @@ func (c *topologyCache) discoverCPUPriorities(sys sysfs.System) { cpuPriorities = c.discoverCpufreqPriority(sys, id) } + ecores := c.kind[sysfs.EfficientCore] + ocores := sys.OnlineCPUs().Difference(ecores) + for p, cpus := range cpuPriorities { source := map[bool]string{true: "sst", false: "cpufreq"}[sstActive] cset := sysfs.CPUSetFromIDSet(idset.NewIDSet(cpus...)) + + if p != int(PriorityLow) && ocores.Size() > 0 { + cset = cset.Difference(ecores) + } + log.Debug("package #%d (%s): %d %s priority cpus (%v)", id, source, len(cpus), CPUPriority(p), cset) prio[p] = prio[p].Union(cset) }