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

Commit 09ff69b6 authored by Jing Ji's avatar Jing Ji Committed by Android (Google) Code Review
Browse files

Merge "Remove the OomAdjProfiler" into main

parents b36de37f 54ac5c63
Loading
Loading
Loading
Loading
+1 −12
Original line number Diff line number Diff line
@@ -685,8 +685,6 @@ public class ActivityManagerService extends IActivityManager.Stub
    public final IntentFirewall mIntentFirewall;
    public OomAdjProfiler mOomAdjProfiler = new OomAdjProfiler();
    /**
     * The global lock for AMS, it's de-facto the ActivityManagerService object as of now.
     */
@@ -2598,7 +2596,6 @@ public class ActivityManagerService extends IActivityManager.Stub
                BackgroundThread.getHandler(), this);
        mOnBattery = DEBUG_POWER ? true
                : mBatteryStatsService.getActiveStatistics().getIsOnBattery();
        mOomAdjProfiler.batteryPowerChanged(mOnBattery);
        mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
@@ -2847,13 +2844,12 @@ public class ActivityManagerService extends IActivityManager.Stub
        updateCpuStatsNow();
        synchronized (mProcLock) {
            mOnBattery = DEBUG_POWER ? true : onBattery;
            mOomAdjProfiler.batteryPowerChanged(onBattery);
        }
    }
    @Override
    public void batteryStatsReset() {
        mOomAdjProfiler.reset();
        // Empty for now.
    }
    @Override
@@ -7419,7 +7415,6 @@ public class ActivityManagerService extends IActivityManager.Stub
                mServices.updateScreenStateLocked(isAwake);
                reportCurWakefulnessUsageEvent();
                mActivityTaskManager.onScreenAwakeChanged(isAwake);
                mOomAdjProfiler.onWakefulnessChanged(wakefulness);
                mOomAdjuster.onWakefulnessChanged(wakefulness);
                updateOomAdjLocked(OOM_ADJ_REASON_UI_VISIBILITY);
