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:
committed by
Android (Google) Code Review
commit
eecef3cf8a
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user