diff options
| author | 2024-11-04 12:31:54 +0000 | |
|---|---|---|
| committer | 2024-11-04 12:31:54 +0000 | |
| commit | 2ed42dc6ed1452ebbcddebe5237bc683212f93e5 (patch) | |
| tree | f153e01cacf1d4f093ec1be3da02dfc3eb4b5543 | |
| parent | cd48e7c13add65ebc99d89519d670dbad7a30b1e (diff) | |
| parent | ef96b34c62d83a71c8ba2dd75812063e7c946bb3 (diff) | |
Merge "Separate the PREVIOUS_APP_ADJ scores." into main
5 files changed, 64 insertions, 21 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index de3e2c90efe1..08632fe09b19 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -114,6 +114,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_MEDIUM_APP_ADJ; import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; +import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SCHED_GROUP_DEFAULT; import static com.android.server.am.ProcessList.SCHED_GROUP_FOREGROUND_WINDOW; @@ -696,7 +697,7 @@ public class OomAdjuster { // In case the app goes from non-cached to cached but it doesn't have other reachable // processes, its adj could be still unknown as of now, assign one. processes.add(app); - assignCachedAdjIfNecessary(processes); + applyLruAdjust(processes); applyOomAdjLSP(app, false, mInjector.getUptimeMillis(), mInjector.getElapsedRealtimeMillis(), oomAdjReason); } @@ -1086,7 +1087,7 @@ public class OomAdjuster { } mProcessesInCycle.clear(); - assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); + applyLruAdjust(mProcessList.getLruProcessesLOSP()); postUpdateOomAdjInnerLSP(oomAdjReason, activeUids, now, nowElapsed, oldTime, true); @@ -1148,8 +1149,9 @@ public class OomAdjuster { } @GuardedBy({"mService", "mProcLock"}) - protected void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) { + protected void applyLruAdjust(ArrayList<ProcessRecord> lruList) { final int numLru = lruList.size(); + int nextPreviousAppAdj = PREVIOUS_APP_ADJ; if (mConstants.USE_TIERED_CACHED_ADJ) { final long now = mInjector.getUptimeMillis(); int uiTargetAdj = 10; @@ -1159,9 +1161,12 @@ public class OomAdjuster { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; final ProcessCachedOptimizerRecord opt = app.mOptRecord; - if (!app.isKilledByAm() && app.getThread() != null - && (state.getCurAdj() >= UNKNOWN_ADJ - || (state.hasShownUi() && state.getCurAdj() >= CACHED_APP_MIN_ADJ))) { + final int curAdj = state.getCurAdj(); + if (PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ) { + state.setCurAdj(nextPreviousAppAdj); + nextPreviousAppAdj = Math.min(nextPreviousAppAdj + 1, PREVIOUS_APP_MAX_ADJ); + } else if (!app.isKilledByAm() && app.getThread() != null && (curAdj >= UNKNOWN_ADJ + || (state.hasShownUi() && curAdj >= CACHED_APP_MIN_ADJ))) { final ProcessServiceRecord psr = app.mServices; int targetAdj = CACHED_APP_MIN_ADJ; @@ -1228,10 +1233,13 @@ public class OomAdjuster { for (int i = numLru - 1; i >= 0; i--) { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; - // If we haven't yet assigned the final cached adj - // to the process, do that now. - if (!app.isKilledByAm() && app.getThread() != null && state.getCurAdj() - >= UNKNOWN_ADJ) { + final int curAdj = state.getCurAdj(); + if (PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ) { + state.setCurAdj(nextPreviousAppAdj); + nextPreviousAppAdj = Math.min(nextPreviousAppAdj + 1, PREVIOUS_APP_MAX_ADJ); + } else if (!app.isKilledByAm() && app.getThread() != null + && curAdj >= UNKNOWN_ADJ) { + // If we haven't yet assigned the final cached adj to the process, do that now. final ProcessServiceRecord psr = app.mServices; switch (state.getCurProcState()) { case PROCESS_STATE_LAST_ACTIVITY: diff --git a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java index e452c45156c9..8b660559f550 100644 --- a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java +++ b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java @@ -54,6 +54,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_AP import static com.android.server.am.ProcessList.PERSISTENT_PROC_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; +import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SERVICE_ADJ; import static com.android.server.am.ProcessList.SERVICE_B_ADJ; @@ -968,7 +969,7 @@ public class OomAdjusterModernImpl extends OomAdjuster { mTmpOomAdjusterArgs.update(topApp, now, UNKNOWN_ADJ, oomAdjReason, null, true); computeConnectionsLSP(); - assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); + applyLruAdjust(mProcessList.getLruProcessesLOSP()); postUpdateOomAdjInnerLSP(oomAdjReason, mActiveUids, now, nowElapsed, oldTime, true); } @@ -1049,20 +1050,24 @@ public class OomAdjusterModernImpl extends OomAdjuster { // Now traverse and compute the connections of processes with changed importance. computeConnectionsLSP(); - boolean unassignedAdj = false; + boolean needLruAdjust = false; for (int i = 0, size = reachables.size(); i < size; i++) { final ProcessStateRecord state = reachables.get(i).mState; state.setReachable(false); state.setCompletedAdjSeq(mAdjSeq); - if (state.getCurAdj() >= UNKNOWN_ADJ) { - unassignedAdj = true; + final int curAdj = state.getCurAdj(); + // Processes assigned the PREV oomscore will have a laddered oomscore with respect to + // their positions in the LRU list. i.e. prev+0, prev+1, prev+2, etc. + final boolean isPrevApp = PREVIOUS_APP_ADJ <= curAdj && curAdj <= PREVIOUS_APP_MAX_ADJ; + if (curAdj >= UNKNOWN_ADJ || (Flags.oomadjusterPrevLaddering() && isPrevApp)) { + needLruAdjust = true; } } // If all processes have an assigned adj, no need to calculate and assign cached adjs. - if (unassignedAdj) { + if (needLruAdjust) { // TODO: b/319163103 - optimize cache adj assignment to not require the whole lru list. - assignCachedAdjIfNecessary(mProcessList.getLruProcessesLOSP()); + applyLruAdjust(mProcessList.getLruProcessesLOSP()); } // Repopulate any uid record that may have changed. diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index cdb01889c139..f86474f0dcaf 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -225,6 +225,7 @@ public final class ProcessList { // UI flow such as clicking on a URI in the e-mail app to view in the browser, // and then pressing back to return to e-mail. public static final int PREVIOUS_APP_ADJ = 700; + public static final int PREVIOUS_APP_MAX_ADJ = Flags.oomadjusterPrevLaddering() ? 799 : 700; // This is a process holding the home application -- we want to try // avoiding killing it, even if it would normally be in the background, diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig index 56cfdfb7edde..7b4d6c7fff82 100644 --- a/services/core/java/com/android/server/am/flags.aconfig +++ b/services/core/java/com/android/server/am/flags.aconfig @@ -242,4 +242,12 @@ flag { metadata { purpose: PURPOSE_BUGFIX } +} + +flag { + name: "oomadjuster_prev_laddering" + namespace: "system_performance" + is_fixed_read_only: true + description: "Add +X to the prev scores according to their positions in the process LRU list" + bug: "359912586" }
\ No newline at end of file diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java index b0053581963a..4a1315583ad4 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java @@ -60,6 +60,7 @@ import static com.android.server.am.ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_AP import static com.android.server.am.ProcessList.PERSISTENT_PROC_ADJ; import static com.android.server.am.ProcessList.PERSISTENT_SERVICE_ADJ; import static com.android.server.am.ProcessList.PREVIOUS_APP_ADJ; +import static com.android.server.am.ProcessList.PREVIOUS_APP_MAX_ADJ; import static com.android.server.am.ProcessList.SCHED_GROUP_BACKGROUND; import static com.android.server.am.ProcessList.SCHED_GROUP_DEFAULT; import static com.android.server.am.ProcessList.SCHED_GROUP_FOREGROUND_WINDOW; @@ -129,6 +130,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; /** * Test class for {@link OomAdjuster}. @@ -899,8 +901,25 @@ public class MockingOomAdjusterTests { @SuppressWarnings("GuardedBy") @Test + public void testUpdateOomAdj_DoPending_PreviousApp() { + testUpdateOomAdj_PreviousApp(apps -> { + for (ProcessRecord app : apps) { + mProcessStateController.enqueueUpdateTarget(app); + } + mProcessStateController.runPendingUpdate(OOM_ADJ_REASON_NONE); + }); + } + + @SuppressWarnings("GuardedBy") + @Test public void testUpdateOomAdj_DoAll_PreviousApp() { - final int numberOfApps = 15; + testUpdateOomAdj_PreviousApp(apps -> { + mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); + }); + } + + private void testUpdateOomAdj_PreviousApp(Consumer<ProcessRecord[]> updater) { + final int numberOfApps = 105; final ProcessRecord[] apps = new ProcessRecord[numberOfApps]; for (int i = 0; i < numberOfApps; i++) { apps[i] = spy(makeDefaultProcessRecord(MOCKAPP_PID + i, MOCKAPP_UID + i, @@ -911,10 +930,11 @@ public class MockingOomAdjusterTests { } setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); setProcessesToLru(apps); - mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); - + updater.accept(apps); for (int i = 0; i < numberOfApps; i++) { - assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, + final int mruIndex = numberOfApps - i - 1; + final int expectedAdj = Math.min(PREVIOUS_APP_ADJ + mruIndex, PREVIOUS_APP_MAX_ADJ); + assertProcStates(apps[i], PROCESS_STATE_LAST_ACTIVITY, expectedAdj, SCHED_GROUP_BACKGROUND, "previous"); } @@ -3184,7 +3204,8 @@ public class MockingOomAdjusterTests { setProcessesToLru(app1, app2); mProcessStateController.runFullUpdate(OOM_ADJ_REASON_NONE); - assertProcStates(app1, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, + assertProcStates(app1, PROCESS_STATE_LAST_ACTIVITY, + PREVIOUS_APP_ADJ + (Flags.oomadjusterPrevLaddering() ? 1 : 0), SCHED_GROUP_BACKGROUND, "recent-provider"); assertProcStates(app2, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, SCHED_GROUP_BACKGROUND, "recent-provider"); |