Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 648d2035 authored by Misha Wagner's avatar Misha Wagner
Browse files

Add KernelCpuThreadReader minimium CPU usage threshold

Configurable using KernelCpuThreadReaderSettingsObserver.

Test: atest KernelCpuThreadReaderTest#testReader_filtersLowUsage
Change-Id: I92bb5fbee6b56bff00c61f359e8281966e2882c1
parent 02cc423f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ public class KernelCpuThreadReaderPerfTest {
    public final PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();

    private final KernelCpuThreadReader mKernelCpuThreadReader =
            KernelCpuThreadReader.create(8, uid -> 1000 <= uid && uid < 2000);
            KernelCpuThreadReader.create(8, uid -> 1000 <= uid && uid < 2000, 0);

    @Test
    public void timeReadCurrentProcessCpuUsage() {
+1 −0
Original line number Diff line number Diff line
@@ -14334,6 +14334,7 @@ public final class Settings {
         * <pre>
         *     num_buckets          (int)
         *     collected_uids       (string)
         *     minimum_total_cpu_usage_millis (int)
         * </pre>
         *
         * @hide
+32 −1
Original line number Diff line number Diff line
@@ -108,6 +108,12 @@ public class KernelCpuThreadReader {
     */
    private Predicate<Integer> mUidPredicate;

    /**
     * If a thread has strictly less than {@code minimumTotalCpuUsageMillis} total CPU usage, it
     * will not be reported
     */
    private int mMinimumTotalCpuUsageMillis;

    /**
     * Where the proc filesystem is mounted
     */
@@ -142,10 +148,12 @@ public class KernelCpuThreadReader {
    public KernelCpuThreadReader(
            int numBuckets,
            Predicate<Integer> uidPredicate,
            int minimumTotalCpuUsageMillis,
            Path procPath,
            Path initialTimeInStatePath,
            Injector injector) throws IOException {
        mUidPredicate = uidPredicate;
        mMinimumTotalCpuUsageMillis = minimumTotalCpuUsageMillis;
        mProcPath = procPath;
        mProcTimeInStateReader = new ProcTimeInStateReader(initialTimeInStatePath);
        mInjector = injector;
@@ -158,11 +166,13 @@ public class KernelCpuThreadReader {
     * @return the reader, null if an exception was thrown during creation
     */
    @Nullable
    public static KernelCpuThreadReader create(int numBuckets, Predicate<Integer> uidPredicate) {
    public static KernelCpuThreadReader create(
            int numBuckets, Predicate<Integer> uidPredicate, int minimumTotalCpuUsageMillis) {
        try {
            return new KernelCpuThreadReader(
                    numBuckets,
                    uidPredicate,
                    minimumTotalCpuUsageMillis,
                    DEFAULT_PROC_PATH,
                    DEFAULT_INITIAL_TIME_IN_STATE_PATH,
                    new Injector());
@@ -307,6 +317,18 @@ public class KernelCpuThreadReader {
        mUidPredicate = uidPredicate;
    }

    /**
     * If a thread has strictly less than {@code minimumTotalCpuUsageMillis} total CPU usage, it
     * will not be reported
     */
    void setMinimumTotalCpuUsageMillis(int minimumTotalCpuUsageMillis) {
        if (minimumTotalCpuUsageMillis < 0) {
            Slog.w(TAG, "Negative minimumTotalCpuUsageMillis: " + minimumTotalCpuUsageMillis);
            return;
        }
        mMinimumTotalCpuUsageMillis = minimumTotalCpuUsageMillis;
    }

    /**
     * Get the CPU frequencies that correspond to the times reported in
     * {@link ThreadCpuUsage#usageTimesMillis}
@@ -346,6 +368,15 @@ public class KernelCpuThreadReader {
        }
        int[] cpuUsages = mFrequencyBucketCreator.getBucketedValues(cpuUsagesLong);

        // Check if the total CPU usage below the threshold
        int totalCpuUsage = 0;
        for (int i = 0; i < cpuUsages.length; i++) {
            totalCpuUsage += cpuUsages[i];
        }
        if (totalCpuUsage < mMinimumTotalCpuUsageMillis) {
            return null;
        }

        return new ThreadCpuUsage(threadId, threadName, cpuUsages);
    }

+12 −1
Original line number Diff line number Diff line
@@ -59,6 +59,13 @@ public class KernelCpuThreadReaderSettingsObserver extends ContentObserver {
    private static final String COLLECTED_UIDS_SETTINGS_KEY = "collected_uids";
    private static final String COLLECTED_UIDS_DEFAULT = "1000-1000";

    /**
     * Minimum total CPU usage to report
     */
    private static final String MINIMUM_TOTAL_CPU_USAGE_MILLIS_SETTINGS_KEY =
            "minimum_total_cpu_usage_millis";
    private static final int MINIMUM_TOTAL_CPU_USAGE_MILLIS_DEFAULT = 0;

    private final Context mContext;

    @Nullable
@@ -87,7 +94,8 @@ public class KernelCpuThreadReaderSettingsObserver extends ContentObserver {
        mContext = context;
        mKernelCpuThreadReader = KernelCpuThreadReader.create(
                NUM_BUCKETS_DEFAULT,
                UidPredicate.fromString(COLLECTED_UIDS_DEFAULT));
                UidPredicate.fromString(COLLECTED_UIDS_DEFAULT),
                MINIMUM_TOTAL_CPU_USAGE_MILLIS_DEFAULT);
    }

    @Override
@@ -124,6 +132,9 @@ public class KernelCpuThreadReaderSettingsObserver extends ContentObserver {
        mKernelCpuThreadReader.setNumBuckets(
                parser.getInt(NUM_BUCKETS_SETTINGS_KEY, NUM_BUCKETS_DEFAULT));
        mKernelCpuThreadReader.setUidPredicate(uidPredicate);
        mKernelCpuThreadReader.setMinimumTotalCpuUsageMillis(parser.getInt(
                MINIMUM_TOTAL_CPU_USAGE_MILLIS_SETTINGS_KEY,
                MINIMUM_TOTAL_CPU_USAGE_MILLIS_DEFAULT));
    }

    /**
+1 −1
Original line number Diff line number Diff line
@@ -123,7 +123,7 @@ public class KernelCpuThreadReaderEndToEndTest {

        // Get thread data from KernelCpuThreadReader
        final KernelCpuThreadReader kernelCpuThreadReader =
                KernelCpuThreadReader.create(8, uid -> uid == Process.myUid());
                KernelCpuThreadReader.create(8, uid -> uid == Process.myUid(), 0);
        assertNotNull(kernelCpuThreadReader);
        final ProcessCpuUsage currentProcessCpuUsage =
                kernelCpuThreadReader.getCurrentProcessCpuUsage();
Loading