Merge "PowerStats: adjust time since boot to epoch before writing to disk" into sc-dev

This commit is contained in:
Thierry Strudel
2021-02-25 21:29:45 +00:00
committed by Android (Google) Code Review
4 changed files with 57 additions and 6 deletions

View File

@@ -144,7 +144,7 @@ message StateResidencyProto {
*/ */
optional int64 total_state_entry_count = 3; optional int64 total_state_entry_count = 3;
/** /**
* Last time this state was entered. Time in milliseconds since boot * Last time this state was entered. Walltime in milliseconds since Unix epoch.
*/ */
optional int64 last_entry_timestamp_ms = 4; optional int64 last_entry_timestamp_ms = 4;
} }
@@ -208,7 +208,7 @@ message EnergyConsumerResultProto {
/** Unique index identifying the energy consumer. */ /** Unique index identifying the energy consumer. */
optional int32 id = 1; optional int32 id = 1;
/** Time since device boot(CLOCK_BOOTTIME) in milli-seconds */ /** Walltime in milliseconds since Unix epoch */
optional int64 timestamp_ms = 2; optional int64 timestamp_ms = 2;
/** Accumulated energy since device boot in microwatt-seconds (uWs) */ /** Accumulated energy since device boot in microwatt-seconds (uWs) */
@@ -247,7 +247,7 @@ message EnergyMeasurementProto {
*/ */
optional int32 id = 1; optional int32 id = 1;
/** Time since device boot(CLOCK_BOOTTIME) in milli-seconds */ /** Walltime in milliseconds since Unix epoch */
optional int64 timestamp_ms = 2; optional int64 timestamp_ms = 2;
/** Accumulated energy since device boot in microwatt-seconds (uWs) */ /** Accumulated energy since device boot in microwatt-seconds (uWs) */

View File

@@ -16,6 +16,8 @@
package com.android.server.powerstats; package com.android.server.powerstats;
import static java.lang.System.currentTimeMillis;
import android.content.Context; import android.content.Context;
import android.hardware.power.stats.Channel; import android.hardware.power.stats.Channel;
import android.hardware.power.stats.EnergyConsumer; import android.hardware.power.stats.EnergyConsumer;
@@ -26,11 +28,14 @@ import android.hardware.power.stats.StateResidencyResult;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.SystemClock;
import android.util.AtomicFile; import android.util.AtomicFile;
import android.util.Slog; import android.util.Slog;
import android.util.proto.ProtoInputStream; import android.util.proto.ProtoInputStream;
import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper; import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils; import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils;
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerResultUtils; import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerResultUtils;
@@ -61,6 +66,8 @@ public final class PowerStatsLogger extends Handler {
protected static final int MSG_LOG_TO_DATA_STORAGE_LOW_FREQUENCY = 1; protected static final int MSG_LOG_TO_DATA_STORAGE_LOW_FREQUENCY = 1;
protected static final int MSG_LOG_TO_DATA_STORAGE_HIGH_FREQUENCY = 2; protected static final int MSG_LOG_TO_DATA_STORAGE_HIGH_FREQUENCY = 2;
// TODO(b/181240441): Add a listener to update the Wall clock baseline when changed
private final long mStartWallTime;
private final PowerStatsDataStorage mPowerStatsMeterStorage; private final PowerStatsDataStorage mPowerStatsMeterStorage;
private final PowerStatsDataStorage mPowerStatsModelStorage; private final PowerStatsDataStorage mPowerStatsModelStorage;
private final PowerStatsDataStorage mPowerStatsResidencyStorage; private final PowerStatsDataStorage mPowerStatsResidencyStorage;
@@ -79,6 +86,8 @@ public final class PowerStatsLogger extends Handler {
// Log power meter data. // Log power meter data.
EnergyMeasurement[] energyMeasurements = EnergyMeasurement[] energyMeasurements =
mPowerStatsHALWrapper.readEnergyMeter(new int[0]); mPowerStatsHALWrapper.readEnergyMeter(new int[0]);
EnergyMeasurementUtils.adjustTimeSinceBootToEpoch(energyMeasurements,
mStartWallTime);
mPowerStatsMeterStorage.write( mPowerStatsMeterStorage.write(
EnergyMeasurementUtils.getProtoBytes(energyMeasurements)); EnergyMeasurementUtils.getProtoBytes(energyMeasurements));
if (DEBUG) EnergyMeasurementUtils.print(energyMeasurements); if (DEBUG) EnergyMeasurementUtils.print(energyMeasurements);
@@ -86,6 +95,8 @@ public final class PowerStatsLogger extends Handler {
// Log power model data without attribution data. // Log power model data without attribution data.
EnergyConsumerResult[] ecrNoAttribution = EnergyConsumerResult[] ecrNoAttribution =
mPowerStatsHALWrapper.getEnergyConsumed(new int[0]); mPowerStatsHALWrapper.getEnergyConsumed(new int[0]);
EnergyConsumerResultUtils.adjustTimeSinceBootToEpoch(ecrNoAttribution,
mStartWallTime);
mPowerStatsModelStorage.write( mPowerStatsModelStorage.write(
EnergyConsumerResultUtils.getProtoBytes(ecrNoAttribution, false)); EnergyConsumerResultUtils.getProtoBytes(ecrNoAttribution, false));
if (DEBUG) EnergyConsumerResultUtils.print(ecrNoAttribution); if (DEBUG) EnergyConsumerResultUtils.print(ecrNoAttribution);
@@ -97,6 +108,8 @@ public final class PowerStatsLogger extends Handler {
// Log power model data with attribution data. // Log power model data with attribution data.
EnergyConsumerResult[] ecrAttribution = EnergyConsumerResult[] ecrAttribution =
mPowerStatsHALWrapper.getEnergyConsumed(new int[0]); mPowerStatsHALWrapper.getEnergyConsumed(new int[0]);
EnergyConsumerResultUtils.adjustTimeSinceBootToEpoch(ecrAttribution,
mStartWallTime);
mPowerStatsModelStorage.write( mPowerStatsModelStorage.write(
EnergyConsumerResultUtils.getProtoBytes(ecrAttribution, true)); EnergyConsumerResultUtils.getProtoBytes(ecrAttribution, true));
if (DEBUG) EnergyConsumerResultUtils.print(ecrAttribution); if (DEBUG) EnergyConsumerResultUtils.print(ecrAttribution);
@@ -108,6 +121,8 @@ public final class PowerStatsLogger extends Handler {
// Log state residency data. // Log state residency data.
StateResidencyResult[] stateResidencyResults = StateResidencyResult[] stateResidencyResults =
mPowerStatsHALWrapper.getStateResidency(new int[0]); mPowerStatsHALWrapper.getStateResidency(new int[0]);
StateResidencyResultUtils.adjustTimeSinceBootToEpoch(stateResidencyResults,
mStartWallTime);
mPowerStatsResidencyStorage.write( mPowerStatsResidencyStorage.write(
StateResidencyResultUtils.getProtoBytes(stateResidencyResults)); StateResidencyResultUtils.getProtoBytes(stateResidencyResults));
if (DEBUG) StateResidencyResultUtils.print(stateResidencyResults); if (DEBUG) StateResidencyResultUtils.print(stateResidencyResults);
@@ -293,12 +308,19 @@ public final class PowerStatsLogger extends Handler {
return mDeleteResidencyDataOnBoot; return mDeleteResidencyDataOnBoot;
} }
@VisibleForTesting
public long getStartWallTime() {
return mStartWallTime;
}
public PowerStatsLogger(Context context, File dataStoragePath, public PowerStatsLogger(Context context, File dataStoragePath,
String meterFilename, String meterCacheFilename, String meterFilename, String meterCacheFilename,
String modelFilename, String modelCacheFilename, String modelFilename, String modelCacheFilename,
String residencyFilename, String residencyCacheFilename, String residencyFilename, String residencyCacheFilename,
IPowerStatsHALWrapper powerStatsHALWrapper) { IPowerStatsHALWrapper powerStatsHALWrapper) {
super(Looper.getMainLooper()); super(Looper.getMainLooper());
mStartWallTime = currentTimeMillis() - SystemClock.elapsedRealtime();
if (DEBUG) Slog.d(TAG, "mStartWallTime: " + mStartWallTime);
mPowerStatsHALWrapper = powerStatsHALWrapper; mPowerStatsHALWrapper = powerStatsHALWrapper;
mDataStoragePath = dataStoragePath; mDataStoragePath = dataStoragePath;

View File

@@ -109,6 +109,18 @@ public class ProtoStreamUtils {
} }
static class StateResidencyResultUtils { static class StateResidencyResultUtils {
public static void adjustTimeSinceBootToEpoch(StateResidencyResult[] stateResidencyResult,
long startWallTime) {
for (int i = 0; i < stateResidencyResult.length; i++) {
final int stateLength = stateResidencyResult[i].stateResidencyData.length;
for (int j = 0; j < stateLength; j++) {
final StateResidency stateResidencyData =
stateResidencyResult[i].stateResidencyData[j];
stateResidencyData.lastEntryTimestampMs += startWallTime;
}
}
}
public static byte[] getProtoBytes(StateResidencyResult[] stateResidencyResult) { public static byte[] getProtoBytes(StateResidencyResult[] stateResidencyResult) {
ProtoOutputStream pos = new ProtoOutputStream(); ProtoOutputStream pos = new ProtoOutputStream();
packProtoMessage(stateResidencyResult, pos); packProtoMessage(stateResidencyResult, pos);
@@ -306,6 +318,13 @@ public class ProtoStreamUtils {
} }
static class EnergyMeasurementUtils { static class EnergyMeasurementUtils {
public static void adjustTimeSinceBootToEpoch(EnergyMeasurement[] energyMeasurement,
long startWallTime) {
for (int i = 0; i < energyMeasurement.length; i++) {
energyMeasurement[i].timestampMs += startWallTime;
}
}
public static byte[] getProtoBytes(EnergyMeasurement[] energyMeasurement) { public static byte[] getProtoBytes(EnergyMeasurement[] energyMeasurement) {
ProtoOutputStream pos = new ProtoOutputStream(); ProtoOutputStream pos = new ProtoOutputStream();
packProtoMessage(energyMeasurement, pos); packProtoMessage(energyMeasurement, pos);
@@ -518,6 +537,13 @@ public class ProtoStreamUtils {
} }
static class EnergyConsumerResultUtils { static class EnergyConsumerResultUtils {
public static void adjustTimeSinceBootToEpoch(EnergyConsumerResult[] energyConsumerResult,
long startWallTime) {
for (int i = 0; i < energyConsumerResult.length; i++) {
energyConsumerResult[i].timestampMs += startWallTime;
}
}
public static byte[] getProtoBytes(EnergyConsumerResult[] energyConsumerResult, public static byte[] getProtoBytes(EnergyConsumerResult[] energyConsumerResult,
boolean includeAttribution) { boolean includeAttribution) {
ProtoOutputStream pos = new ProtoOutputStream(); ProtoOutputStream pos = new ProtoOutputStream();

View File

@@ -318,7 +318,8 @@ public class PowerStatsServiceTest {
assertTrue(pssProto.energyMeasurement.length == ENERGY_METER_COUNT); assertTrue(pssProto.energyMeasurement.length == ENERGY_METER_COUNT);
for (int i = 0; i < pssProto.energyMeasurement.length; i++) { for (int i = 0; i < pssProto.energyMeasurement.length; i++) {
assertTrue(pssProto.energyMeasurement[i].id == i); assertTrue(pssProto.energyMeasurement[i].id == i);
assertTrue(pssProto.energyMeasurement[i].timestampMs == i); assertTrue(pssProto.energyMeasurement[i].timestampMs ==
i + mPowerStatsLogger.getStartWallTime());
assertTrue(pssProto.energyMeasurement[i].durationMs == i); assertTrue(pssProto.energyMeasurement[i].durationMs == i);
assertTrue(pssProto.energyMeasurement[i].energyUws == i); assertTrue(pssProto.energyMeasurement[i].energyUws == i);
} }
@@ -359,7 +360,8 @@ public class PowerStatsServiceTest {
assertTrue(pssProto.energyConsumerResult.length == ENERGY_CONSUMER_COUNT); assertTrue(pssProto.energyConsumerResult.length == ENERGY_CONSUMER_COUNT);
for (int i = 0; i < pssProto.energyConsumerResult.length; i++) { for (int i = 0; i < pssProto.energyConsumerResult.length; i++) {
assertTrue(pssProto.energyConsumerResult[i].id == i); assertTrue(pssProto.energyConsumerResult[i].id == i);
assertTrue(pssProto.energyConsumerResult[i].timestampMs == i); assertTrue(pssProto.energyConsumerResult[i].timestampMs ==
i + mPowerStatsLogger.getStartWallTime());
assertTrue(pssProto.energyConsumerResult[i].energyUws == i); assertTrue(pssProto.energyConsumerResult[i].energyUws == i);
assertTrue(pssProto.energyConsumerResult[i].attribution.length assertTrue(pssProto.energyConsumerResult[i].attribution.length
== ENERGY_CONSUMER_ATTRIBUTION_COUNT); == ENERGY_CONSUMER_ATTRIBUTION_COUNT);
@@ -420,7 +422,8 @@ public class PowerStatsServiceTest {
assertTrue(stateResidency.id == j); assertTrue(stateResidency.id == j);
assertTrue(stateResidency.totalTimeInStateMs == j); assertTrue(stateResidency.totalTimeInStateMs == j);
assertTrue(stateResidency.totalStateEntryCount == j); assertTrue(stateResidency.totalStateEntryCount == j);
assertTrue(stateResidency.lastEntryTimestampMs == j); assertTrue(stateResidency.lastEntryTimestampMs ==
j + mPowerStatsLogger.getStartWallTime());
} }
} }
} }