diff --git a/html/input.php b/html/input.php index f8102e1..b519f05 100644 --- a/html/input.php +++ b/html/input.php @@ -17,7 +17,6 @@ function getNumaTopology(): array if (preg_match('/node (\d+) cpus:\s+(.*)/', $line, $m)) { $node = (int)$m[1]; $cpus = array_map('intval', preg_split('/\s+/', trim($m[2]))); - sort($cpus); $nodes[$node] = $cpus; } @@ -27,7 +26,7 @@ function getNumaTopology(): array return $nodes; } -/* Allocate core with EVEN-first, ODD-later round robin */ +/* Allocate core with EVEN-first, ODD-later, safe round robin */ function allocateCore(int $serviceId): array { global $coreFile; @@ -35,10 +34,7 @@ function allocateCore(int $serviceId): array $map = json_decode(file_get_contents($coreFile), true) ?: []; $nodes = getNumaTopology(); - $nodeIds = array_keys($nodes); - $nodeCount = count($nodeIds); - - if ($nodeCount === 0) { + if (empty($nodes)) { return ["node" => 0, "cpu" => 0]; } @@ -51,13 +47,13 @@ function allocateCore(int $serviceId): array $index = count($map); - /* Count total EVEN cores across all nodes */ + /* Count total EVEN cores */ $totalEven = 0; foreach ($even as $cpus) { $totalEven += count($cpus); } - /* Decide phase: EVEN cores first, then ODD */ + /* Select phase */ if ($index < $totalEven) { $phaseCpus = $even; $phaseIndex = $index; @@ -66,22 +62,35 @@ function allocateCore(int $serviceId): array $phaseIndex = $index - $totalEven; } + /* Build list of nodes that actually have CPUs in this phase */ + $activeNodes = []; + foreach ($phaseCpus as $n => $cpus) { + if (!empty($cpus)) { + $activeNodes[$n] = $cpus; + } + } + + if (empty($activeNodes)) { + // Absolute fallback (should never happen) + return ["node" => 0, "cpu" => 0]; + } + + $nodeIds = array_keys($activeNodes); + $nodeCount = count($nodeIds); + /* - * Round robin math - * nodeIndex = phaseIndex % nodeCount - * coreIndex = floor(phaseIndex / nodeCount) + * Correct round-robin math + * First exhaust core index across all nodes, + * then move to next core. */ $nodeIndex = $phaseIndex % $nodeCount; $coreIndex = intdiv($phaseIndex, $nodeCount); $node = $nodeIds[$nodeIndex]; + $cpuList = $activeNodes[$node]; - if (!isset($phaseCpus[$node][$coreIndex])) { - /* Wrap safely if uneven core counts */ - $coreIndex = $coreIndex % count($phaseCpus[$node]); - } - - $cpu = $phaseCpus[$node][$coreIndex]; + // Safe wrap (never divide by zero now) + $cpu = $cpuList[$coreIndex % count($cpuList)]; $map[$serviceId] = [ "node" => $node,