Skip to content

Commit 49bb4c3

Browse files
committed
chore: remove unneeded support for external CPU share in components
1 parent d0ead6f commit 49bb4c3

File tree

8 files changed

+17
-96
lines changed

8 files changed

+17
-96
lines changed

backend/src/main/java/net/laprun/sustainability/power/sensors/AbstractPowerSensor.java

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package net.laprun.sustainability.power.sensors;
22

3-
import java.util.Map;
43
import java.util.Set;
54

65
import org.eclipse.microprofile.config.inject.ConfigProperty;
76

87
import io.quarkus.logging.Log;
98
import net.laprun.sustainability.power.SensorMetadata;
10-
import net.laprun.sustainability.power.SensorUnit;
119

1210
public abstract class AbstractPowerSensor implements PowerSensor {
1311
protected final Measures measures;
@@ -16,7 +14,6 @@ public abstract class AbstractPowerSensor implements PowerSensor {
1614
@ConfigProperty(name = "power-server.enable-cpu-share-sampling", defaultValue = "false")
1715
protected boolean cpuSharesEnabled;
1816
private SensorMetadata metadata;
19-
private int externalCPUShareComponentIndex = -1;
2017

2118
public AbstractPowerSensor(Measures measures) {
2219
this.measures = measures;
@@ -30,14 +27,6 @@ public AbstractPowerSensor() {
3027
public SensorMetadata metadata() {
3128
if (metadata == null) {
3229
metadata = nativeMetadata();
33-
if (cpuSharesEnabled) {
34-
metadata = SensorMetadata.from(metadata)
35-
.withNewComponent(EXTERNAL_CPU_SHARE_COMPONENT_NAME,
36-
"CPU share estimate based on currently configured strategy used in CPUShare", false,
37-
SensorUnit.decimalPercentage)
38-
.build();
39-
externalCPUShareComponentIndex = metadata.metadataFor(EXTERNAL_CPU_SHARE_COMPONENT_NAME).index();
40-
}
4130
}
4231
return metadata;
4332
}
@@ -54,10 +43,6 @@ public void enableCPUShareSampling(boolean enable) {
5443
cpuSharesEnabled = enable;
5544
}
5645

57-
protected int externalCPUShareComponentIndex() {
58-
return externalCPUShareComponentIndex;
59-
}
60-
6146
@Override
6247
public RegisteredPID register(long pid) {
6348
Log.debugf("Registered pid: %d", pid);
@@ -98,22 +83,17 @@ public Set<String> getRegisteredPIDs() {
9883
protected abstract void doStart();
9984

10085
@Override
101-
public Measures update(Long tick, Map<String, Double> cpuShares) {
86+
public Measures update(long tick) {
10287
final long newUpdateStartEpoch = System.currentTimeMillis();
10388
Log.debugf("Sensor update last called: %dms ago", newUpdateStartEpoch - lastUpdateEpoch);
104-
final var measures = doUpdate(lastUpdateEpoch, newUpdateStartEpoch, cpuShares);
89+
final var measures = doUpdate(lastUpdateEpoch, newUpdateStartEpoch);
10590
lastUpdateEpoch = newUpdateStartEpoch;
10691
return measures;
10792
}
10893

109-
@Override
110-
public Measures update(long tick) {
111-
return update(tick, Map.of());
112-
}
113-
11494
protected long lastUpdateEpoch() {
11595
return lastUpdateEpoch;
11696
}
11797

118-
abstract protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch, Map<String, Double> cpuShares);
98+
abstract protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch);
11999
}

backend/src/main/java/net/laprun/sustainability/power/sensors/PowerSensor.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package net.laprun.sustainability.power.sensors;
22

3-
import java.util.Map;
43
import java.util.Set;
54

65
import net.laprun.sustainability.power.SensorMetadata;
@@ -9,9 +8,6 @@
98
* A representation of a power-consumption sensor.
109
*/
1110
public interface PowerSensor {
12-
String EXTERNAL_CPU_SHARE_COMPONENT_NAME = "externalCpuShare";
13-
Double MISSING_CPU_SHARE = -1.0;
14-
1511
/**
1612
* Whether the sensor supports process attribution of power, i.e. is measured power imputed to each process or does
1713
* attribution need to be performed externally to the sensor.
@@ -73,11 +69,8 @@ default void stop() {
7369
*
7470
* @param tick an ordinal value tracking the number of recorded measures being taken by the sensor since it started
7571
* measuring power consumption
76-
* @param cpuShares externally provided (if available) cpu attribution for each process id
7772
* @return the {@link Measures} object recording the measures this sensor has taken since it started measuring
7873
*/
79-
Measures update(Long tick, Map<String, Double> cpuShares);
80-
8174
Measures update(long tick);
8275

8376
/**

backend/src/main/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensor.java

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@
88
import java.util.function.BiConsumer;
99

1010
import io.quarkus.logging.Log;
11-
import net.laprun.sustainability.power.SensorMeasure;
1211
import net.laprun.sustainability.power.SensorMetadata;
1312
import net.laprun.sustainability.power.measures.NoDurationSensorMeasure;
1413
import net.laprun.sustainability.power.sensors.AbstractPowerSensor;
1514
import net.laprun.sustainability.power.sensors.Measures;
16-
import net.laprun.sustainability.power.sensors.RegisteredPID;
1715

1816
/**
1917
* A sensor using Intel's RAPL accessed via Linux' powercap system.
@@ -140,36 +138,16 @@ protected SensorMetadata nativeMetadata() {
140138
}
141139

142140
@Override
143-
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch, Map<String, Double> cpuShares) {
141+
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch) {
144142
final var measure = new double[metadata().componentCardinality()];
145143
readAndRecordSensor((value, index) -> {
146144
measure[index] = computePowerInMilliWatts(index, value, newUpdateStartEpoch);
147145
measure[index + rawOffset] = value;
148146
},
149147
newUpdateStartEpoch);
150148

151-
final var needMultipleMeasures = wantsCPUShareSamplingEnabled() && externalCPUShareComponentIndex() > 0;
152149
final var single = new NoDurationSensorMeasure(measure, lastUpdateEpoch, newUpdateStartEpoch);
153-
measures.trackedPIDs().forEach(pid -> {
154-
final SensorMeasure m;
155-
if (needMultipleMeasures) {
156-
double cpuShare;
157-
if (RegisteredPID.SYSTEM_TOTAL_REGISTERED_PID.equals(pid)) {
158-
cpuShare = 1.0;
159-
} else {
160-
cpuShare = cpuShares.getOrDefault(pid.pidAsString(), 0.0);
161-
}
162-
// todo: avoid copying array, external cpu share should be recorded as a separate value, not a component maybe?
163-
// copy array
164-
final var copy = new double[measure.length];
165-
System.arraycopy(measure, 0, copy, 0, measure.length);
166-
copy[externalCPUShareComponentIndex()] = cpuShare;
167-
m = new NoDurationSensorMeasure(copy, lastUpdateEpoch, newUpdateStartEpoch);
168-
} else {
169-
m = single;
170-
}
171-
measures.record(pid, m);
172-
});
150+
measures.trackedPIDs().forEach(pid -> measures.record(pid, single));
173151

174152
return measures;
175153
}

backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensor.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,7 @@ private static class Section {
118118
boolean done;
119119
}
120120

121-
Measures extractPowerMeasure(InputStream powerMeasureInput, long lastUpdateEpoch, long newUpdateEpoch,
122-
Map<String, Double> cpuShares) {
121+
Measures extractPowerMeasure(InputStream powerMeasureInput, long lastUpdateEpoch, long newUpdateEpoch) {
123122
if (Log.isDebugEnabled()) {
124123
final var start = System.currentTimeMillis();
125124
Log.debugf("powermetrics measure extraction last called %dms ago", (start - lastCalled));
@@ -214,12 +213,6 @@ Measures extractPowerMeasure(InputStream powerMeasureInput, long lastUpdateEpoch
214213
final var endMs = newUpdateEpoch;
215214
final var durationMs = duration;
216215

217-
// handle external cpu share if enabled
218-
if (cpuShares != null && !cpuShares.isEmpty()) {
219-
measures.trackedPIDsAsString().forEach(name -> powerComponents.put(EXTERNAL_CPU_SHARE_COMPONENT_NAME,
220-
cpuShares.getOrDefault(name, MISSING_CPU_SHARE)));
221-
}
222-
223216
// handle total system measure separately
224217
final var systemTotalMeasure = getSystemTotalMeasure(metadata, powerComponents);
225218
recordMeasure(RegisteredPID.SYSTEM_TOTAL_REGISTERED_PID, systemTotalMeasure, startMs, endMs, durationMs);
@@ -244,7 +237,7 @@ private static double[] getSystemTotalMeasure(SensorMetadata metadata, Map<Strin
244237
final var measure = new double[metadata.componentCardinality()];
245238
metadata.components().forEach((name, cm) -> {
246239
final var index = cm.index();
247-
final var value = CPU_SHARE.equals(name) || EXTERNAL_CPU_SHARE_COMPONENT_NAME.equals(name) ? 1.0
240+
final var value = CPU_SHARE.equals(name) ? 1.0
248241
: powerComponents.getOrDefault(name, 0).doubleValue();
249242
measure[index] = value;
250243
});
@@ -253,8 +246,8 @@ private static double[] getSystemTotalMeasure(SensorMetadata metadata, Map<Strin
253246
}
254247

255248
@Override
256-
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch, Map<String, Double> cpuShares) {
257-
return extractPowerMeasure(getInputStream(), lastUpdateEpoch, newUpdateStartEpoch, cpuShares);
249+
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch) {
250+
return extractPowerMeasure(getInputStream(), lastUpdateEpoch, newUpdateStartEpoch);
258251
}
259252

260253
protected abstract InputStream getInputStream();

backend/src/main/java/net/laprun/sustainability/power/sensors/macos/powermetrics/ResourceMacOSPowermetricsSensor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package net.laprun.sustainability.power.sensors.macos.powermetrics;
22

33
import java.io.InputStream;
4-
import java.util.Map;
54

65
import net.laprun.sustainability.power.sensors.Measures;
76

@@ -21,9 +20,9 @@ public ResourceMacOSPowermetricsSensor(String resourceName) {
2120
}
2221

2322
@Override
24-
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch, Map<String, Double> cpuShares) {
23+
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch) {
2524
// use the expected start measured time (if provided) for the measure instead of using the provided current epoch
26-
return super.doUpdate(start != -1 ? start : lastUpdateEpoch, newUpdateStartEpoch, cpuShares);
25+
return super.doUpdate(start != -1 ? start : lastUpdateEpoch, newUpdateStartEpoch);
2726
}
2827

2928
@Override

backend/src/main/java/net/laprun/sustainability/power/sensors/test/TestPowerSensor.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import static net.laprun.sustainability.power.SensorUnit.mW;
44

55
import java.util.List;
6-
import java.util.Map;
76

87
import net.laprun.sustainability.power.SensorMetadata;
98
import net.laprun.sustainability.power.measures.NoDurationSensorMeasure;
@@ -39,7 +38,7 @@ public void doStart() {
3938
}
4039

4140
@Override
42-
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch, Map<String, Double> cpuShares) {
41+
protected Measures doUpdate(long lastUpdateEpoch, long newUpdateStartEpoch) {
4342
measures.trackedPIDs().forEach(pid -> measures.record(pid,
4443
new NoDurationSensorMeasure(new double[] { Math.random() }, lastUpdateEpoch, newUpdateStartEpoch)));
4544
return measures;

backend/src/test/java/net/laprun/sustainability/power/sensors/linux/rapl/IntelRAPLSensorTest.java

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ void wattComputationShouldWork() throws Exception {
103103
sensor.start();
104104
Thread.sleep(10); // ensure we get enough time between the measure performed during start and the first update
105105
final var pid = sensor.register(1234L);
106-
final var measures = sensor.update(1L, Map.of());
106+
final var measures = sensor.update(1L);
107107
final var components = measures.getOrDefault(pid).components();
108108
assertEquals(2, components.length);
109109
assertEquals(2, raplFile.callCount());
@@ -113,25 +113,6 @@ void wattComputationShouldWork() throws Exception {
113113
assertEquals(20000, components[1]);
114114
}
115115

116-
@Test
117-
void shouldIncludeCPUShareIfRequested() throws Exception {
118-
final var raplFile = new TestRAPLFile(10000L, 20000L, 30000L);
119-
final var sensor = new TestIntelRAPLSensor(new TreeMap<>(Map.of("sensor", raplFile)));
120-
sensor.enableCPUShareSampling(true);
121-
sensor.start();
122-
final var pid = sensor.register(1234L);
123-
double cpuShare = 0.3;
124-
final var measures = sensor.update(1L, Map.of("1234", cpuShare));
125-
final var components = measures.getOrDefault(pid).components();
126-
assertEquals(3, components.length);
127-
assertEquals(2, raplFile.callCount());
128-
final var interval = raplFile.measureTimeFor(1) - raplFile.measureTimeFor(0);
129-
final var expected = (double) (raplFile.valueAt(1) - raplFile.valueAt(0)) / interval;
130-
assertEquals(expected, components[0]);
131-
assertEquals(20000, components[1]);
132-
assertEquals(cpuShare, components[2]);
133-
}
134-
135116
@SuppressWarnings("SameParameterValue")
136117
private SensorMetadata loadMetadata(String... fileNames) {
137118
Class<? extends IntelRAPLSensorTest> clazz = getClass();

backend/src/test/java/net/laprun/sustainability/power/sensors/macos/powermetrics/MacOSPowermetricsSensorTest.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44

5-
import java.util.Map;
6-
75
import org.junit.jupiter.api.Test;
86

97
import net.laprun.sustainability.power.SensorMetadata;
@@ -67,7 +65,7 @@ void extractPowerMeasureForM4() {
6765

6866
final var cpu = metadata.metadataFor(MacOSPowermetricsSensor.CPU);
6967
// re-open the stream to read the measure this time
70-
final var measure = sensor.update(0L, Map.of());
68+
final var measure = sensor.update(0L);
7169

7270
final var totalCPUPower = 420;
7371
final var totalCPUTime = 1287.34;
@@ -86,7 +84,7 @@ void checkTotalPowerMeasureEvenWhenRegisteredProcessIsNotFound() {
8684
sensor.register(-666);
8785

8886
// re-open the stream to read the measure this time
89-
final var measure = sensor.update(0L, Map.of());
87+
final var measure = sensor.update(0L);
9088

9189
assertEquals(0, getTotalSystemComponent(measure, metadata, MacOSPowermetricsSensor.ANE));
9290
assertEquals(19, getTotalSystemComponent(measure, metadata, MacOSPowermetricsSensor.DRAM));
@@ -111,7 +109,7 @@ void extractionShouldWorkForLowProcessIds() {
111109

112110
final var cpu = metadata.metadataFor(MacOSPowermetricsSensor.CPU);
113111
// re-open the stream to read the measure this time
114-
final var measure = sensor.update(0L, Map.of());
112+
final var measure = sensor.update(0L);
115113
// Process CPU power should be equal to sample ms/s divided for process (here: 116.64) by total samples (1222.65) times total CPU power
116114
var pidCPUShare = 116.64 / 1222.65;
117115
assertEquals(pidCPUShare * 211, getComponent(measure, pid0, cpu));
@@ -128,7 +126,7 @@ private static void checkPowerMeasure(String testFileName, float total, String t
128126
final var pid2 = sensor.register(391);
129127

130128
// re-open the stream to read the measure this time
131-
final var measure = sensor.update(0L, Map.of());
129+
final var measure = sensor.update(0L);
132130
final var totalMeasureMetadata = metadata.metadataFor(totalMeasureName);
133131
final var pid1CPUShare = 23.88 / 1222.65;
134132
assertEquals((pid1CPUShare * total), getComponent(measure, pid1, totalMeasureMetadata));

0 commit comments

Comments
 (0)