diff options
| -rw-r--r-- | cmds/statsd/src/atoms.proto | 6 | ||||
| -rw-r--r-- | core/java/android/os/Debug.java | 7 | ||||
| -rw-r--r-- | core/jni/android_os_Debug.cpp | 21 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/AppCompactor.java | 9 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/EventLogTags.logtags | 2 |
5 files changed, 42 insertions, 3 deletions
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index d7ab6e5f89bb..2585a5b27681 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -4821,6 +4821,12 @@ message AppCompacted { // The process state at the time of compaction. optional android.app.ProcessStateEnum process_state = 16 [default = PROCESS_STATE_UNKNOWN]; + + // Free ZRAM in kilobytes before compaction. + optional int64 before_zram_free_kilobytes = 17; + + // Free ZRAM in kilobytes after compaction. + optional int64 after_zram_free_kilobytes = 18; } /** diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index aba81af00282..149ef54462dc 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -2439,4 +2439,11 @@ public final class Debug VMDebug.attachAgent(library + "=" + options, classLoader); } } + + /** + * Return the current free ZRAM usage in kilobytes. + * + * @hide + */ + public static native long getZramFreeKb(); } diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index e9035ed102ae..195fe58f0beb 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -737,6 +737,25 @@ static jstring android_os_Debug_getUnreachableMemory(JNIEnv* env, jobject clazz, return env->NewStringUTF(s.c_str()); } +static jlong android_os_Debug_getFreeZramKb(JNIEnv* env, jobject clazz) { + + jlong zramFreeKb = 0; + + std::string status_path = android::base::StringPrintf("/proc/meminfo"); + UniqueFile file = MakeUniqueFile(status_path.c_str(), "re"); + + char line[256]; + while (file != nullptr && fgets(line, sizeof(line), file.get())) { + jlong v; + if (sscanf(line, "SwapFree: %" SCNd64 " kB", &v) == 1) { + zramFreeKb = v; + break; + } + } + + return zramFreeKb; +} + /* * JNI registration. */ @@ -778,6 +797,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_os_Debug_dumpNativeBacktraceToFileTimeout }, { "getUnreachableMemory", "(IZ)Ljava/lang/String;", (void*)android_os_Debug_getUnreachableMemory }, + { "getZramFreeKb", "()J", + (void*)android_os_Debug_getFreeZramKb }, }; int register_android_os_Debug(JNIEnv *env) diff --git a/services/core/java/com/android/server/am/AppCompactor.java b/services/core/java/com/android/server/am/AppCompactor.java index c7e4fc78c013..17ffd9c5e093 100644 --- a/services/core/java/com/android/server/am/AppCompactor.java +++ b/services/core/java/com/android/server/am/AppCompactor.java @@ -28,6 +28,7 @@ import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION; import android.app.ActivityManager; import android.app.ActivityThread; +import android.os.Debug; import android.os.Handler; import android.os.Message; import android.os.Process; @@ -410,6 +411,7 @@ public final class AppCompactor { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Compact " + ((pendingAction == COMPACT_PROCESS_SOME) ? "some" : "full") + ": " + name); + long zramFreeKbBefore = Debug.getZramFreeKb(); long[] rssBefore = Process.getRss(pid); FileOutputStream fos = new FileOutputStream("/proc/" + pid + "/reclaim"); fos.write(action.getBytes()); @@ -417,10 +419,12 @@ public final class AppCompactor { long[] rssAfter = Process.getRss(pid); long end = SystemClock.uptimeMillis(); long time = end - start; + long zramFreeKbAfter = Debug.getZramFreeKb(); EventLog.writeEvent(EventLogTags.AM_COMPACT, pid, name, action, rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, - lastCompactAction, lastCompactTime, msg.arg1, msg.arg2); + lastCompactAction, lastCompactTime, msg.arg1, msg.arg2, + zramFreeKbBefore, zramFreeKbAfter); // Note that as above not taking mPhenoTypeFlagLock here to avoid locking // on every single compaction for a flag that will seldom change and the // impact of reading the wrong value here is low. @@ -429,7 +433,8 @@ public final class AppCompactor { rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, lastCompactAction, lastCompactTime, msg.arg1, - ActivityManager.processStateAmToProto(msg.arg2)); + ActivityManager.processStateAmToProto(msg.arg2), + zramFreeKbBefore, zramFreeKbAfter); } synchronized (mAm) { proc.lastCompactTime = end; diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index a71f6af80bec..4b12e43692a6 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -138,4 +138,4 @@ option java_package com.android.server.am 30061 am_remove_task (Task ID|1|5), (Stack ID|1|5) # The task is being compacted -30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(AfterRssTotal|2|2),(AfterRssFile|2|2),(AfterRssAnon|2|2),(AfterRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2) +30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(AfterRssTotal|2|2),(AfterRssFile|2|2),(AfterRssAnon|2|2),(AfterRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2),(BeforeZRAMFree|2|2),(AfterZRAMFree|2|2) |