From 7f8def9d5a71f4ccb1ecdd90637f7b3c162dcab8 Mon Sep 17 00:00:00 2001 From: Chenjie Yu Date: Fri, 3 Nov 2017 09:33:15 -0700 Subject: [PATCH] pull cpu time per freq also adjust lock for ValueMetricProducer.cpp Test: manual test Change-Id: Ib96e3011d7bcf44ac92346d880196c425623a86f --- .../src/metrics/ValueMetricProducer.cpp | 4 +-- cmds/statsd/src/stats_events.proto | 19 +++++++++++ .../server/stats/StatsCompanionService.java | 34 +++++++++++++++++-- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index e6e63f74d535c..5bd10fa3dad81 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -172,6 +172,7 @@ std::unique_ptr> ValueMetricProducer::onDumpReport() { } void ValueMetricProducer::onConditionChanged(const bool condition, const uint64_t eventTime) { + AutoMutex _l(mLock); mCondition = condition; if (mPullTagId != -1) { @@ -187,7 +188,6 @@ void ValueMetricProducer::onConditionChanged(const bool condition, const uint64_ if (allData.size() == 0) { return; } - AutoMutex _l(mLock); for (const auto& data : allData) { onMatchedLogEvent(0, *data, false); } @@ -198,8 +198,8 @@ void ValueMetricProducer::onConditionChanged(const bool condition, const uint64_ } void ValueMetricProducer::onDataPulled(const std::vector>& allData) { + AutoMutex _l(mLock); if (mCondition == ConditionState::kTrue || !mMetric.has_condition()) { - AutoMutex _l(mLock); if (allData.size() == 0) { return; } diff --git a/cmds/statsd/src/stats_events.proto b/cmds/statsd/src/stats_events.proto index 8816795ed82fc..a516ca3a603a8 100644 --- a/cmds/statsd/src/stats_events.proto +++ b/cmds/statsd/src/stats_events.proto @@ -86,6 +86,7 @@ message StatsEvent { PowerStatePlatformSleepStatePulled power_state_platform_sleep_state_pulled = 1005; PowerStateVoterPulled power_state_voter_pulled = 1006; PowerStateSubsystemSleepStatePulled power_state_subsystem_sleep_state_pulled = 1007; + CpuTimePerFreqPulled cpu_time_per_freq_pulled = 1008; } } @@ -849,6 +850,7 @@ message PowerStateSubsystemSleepStatePulled { } /** +<<<<<<< HEAD * Logs creation or removal of an isolated uid. Isolated uid's are temporary uid's to sandbox risky * behavior in its own uid. However, the metrics of these isolated uid's almost always should be * attributed back to the parent (host) uid. One example is Chrome. @@ -866,3 +868,20 @@ message IsolatedUidChanged { // be removed before if it's used for another parent uid. optional int32 is_create = 3; } + +/* + * Pulls Cpu time per frequency. + * Note: this should be pulled for gauge metric only, without condition. + * The puller keeps internal state of last values. It should not be pulled by + * different metrics. + * The pulled data is delta of cpu time from last pull, calculated as + * following: + * if current time is larger than last value, take delta between the two. + * if current time is smaller than last value, there must be a cpu + * hotplug event, and the current time is taken as delta. + */ +message CpuTimePerFreqPulled { + optional uint32 cluster = 1; + optional uint32 freq_index = 2; + optional uint64 time = 3; +} diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index 2488723389289..f41ff2c3dcaa6 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -44,6 +44,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.net.NetworkStatsFactory; import com.android.internal.os.KernelWakelockReader; import com.android.internal.os.KernelWakelockStats; +import com.android.internal.os.KernelCpuSpeedReader; +import com.android.internal.os.PowerProfile; import com.android.server.LocalServices; import com.android.server.SystemService; @@ -71,6 +73,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private final PendingIntent mPullingAlarmIntent; private final BroadcastReceiver mAppUpdateReceiver; private final BroadcastReceiver mUserUpdateReceiver; + private final KernelWakelockReader mKernelWakelockReader = new KernelWakelockReader(); + private final KernelWakelockStats mTmpWakelockStats = new KernelWakelockStats(); + private final KernelCpuSpeedReader[] mKernelCpuSpeedReaders; public StatsCompanionService(Context context) { super(); @@ -103,6 +108,16 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } }; Slog.w(TAG, "Registered receiver for ACTION_PACKAGE_REPLACE AND ADDED."); + PowerProfile powerProfile = new PowerProfile(context); + final int numClusters = powerProfile.getNumCpuClusters(); + mKernelCpuSpeedReaders = new KernelCpuSpeedReader[numClusters]; + int firstCpuOfCluster = 0; + for (int i = 0; i < numClusters; i++) { + final int numSpeedSteps = powerProfile.getNumSpeedStepsInCpuCluster(i); + mKernelCpuSpeedReaders[i] = new KernelCpuSpeedReader(firstCpuOfCluster, + numSpeedSteps); + firstCpuOfCluster += powerProfile.getNumCoresInCpuCluster(i); + } } private final static int[] toIntArray(List list) { @@ -286,9 +301,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - private final KernelWakelockReader mKernelWakelockReader = new KernelWakelockReader(); - private final KernelWakelockStats mTmpWakelockStats = new KernelWakelockStats(); - private StatsLogEventWrapper[] addNetworkStats(int tag, NetworkStats stats, boolean withFGBG) { List ret = new ArrayList<>(); int size = stats.size(); @@ -446,6 +458,22 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } return ret.toArray(new StatsLogEventWrapper[ret.size()]); } + case StatsLog.CPU_TIME_PER_FREQ_PULLED: { + List ret = new ArrayList(); + for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) { + long[] clusterTimeMs = mKernelCpuSpeedReaders[cluster].readDelta(); + if (clusterTimeMs != null) { + for (int speed = clusterTimeMs.length - 1; speed >= 0; --speed) { + StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3); + e.writeInt(tagId); + e.writeInt(speed); + e.writeLong(clusterTimeMs[speed]); + ret.add(e); + } + } + } + return ret.toArray(new StatsLogEventWrapper[ret.size()]); + } default: Slog.w(TAG, "No such tagId data as " + tagId); return null;