@@ -10544,12 +10539,6 @@ public class ActivityManagerService extends IActivityManager.Stub
                mProcessList.mAppExitInfoTracker.dumpHistoryProcessExitInfo(pw, dumpPackage);
            }
            if (dumpPackage == null) {
                pw.println();
                if (dumpAll) {
                    pw.println(
                            "-------------------------------------------------------------------------------");
                }
                mOomAdjProfiler.dump(pw);
                pw.println();
                if (dumpAll) {
                    pw.println(
+0 −226
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.am;

import android.os.Message;
import android.os.PowerManagerInternal;
import android.os.Process;
import android.os.SystemClock;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.BackgroundThread;
import com.android.internal.os.ProcessCpuTracker;
import com.android.internal.util.RingBuffer;
import com.android.internal.util.function.pooled.PooledLambda;

import java.io.PrintWriter;

public class OomAdjProfiler {
    private static final int MSG_UPDATE_CPU_TIME = 42;

    @GuardedBy("this")
    private boolean mOnBattery;
    @GuardedBy("this")
    private boolean mScreenOff;

    /** The value of {@link #mOnBattery} when the CPU time update was last scheduled. */
    @GuardedBy("this")
    private boolean mLastScheduledOnBattery;
    /** The value of {@link #mScreenOff} when the CPU time update was last scheduled. */
    @GuardedBy("this")
    private boolean mLastScheduledScreenOff;

    @GuardedBy("this")
    private long mOomAdjStartTimeUs;
    @GuardedBy("this")
    private boolean mOomAdjStarted;

    @GuardedBy("this")
    private CpuTimes mOomAdjRunTime = new CpuTimes();
    @GuardedBy("this")
    private CpuTimes mSystemServerCpuTime = new CpuTimes();

    @GuardedBy("this")
    private long mLastSystemServerCpuTimeMs;
    @GuardedBy("this")
    private boolean mSystemServerCpuTimeUpdateScheduled;
    private final ProcessCpuTracker mProcessCpuTracker = new ProcessCpuTracker(false);

    @GuardedBy("this")
    final RingBuffer<CpuTimes> mOomAdjRunTimesHist = new RingBuffer<>(CpuTimes.class, 10);
    @GuardedBy("this")
    final RingBuffer<CpuTimes> mSystemServerCpuTimesHist = new RingBuffer<>(CpuTimes.class, 10);

    @GuardedBy("this")
    private long mTotalOomAdjRunTimeUs;
    @GuardedBy("this")
    private int mTotalOomAdjCalls;

    void batteryPowerChanged(boolean onBattery) {
        synchronized (this) {
            scheduleSystemServerCpuTimeUpdate();
            mOnBattery = onBattery;
        }
    }

    void onWakefulnessChanged(int wakefulness) {
        synchronized (this) {
            scheduleSystemServerCpuTimeUpdate();
            mScreenOff = wakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE;
        }
    }

    void oomAdjStarted() {
        synchronized (this) {
            mOomAdjStartTimeUs = SystemClock.currentThreadTimeMicro();
            mOomAdjStarted = true;
        }
    }

    void oomAdjEnded() {
        synchronized (this) {
            if (!mOomAdjStarted) {
                return;
            }
            long elapsedUs = SystemClock.currentThreadTimeMicro() - mOomAdjStartTimeUs;
            mOomAdjRunTime.addCpuTimeUs(elapsedUs);
            mTotalOomAdjRunTimeUs += elapsedUs;
            mTotalOomAdjCalls++;
        }
    }

    private void scheduleSystemServerCpuTimeUpdate() {
        synchronized (this) {
            if (mSystemServerCpuTimeUpdateScheduled) {
                return;
            }
            mLastScheduledOnBattery = mOnBattery;
            mLastScheduledScreenOff = mScreenOff;
            mSystemServerCpuTimeUpdateScheduled = true;
            Message scheduledMessage = PooledLambda.obtainMessage(
                    OomAdjProfiler::updateSystemServerCpuTime,
                    this, mLastScheduledOnBattery, mLastScheduledScreenOff, true);
            scheduledMessage.setWhat(MSG_UPDATE_CPU_TIME);

            BackgroundThread.getHandler().sendMessage(scheduledMessage);
        }
    }

    private void updateSystemServerCpuTime(boolean onBattery, boolean screenOff,
            boolean onlyIfScheduled) {
        final long cpuTimeMs = mProcessCpuTracker.getCpuTimeForPid(Process.myPid());
        synchronized (this) {
            if (onlyIfScheduled && !mSystemServerCpuTimeUpdateScheduled) {
                return;
            }
            mSystemServerCpuTime.addCpuTimeMs(
                    cpuTimeMs - mLastSystemServerCpuTimeMs, onBattery, screenOff);
            mLastSystemServerCpuTimeMs = cpuTimeMs;
            mSystemServerCpuTimeUpdateScheduled = false;
        }
    }

    void reset() {
        synchronized (this) {
            if (mSystemServerCpuTime.isEmpty()) {
                return;
            }
            mOomAdjRunTimesHist.append(mOomAdjRunTime);
            mSystemServerCpuTimesHist.append(mSystemServerCpuTime);
            mOomAdjRunTime = new CpuTimes();
            mSystemServerCpuTime = new CpuTimes();
        }
    }

    void dump(PrintWriter pw) {
        synchronized (this) {
            if (mSystemServerCpuTimeUpdateScheduled) {
                // Cancel the scheduled update since we're going to update it here instead.
                BackgroundThread.getHandler().removeMessages(MSG_UPDATE_CPU_TIME);
                // Make sure the values are attributed to the right states.
                updateSystemServerCpuTime(mLastScheduledOnBattery, mLastScheduledScreenOff, false);
            } else {
                updateSystemServerCpuTime(mOnBattery, mScreenOff, false);
            }

            pw.println("System server and oomAdj runtimes (ms) in recent battery sessions "
                    + "(most recent first):");
            if (!mSystemServerCpuTime.isEmpty()) {
                pw.print("  ");
                pw.print("system_server=");
                pw.print(mSystemServerCpuTime);
                pw.print("  ");
                pw.print("oom_adj=");
                pw.println(mOomAdjRunTime);
            }
            final CpuTimes[] systemServerCpuTimes = mSystemServerCpuTimesHist.toArray();
            final CpuTimes[] oomAdjRunTimes = mOomAdjRunTimesHist.toArray();
            for (int i = oomAdjRunTimes.length - 1; i >= 0; --i) {
                pw.print("  ");
                pw.print("system_server=");
                pw.print(systemServerCpuTimes[i]);
                pw.print("  ");
                pw.print("oom_adj=");
                pw.println(oomAdjRunTimes[i]);
            }
            if (mTotalOomAdjCalls != 0) {
                pw.println("System server total oomAdj runtimes (us) since boot:");
                pw.print("  cpu time spent=");
                pw.print(mTotalOomAdjRunTimeUs);
                pw.print("  number of calls=");
                pw.print(mTotalOomAdjCalls);
                pw.print("  average=");
                pw.println(mTotalOomAdjRunTimeUs / mTotalOomAdjCalls);
            }
        }
    }

    private class CpuTimes {
        private long mOnBatteryTimeUs;
        private long mOnBatteryScreenOffTimeUs;

        public void addCpuTimeMs(long cpuTimeMs) {
            addCpuTimeUs(cpuTimeMs * 1000, mOnBattery, mScreenOff);
        }

        public void addCpuTimeMs(long cpuTimeMs, boolean onBattery, boolean screenOff) {
            addCpuTimeUs(cpuTimeMs * 1000, onBattery, screenOff);
        }

        public void addCpuTimeUs(long cpuTimeUs) {
            addCpuTimeUs(cpuTimeUs, mOnBattery, mScreenOff);
        }

        public void addCpuTimeUs(long cpuTimeUs, boolean onBattery, boolean screenOff) {
            if (onBattery) {
                mOnBatteryTimeUs += cpuTimeUs;
                if (screenOff) {
                    mOnBatteryScreenOffTimeUs += cpuTimeUs;
                }
            }
        }

        public boolean isEmpty() {
            return mOnBatteryTimeUs == 0 && mOnBatteryScreenOffTimeUs == 0;
        }

        public String toString() {
            return "[" + (mOnBatteryTimeUs / 1000) + ","
                    + (mOnBatteryScreenOffTimeUs / 1000) + "]";
        }
    }
}
+0 −6
Original line number Diff line number Diff line
@@ -600,7 +600,6 @@ public class OomAdjuster {

        mLastReason = oomAdjReason;
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
        mService.mOomAdjProfiler.oomAdjStarted();

        final ProcessStateRecord state = app.mState;

@@ -630,7 +629,6 @@ public class OomAdjuster {
        }
        mTmpProcessList.clear();
        mService.clearPendingTopAppLocked();
        mService.mOomAdjProfiler.oomAdjEnded();
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        return true;
    }
@@ -849,7 +847,6 @@ public class OomAdjuster {

        mLastReason = oomAdjReason;
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
        mService.mOomAdjProfiler.oomAdjStarted();
        mProcessStateCurTop = enqueuePendingTopAppIfNecessaryLSP();

        final ArrayList<ProcessRecord> processes = mTmpProcessList;
@@ -862,7 +859,6 @@ public class OomAdjuster {
        processes.clear();
        mService.clearPendingTopAppLocked();

        mService.mOomAdjProfiler.oomAdjEnded();
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    }

@@ -895,7 +891,6 @@ public class OomAdjuster {
        mLastReason = oomAdjReason;
        if (startProfiling) {
            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
            mService.mOomAdjProfiler.oomAdjStarted();
        }
        final long now = SystemClock.uptimeMillis();
        final long nowElapsed = SystemClock.elapsedRealtime();
@@ -989,7 +984,6 @@ public class OomAdjuster {
        postUpdateOomAdjInnerLSP(oomAdjReason, activeUids, now, nowElapsed, oldTime, true);

        if (startProfiling) {
            mService.mOomAdjProfiler.oomAdjEnded();
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        }
    }
+0 −4
Original line number Diff line number Diff line
@@ -744,11 +744,9 @@ public class OomAdjusterModernImpl extends OomAdjuster {

        mLastReason = oomAdjReason;
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
        mService.mOomAdjProfiler.oomAdjStarted();

        fullUpdateLSP(oomAdjReason);

        mService.mOomAdjProfiler.oomAdjEnded();
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    }

@@ -766,14 +764,12 @@ public class OomAdjusterModernImpl extends OomAdjuster {
        mLastReason = oomAdjReason;
        mProcessStateCurTop = enqueuePendingTopAppIfNecessaryLSP();
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason));
        mService.mOomAdjProfiler.oomAdjStarted();

        synchronized (mProcLock) {
            partialUpdateLSP(oomAdjReason, mPendingProcessSet);
        }
        mPendingProcessSet.clear();

        mService.mOomAdjProfiler.oomAdjEnded();
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    }

+0 −2
Original line number Diff line number Diff line
@@ -205,8 +205,6 @@ public class MockingOomAdjusterTests {
                new ProcessStatsService(sService, new File(sContext.getFilesDir(), "procstats")));
        setFieldValue(ActivityManagerService.class, sService, "mBackupTargets",
                mock(SparseArray.class));
        setFieldValue(ActivityManagerService.class, sService, "mOomAdjProfiler",
                mock(OomAdjProfiler.class));
        setFieldValue(ActivityManagerService.class, sService, "mUserController",
                mock(UserController.class));
        setFieldValue(ActivityManagerService.class, sService, "mAppProfiler", profiler);