summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Edgar Arriaga <edgararriaga@google.com> 2023-01-13 22:24:33 +0000
committer Cherrypicker Worker <android-build-cherrypicker-worker@google.com> 2023-03-16 21:36:18 +0000
commit29a79cf724e6d3fd27dd092bc02952537e56757b (patch)
treeddd623e7ce50b959d27f5c04fd7627d6aadb281c
parent3d961ed78da86efb193d3683531db1f1cce62274 (diff)
Disable file compaction by default
At present time kernel does not support shared pages to be swapped using file compaction which uses MADV_COLD and most of the file pages in a process are actually shared mappings causing us to waste a lot of cycles scanning through a lot of unreclaimable pages, this patch disables file compaction which will be reenabled until a solution is implemented on upstream kernel that allows reclaiming shared pages, thus making it worth to scan all of those pages again. Test: am compact file <processname> <uid> Bug: 265473345 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:30b069612a9d35b02cc6c2656c18326e8cffeec6) Merged-In: I4c819058da229c00d1eafea636f89784718adc5f Change-Id: I4c819058da229c00d1eafea636f89784718adc5f
-rw-r--r--services/core/java/com/android/server/am/CachedAppOptimizer.java75
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java22
2 files changed, 58 insertions, 39 deletions
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index c0c235b2c1c4..28b1fc0610d4 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -106,6 +106,8 @@ public final class CachedAppOptimizer {
private static final int FREEZE_BINDER_TIMEOUT_MS = 100;
+ @VisibleForTesting static final boolean ENABLE_FILE_COMPACT = false;
+
// Defaults for phenotype flags.
@VisibleForTesting static final Boolean DEFAULT_USE_COMPACTION = true;
@VisibleForTesting static final Boolean DEFAULT_USE_FREEZER = true;
@@ -143,24 +145,17 @@ public final class CachedAppOptimizer {
@VisibleForTesting
interface ProcessDependencies {
long[] getRss(int pid);
- void performCompaction(CompactAction action, int pid) throws IOException;
+ void performCompaction(CompactProfile action, int pid) throws IOException;
}
// This indicates the compaction we want to perform
public enum CompactProfile {
+ NONE, // No compaction
SOME, // File compaction
+ ANON, // Anon compaction
FULL // File+anon compaction
}
- // Low level actions that can be performed for compaction
- // currently determined by the compaction profile
- public enum CompactAction {
- NONE, // No compaction
- FILE, // File+anon compaction
- ANON,
- ALL
- }
-
// This indicates the process OOM memory state that initiated the compaction request
public enum CompactSource { APP, PERSISTENT, BFGS }
@@ -1415,8 +1410,10 @@ public final class CachedAppOptimizer {
if (oldAdj <= ProcessList.PERCEPTIBLE_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
- compactApp(app, CompactProfile.SOME, CompactSource.APP, false);
+ if (ENABLE_FILE_COMPACT) {
+ // Perform a minor compaction when a perceptible app becomes the prev/home app
+ compactApp(app, CompactProfile.SOME, CompactSource.APP, false);
+ }
} else if (oldAdj < ProcessList.CACHED_APP_MIN_ADJ
&& newAdj >= ProcessList.CACHED_APP_MIN_ADJ
&& newAdj <= ProcessList.CACHED_APP_MAX_ADJ) {
@@ -1426,23 +1423,37 @@ public final class CachedAppOptimizer {
}
/**
- * Applies a compaction downgrade when swap is low.
+ * Computes the final compaction profile to be used which depends on compaction
+ * features enabled and swap usage.
*/
- CompactProfile downgradeCompactionIfRequired(CompactProfile profile) {
- // Downgrade compaction under swap memory pressure
+ CompactProfile resolveCompactionProfile(CompactProfile profile) {
if (profile == CompactProfile.FULL) {
double swapFreePercent = getFreeSwapPercent();
+ // Downgrade compaction under swap memory pressure
if (swapFreePercent < COMPACT_DOWNGRADE_FREE_SWAP_THRESHOLD) {
profile = CompactProfile.SOME;
+
++mTotalCompactionDowngrades;
if (DEBUG_COMPACTION) {
Slog.d(TAG_AM,
- "Downgraded compaction to file only due to low swap."
+ "Downgraded compaction to "+ profile +" due to low swap."
+ " Swap Free% " + swapFreePercent);
}
}
}
+ if (!ENABLE_FILE_COMPACT) {
+ if (profile == CompactProfile.SOME) {
+ profile = CompactProfile.NONE;
+ } else if (profile == CompactProfile.FULL) {
+ profile = CompactProfile.ANON;
+ }
+ if (DEBUG_COMPACTION) {
+ Slog.d(TAG_AM,
+ "Final compaction profile "+ profile +" due to file compact disabled");
+ }
+ }
+
return profile;
}
@@ -1673,7 +1684,6 @@ public final class CachedAppOptimizer {
ProcessRecord proc;
final ProcessCachedOptimizerRecord opt;
int pid;
- CompactAction resolvedAction;
final String name;
CompactProfile lastCompactProfile;
long lastCompactTime;
@@ -1751,17 +1761,24 @@ public final class CachedAppOptimizer {
}
CompactProfile resolvedProfile =
- downgradeCompactionIfRequired(requestedProfile);
- resolvedAction = resolveCompactActionForProfile(resolvedProfile);
+ resolveCompactionProfile(requestedProfile);
+ if (resolvedProfile == CompactProfile.NONE) {
+ // No point on issuing compaction call as we don't want to compact.
+ if (DEBUG_COMPACTION) {
+ Slog.d(TAG_AM, "Resolved no compaction for "+ name +
+ " requested profile="+requestedProfile);
+ }
+ return;
+ }
try {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
- "Compact " + resolvedAction.name() + ": " + name
+ "Compact " + resolvedProfile.name() + ": " + name
+ " lastOomAdjReason: " + oomAdjReason
+ " source: " + compactSource.name());
long zramUsedKbBefore = getUsedZramMemory();
long startCpuTime = threadCpuTimeNs();
- mProcessDependencies.performCompaction(resolvedAction, pid);
+ mProcessDependencies.performCompaction(resolvedProfile, pid);
long endCpuTime = threadCpuTimeNs();
long[] rssAfter = mProcessDependencies.getRss(pid);
long end = SystemClock.uptimeMillis();
@@ -1817,7 +1834,7 @@ public final class CachedAppOptimizer {
return;
}
EventLog.writeEvent(EventLogTags.AM_COMPACT, pid, name,
- resolvedAction.name(), rssBefore[RSS_TOTAL_INDEX],
+ resolvedProfile.name(), rssBefore[RSS_TOTAL_INDEX],
rssBefore[RSS_FILE_INDEX], rssBefore[RSS_ANON_INDEX],
rssBefore[RSS_SWAP_INDEX], deltaTotalRss, deltaFileRss,
deltaAnonRss, deltaSwapRss, time, lastCompactProfile.name(),
@@ -2110,14 +2127,14 @@ public final class CachedAppOptimizer {
// Compact process.
@Override
- public void performCompaction(CompactAction action, int pid) throws IOException {
+ public void performCompaction(CompactProfile profile, int pid) throws IOException {
mPidCompacting = pid;
- if (action == CompactAction.ALL) {
- compactProcess(pid, COMPACT_ACTION_FILE_FLAG | COMPACT_ACTION_ANON_FLAG);
- } else if (action == CompactAction.FILE) {
- compactProcess(pid, COMPACT_ACTION_FILE_FLAG);
- } else if (action == CompactAction.ANON) {
- compactProcess(pid, COMPACT_ACTION_ANON_FLAG);
+ if (profile == CompactProfile.FULL) {
+ compactProcess(pid, COMPACT_ACTION_FILE_FLAG | COMPACT_ACTION_ANON_FLAG);
+ } else if (profile == CompactProfile.SOME) {
+ compactProcess(pid, COMPACT_ACTION_FILE_FLAG);
+ } else if (profile == CompactProfile.ANON) {
+ compactProcess(pid, COMPACT_ACTION_ANON_FLAG);
}
mPidCompacting = -1;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
index b38ca627be80..1fbb8dd5ac9d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java
@@ -19,7 +19,6 @@ package com.android.server.am;
import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
import static com.android.server.am.ActivityManagerService.Injector;
-import static com.android.server.am.CachedAppOptimizer.compactActionIntToAction;
import static com.google.common.truth.Truth.assertThat;
@@ -1024,14 +1023,17 @@ public final class CachedAppOptimizerTest {
mCachedAppOptimizerUnderTest.mLastCompactionStats.clear();
- // We force a some compaction
- mCachedAppOptimizerUnderTest.compactApp(processRecord,
- CachedAppOptimizer.CompactProfile.SOME, CachedAppOptimizer.CompactSource.APP, true);
- waitForHandler();
- // then process is compacted.
- CachedAppOptimizer.CompactProfile executedCompactProfile =
- processRecord.mOptRecord.getLastCompactProfile();
- assertThat(executedCompactProfile).isEqualTo(CachedAppOptimizer.CompactProfile.SOME);
+ if (CachedAppOptimizer.ENABLE_FILE_COMPACT) {
+ // We force a some compaction
+ mCachedAppOptimizerUnderTest.compactApp(processRecord,
+ CachedAppOptimizer.CompactProfile.SOME, CachedAppOptimizer.CompactSource.APP,
+ true);
+ waitForHandler();
+ // then process is compacted.
+ CachedAppOptimizer.CompactProfile executedCompactProfile =
+ processRecord.mOptRecord.getLastCompactProfile();
+ assertThat(executedCompactProfile).isEqualTo(CachedAppOptimizer.CompactProfile.SOME);
+ }
}
private void setFlag(String key, String value, boolean defaultValue) throws Exception {
@@ -1108,7 +1110,7 @@ public final class CachedAppOptimizerTest {
}
@Override
- public void performCompaction(CachedAppOptimizer.CompactAction action, int pid)
+ public void performCompaction(CachedAppOptimizer.CompactProfile profile, int pid)
throws IOException {
mRss = mRssAfterCompaction;
}