Merge changes from topic "compact-improvements-v3" into tm-dev

* changes:
  Avoid full compaction when apps move within Cached bucket
  Add some compaction statistics around throttling
  Downgrade compactions after throttle checks
This commit is contained in:
Edgar Arriaga García
2022-05-17 21:50:08 +00:00
committed by Android (Google) Code Review

View File

@@ -341,10 +341,24 @@ public final class CachedAppOptimizer {
} }
}; };
// Compaction Stats
private int mSomeCompactionCount; private int mSomeCompactionCount;
private int mFullCompactionCount; private int mFullCompactionCount;
private int mPersistentCompactionCount; private int mPersistentCompactionCount;
private int mBfgsCompactionCount; private int mBfgsCompactionCount;
private long mSomeCompactRequest;
private long mFullCompactRequest;
private long mPersistentCompactRequest;
private long mBfgsCompactRequest;
private long mProcCompactionsRequested;
private long mProcCompactionsPerformed;
private long mProcCompactionsNoPidThrottled;
private long mProcCompactionsOomAdjThrottled;
private long mProcCompactionsTimeThrottled;
private long mProcCompactionsRSSThrottled;
private long mProcCompactionsMiscThrottled;
private long mSystemCompactionsPerformed;
private final ProcessDependencies mProcessDependencies; private final ProcessDependencies mProcessDependencies;
private final ProcLocksReader mProcLocksReader; private final ProcLocksReader mProcLocksReader;
@@ -436,9 +450,31 @@ public final class CachedAppOptimizer {
pw.println(" " + KEY_COMPACT_PROC_STATE_THROTTLE + "=" pw.println(" " + KEY_COMPACT_PROC_STATE_THROTTLE + "="
+ Arrays.toString(mProcStateThrottle.toArray(new Integer[0]))); + Arrays.toString(mProcStateThrottle.toArray(new Integer[0])));
pw.println(" " + mSomeCompactionCount + " some, " + mFullCompactionCount pw.println(" Requested: " + mSomeCompactRequest + " some, " + mFullCompactRequest
+ " full, " + mPersistentCompactRequest + " persistent, "
+ mBfgsCompactRequest + " BFGS compactions.");
pw.println(" Performed: " + mSomeCompactionCount + " some, " + mFullCompactionCount
+ " full, " + mPersistentCompactionCount + " persistent, " + " full, " + mPersistentCompactionCount + " persistent, "
+ mBfgsCompactionCount + " BFGS compactions."); + mBfgsCompactionCount + " BFGS compactions.");
pw.println(" Process Compactions Requested: " + mProcCompactionsRequested);
pw.println(" Process Compactions Performed: " + mProcCompactionsPerformed);
long compactionsThrottled = mProcCompactionsRequested - mProcCompactionsPerformed;
pw.println(" Process Compactions Throttled: " + compactionsThrottled);
double compactThrottlePercentage =
(compactionsThrottled / (double) mProcCompactionsRequested) * 100.0;
pw.println(" Process Compactions Throttle Percentage: " + compactThrottlePercentage);
pw.println(" NoPid Throttled: " + mProcCompactionsNoPidThrottled);
pw.println(" OomAdj Throttled: " + mProcCompactionsOomAdjThrottled);
pw.println(" Time Throttled: " + mProcCompactionsTimeThrottled);
pw.println(" RSS Throttled: " + mProcCompactionsRSSThrottled);
pw.println(" Misc Throttled: " + mProcCompactionsMiscThrottled);
long unaccountedThrottled = compactionsThrottled - mProcCompactionsNoPidThrottled
- mProcCompactionsOomAdjThrottled - mProcCompactionsTimeThrottled
- mProcCompactionsRSSThrottled - mProcCompactionsMiscThrottled;
// Any throttle that was not part of the previous categories
pw.println(" Unaccounted Throttled: " + unaccountedThrottled);
pw.println(" System Compactions Performed: " + mSystemCompactionsPerformed);
pw.println(" Tracking last compaction stats for " + mLastCompactionStats.size() pw.println(" Tracking last compaction stats for " + mLastCompactionStats.size()
+ " processes."); + " processes.");
@@ -479,6 +515,7 @@ public final class CachedAppOptimizer {
@GuardedBy("mProcLock") @GuardedBy("mProcLock")
void compactAppSome(ProcessRecord app, boolean force) { void compactAppSome(ProcessRecord app, boolean force) {
app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_SOME); app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_SOME);
++mSomeCompactRequest;
compactApp(app, force, "some"); compactApp(app, force, "some");
} }
@@ -519,6 +556,7 @@ public final class CachedAppOptimizer {
" compactAppFull requested for " + app.processName + " force: " + force " compactAppFull requested for " + app.processName + " force: " + force
+ " oomAdjEnteredCached: " + oomAdjEnteredCached); + " oomAdjEnteredCached: " + oomAdjEnteredCached);
} }
++mFullCompactRequest;
// Apply OOM adj score throttle for Full App Compaction. // Apply OOM adj score throttle for Full App Compaction.
if (force || oomAdjEnteredCached) { if (force || oomAdjEnteredCached) {
app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_FULL); app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_FULL);
@@ -535,6 +573,7 @@ public final class CachedAppOptimizer {
@GuardedBy("mProcLock") @GuardedBy("mProcLock")
void compactAppPersistent(ProcessRecord app) { void compactAppPersistent(ProcessRecord app) {
app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_PERSISTENT); app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_PERSISTENT);
++mPersistentCompactRequest;
compactApp(app, false, "Persistent"); compactApp(app, false, "Persistent");
} }
@@ -573,6 +612,7 @@ public final class CachedAppOptimizer {
@GuardedBy("mProcLock") @GuardedBy("mProcLock")
void compactAppBfgs(ProcessRecord app) { void compactAppBfgs(ProcessRecord app) {
++mBfgsCompactRequest;
app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_BFGS); app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_BFGS);
compactApp(app, false, " Bfgs"); compactApp(app, false, " Bfgs");
} }
@@ -1195,7 +1235,8 @@ public final class CachedAppOptimizer {
&& (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) { && (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) {
// Perform a minor compaction when a perceptible app becomes the prev/home app // Perform a minor compaction when a perceptible app becomes the prev/home app
compactAppSome(app, false); compactAppSome(app, false);
} else if (newAdj >= ProcessList.CACHED_APP_MIN_ADJ } else if (oldAdj < ProcessList.CACHED_APP_MIN_ADJ
&& newAdj >= ProcessList.CACHED_APP_MIN_ADJ
&& newAdj <= ProcessList.CACHED_APP_MAX_ADJ) { && newAdj <= ProcessList.CACHED_APP_MAX_ADJ) {
// Perform a major compaction when any app enters cached // Perform a major compaction when any app enters cached
compactAppFull(app, false); compactAppFull(app, false);
@@ -1223,14 +1264,16 @@ public final class CachedAppOptimizer {
break; break;
} }
// Downgrade compaction if facing swap memory pressure // Downgrade compaction under swap memory pressure
if (resolvedAction == COMPACT_ACTION_FULL) { if (resolvedAction == COMPACT_ACTION_FULL) {
double swapUsagePercent = getFreeSwapPercent(); double swapFreePercent = getFreeSwapPercent();
if (swapUsagePercent < COMPACT_DOWNGRADE_FREE_SWAP_THRESHOLD) { if (swapFreePercent < COMPACT_DOWNGRADE_FREE_SWAP_THRESHOLD) {
resolvedAction = COMPACT_ACTION_FILE;
if (DEBUG_COMPACTION) {
Slog.d(TAG_AM, Slog.d(TAG_AM,
"Downgraded compaction to file only due to low swap." "Downgraded compaction to file only due to low swap."
+ " Swap Free% " + swapUsagePercent); + " Swap Free% " + swapFreePercent);
resolvedAction = COMPACT_ACTION_FILE; }
} }
} }
@@ -1445,28 +1488,33 @@ public final class CachedAppOptimizer {
lastCompactTime = opt.getLastCompactTime(); lastCompactTime = opt.getLastCompactTime();
} }
int resolvedAction = resolveCompactionAction(requestedAction); ++mProcCompactionsRequested;
long[] rssBefore; long[] rssBefore;
if (pid == 0) { if (pid == 0) {
// not a real process, either one being launched or one being killed // not a real process, either one being launched or one being killed
if (DEBUG_COMPACTION) { if (DEBUG_COMPACTION) {
Slog.d(TAG_AM, "Compaction failed, pid is 0"); Slog.d(TAG_AM, "Compaction failed, pid is 0");
} }
++mProcCompactionsNoPidThrottled;
return; return;
} }
if (!forceCompaction) { if (!forceCompaction) {
if (shouldOomAdjThrottleCompaction(proc, resolvedAction)) { if (shouldOomAdjThrottleCompaction(proc, requestedAction)) {
++mProcCompactionsOomAdjThrottled;
return; return;
} }
if (shouldTimeThrottleCompaction(proc, start, requestedAction)) { if (shouldTimeThrottleCompaction(proc, start, requestedAction)) {
++mProcCompactionsTimeThrottled;
return; return;
} }
if (shouldThrottleMiscCompaction(proc, procState, resolvedAction)) { if (shouldThrottleMiscCompaction(proc, procState, requestedAction)) {
++mProcCompactionsMiscThrottled;
return; return;
} }
rssBefore = mProcessDependencies.getRss(pid); rssBefore = mProcessDependencies.getRss(pid);
if (shouldRssThrottleCompaction(resolvedAction, pid, name, rssBefore)) { if (shouldRssThrottleCompaction(requestedAction, pid, name, rssBefore)) {
++mProcCompactionsRSSThrottled;
return; return;
} }
} else { } else {
@@ -1494,11 +1542,14 @@ public final class CachedAppOptimizer {
default: default:
break; break;
} }
int resolvedAction = resolveCompactionAction(requestedAction);
action = compactActionIntToString(resolvedAction); action = compactActionIntToString(resolvedAction);
try { try {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
"Compact " + action + ": " + name); "Compact " + action + ": " + name);
++mProcCompactionsPerformed;
long zramFreeKbBefore = Debug.getZramFreeKb(); long zramFreeKbBefore = Debug.getZramFreeKb();
mProcessDependencies.performCompaction(action, pid); mProcessDependencies.performCompaction(action, pid);
long[] rssAfter = mProcessDependencies.getRss(pid); long[] rssAfter = mProcessDependencies.getRss(pid);
@@ -1550,6 +1601,7 @@ public final class CachedAppOptimizer {
break; break;
} }
case COMPACT_SYSTEM_MSG: { case COMPACT_SYSTEM_MSG: {
++mSystemCompactionsPerformed;
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "compactSystem"); Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "compactSystem");
compactSystem(); compactSystem();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);