Merge pull request #513 from ClusterCockpit/dev

Dev
This commit is contained in:
Jan Eitzinger
2026-03-06 10:58:57 +01:00
committed by GitHub
5 changed files with 12 additions and 29 deletions

View File

@@ -271,6 +271,8 @@ For release specific notes visit the [ClusterCockpit Documentation](https://clus
## Known issues ## Known issues
- The new dynamic memory management is not bullet proof yet across restarts. We
will fix that in a subsequent patch release
- Currently energy footprint metrics of type energy are ignored for calculating - Currently energy footprint metrics of type energy are ignored for calculating
total energy. total energy.
- With energy footprint metrics of type power the unit is ignored and it is - With energy footprint metrics of type power the unit is ignored and it is

View File

@@ -395,6 +395,7 @@ func runServer(ctx context.Context) error {
// Set GC percent if not configured // Set GC percent if not configured
if os.Getenv(envGOGC) == "" { if os.Getenv(envGOGC) == "" {
// trigger GC when heap grows 15% above the previous live set
debug.SetGCPercent(15) debug.SetGCPercent(15)
} }
runtime.SystemdNotify(true, "running") runtime.SystemdNotify(true, "running")

View File

@@ -234,8 +234,6 @@
cluster={clusterInfos.find((c) => c.name == job.cluster)} cluster={clusterInfos.find((c) => c.name == job.cluster)}
subCluster={job.subCluster} subCluster={job.subCluster}
isShared={job.shared != "none"} isShared={job.shared != "none"}
numhwthreads={job.numHWThreads}
numaccs={job.numAcc}
zoomState={zoomStates[metric.data.name] || null} zoomState={zoomStates[metric.data.name] || null}
thresholdState={thresholdStates[metric.data.name] || null} thresholdState={thresholdStates[metric.data.name] || null}
{plotSync} {plotSync}

View File

@@ -43,8 +43,6 @@
subCluster, subCluster,
isShared = false, isShared = false,
forNode = false, forNode = false,
numhwthreads = 0,
numaccs = 0,
zoomState = null, zoomState = null,
thresholdState = null, thresholdState = null,
extendedLegendData = null, extendedLegendData = null,
@@ -83,9 +81,7 @@
const thresholds = $derived(findJobAggregationThresholds( const thresholds = $derived(findJobAggregationThresholds(
subClusterTopology, subClusterTopology,
metricConfig, metricConfig,
scope, scope
numhwthreads,
numaccs
)); ));
const longestSeries = $derived.by(() => { const longestSeries = $derived.by(() => {
if (useStatsSeries) { if (useStatsSeries) {
@@ -276,9 +272,7 @@
function findJobAggregationThresholds( function findJobAggregationThresholds(
subClusterTopology, subClusterTopology,
metricConfig, metricConfig,
scope, scope
numhwthreads,
numaccs
) { ) {
if (!subClusterTopology || !metricConfig || !scope) { if (!subClusterTopology || !metricConfig || !scope) {
@@ -303,22 +297,14 @@
} }
if (metricConfig?.aggregation == "sum") { if (metricConfig?.aggregation == "sum") {
// Scale Thresholds
let fraction;
if (numaccs > 0) fraction = subClusterTopology.accelerators.length / numaccs;
else if (numhwthreads > 0) fraction = subClusterTopology.core.length / numhwthreads;
else fraction = 1; // Fallback
let divisor; let divisor;
// Exclusive: Fraction = 1; Shared: Fraction > 1 if (scope == 'node') divisor = 1 // Node Scope: Always return unscaled (Maximum Scope)
if (scope == 'node') divisor = fraction; // Partial Scopes: Get from Topologies
// Cap divisor at number of available sockets or domains else if (scope == 'socket') divisor = subClusterTopology?.socket?.length || 1;
else if (scope == 'socket') divisor = (fraction < subClusterTopology.socket.length) ? subClusterTopology.socket.length : fraction; else if (scope == "memoryDomain") divisor = subClusterTopology?.memoryDomain?.length || 1;
else if (scope == "memoryDomain") divisor = (fraction < subClusterTopology.memoryDomain.length) ? subClusterTopology.socket.length : fraction; else if (scope == "core") divisor = subClusterTopology?.core?.length || 1;
// Use Maximum Division for Smallest Scopes else if (scope == "hwthread") divisor = subClusterTopology?.node?.length || 1;
else if (scope == "core") divisor = subClusterTopology.core.length; else if (scope == "accelerator") divisor = subClusterTopology?.accelerators?.length || 1;
else if (scope == "hwthread") divisor = subClusterTopology.core.length; // alt. name for core
else if (scope == "accelerator") divisor = subClusterTopology.accelerators.length;
else { else {
console.log('Unknown scope, return default aggregation thresholds for sum', scope) console.log('Unknown scope, return default aggregation thresholds for sum', scope)
divisor = 1; divisor = 1;

View File

@@ -178,8 +178,6 @@
timestep={selectedData.timestep} timestep={selectedData.timestep}
scope={selectedScope} scope={selectedScope}
metric={metricName} metric={metricName}
numaccs={job.numAcc}
numhwthreads={job.numHWThreads}
series={selectedSeries} series={selectedSeries}
{isShared} {isShared}
{zoomState} {zoomState}
@@ -194,8 +192,6 @@
timestep={selectedData.timestep} timestep={selectedData.timestep}
scope={selectedScope} scope={selectedScope}
metric={metricName} metric={metricName}
numaccs={job.numAcc}
numhwthreads={job.numHWThreads}
series={selectedSeries} series={selectedSeries}
{isShared} {isShared}
{zoomState} {zoomState}