summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds/statsd/src/atoms.proto33
-rw-r--r--cmds/statsd/src/external/StatsPullerManager.cpp2
-rw-r--r--core/java/android/app/ProcessMemoryState.java6
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java5
-rw-r--r--services/core/java/com/android/server/am/MemoryStatUtil.java7
-rw-r--r--services/core/java/com/android/server/stats/StatsCompanionService.java1
-rw-r--r--services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java4
7 files changed, 38 insertions, 20 deletions
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 2f69ac18af7c..bce182076bd5 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -2404,25 +2404,28 @@ message ProcessMemoryState {
* Logs the memory stats for a native process (from procfs).
*/
message NativeProcessMemoryState {
- // The uid if available. -1 means not available.
- optional int32 uid = 1 [(is_uid) = true];
+ // The uid if available. -1 means not available.
+ optional int32 uid = 1 [(is_uid) = true];
+
+ // The process name.
+ optional string process_name = 2;
- // The process name.
- optional string process_name = 2;
+ // # of page-faults
+ optional int64 page_fault = 3;
- // # of page-faults
- optional int64 page_fault = 3;
+ // # of major page-faults
+ optional int64 page_major_fault = 4;
- // # of major page-faults
- optional int64 page_major_fault = 4;
+ // RSS
+ optional int64 rss_in_bytes = 5;
- // RSS
- optional int64 rss_in_bytes = 5;
+ // RSS high watermark.
+ // Peak RSS usage of the process. Value is read from the VmHWM field in /proc/PID/status.
+ optional int64 rss_high_watermark_in_bytes = 6;
- // RSS high watermark.
- // Peak RSS usage of the process. Value is read from the VmHWM field in /proc/PID/status or
- // from memory.max_usage_in_bytes under /dev/memcg if the device uses per-app memory cgroups.
- optional int64 rss_high_watermark_in_bytes = 6;
+ // Elapsed real time when the process started.
+ // Value is read from /proc/PID/stat, field 22.
+ optional int64 start_time_nanos = 7;
}
/*
@@ -3117,4 +3120,4 @@ message ProcessCpuTime {
optional int64 user_time_millis = 3;
// Process cpu time in system space, cumulative from boot/process start
optional int64 system_time_millis = 4;
-} \ No newline at end of file
+}
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index ba626f86f913..73a88c1b1796 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -172,7 +172,7 @@ const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}},
// native_process_memory_state
{android::util::NATIVE_PROCESS_MEMORY_STATE,
- {{3, 4, 5, 6},
+ {{3, 4, 5, 6, 7},
{2},
1 * NS_PER_SEC,
new StatsCompanionServicePuller(android::util::NATIVE_PROCESS_MEMORY_STATE)}},
diff --git a/core/java/android/app/ProcessMemoryState.java b/core/java/android/app/ProcessMemoryState.java
index 9bfdae0d8c03..d1492433a8db 100644
--- a/core/java/android/app/ProcessMemoryState.java
+++ b/core/java/android/app/ProcessMemoryState.java
@@ -33,10 +33,11 @@ public final class ProcessMemoryState implements Parcelable {
public final long cacheInBytes;
public final long swapInBytes;
public final long rssHighWatermarkInBytes;
+ public final long startTimeNanos;
public ProcessMemoryState(int uid, String processName, int oomScore, long pgfault,
long pgmajfault, long rssInBytes, long cacheInBytes,
- long swapInBytes, long rssHighWatermarkInBytes) {
+ long swapInBytes, long rssHighWatermarkInBytes, long startTimeNanos) {
this.uid = uid;
this.processName = processName;
this.oomScore = oomScore;
@@ -46,6 +47,7 @@ public final class ProcessMemoryState implements Parcelable {
this.cacheInBytes = cacheInBytes;
this.swapInBytes = swapInBytes;
this.rssHighWatermarkInBytes = rssHighWatermarkInBytes;
+ this.startTimeNanos = startTimeNanos;
}
private ProcessMemoryState(Parcel in) {
@@ -58,6 +60,7 @@ public final class ProcessMemoryState implements Parcelable {
cacheInBytes = in.readLong();
swapInBytes = in.readLong();
rssHighWatermarkInBytes = in.readLong();
+ startTimeNanos = in.readLong();
}
public static final Creator<ProcessMemoryState> CREATOR = new Creator<ProcessMemoryState>() {
@@ -88,5 +91,6 @@ public final class ProcessMemoryState implements Parcelable {
parcel.writeLong(cacheInBytes);
parcel.writeLong(swapInBytes);
parcel.writeLong(rssHighWatermarkInBytes);
+ parcel.writeLong(startTimeNanos);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 88558b48b2e5..a0d46c60b471 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -18620,7 +18620,8 @@ public class ActivityManagerService extends IActivityManager.Stub
memoryStat.rssInBytes,
memoryStat.cacheInBytes,
memoryStat.swapInBytes,
- memoryStat.rssHighWatermarkInBytes);
+ memoryStat.rssHighWatermarkInBytes,
+ memoryStat.startTimeNanos);
processMemoryStates.add(processMemoryState);
}
}
@@ -18643,7 +18644,7 @@ public class ActivityManagerService extends IActivityManager.Stub
ProcessMemoryState processMemoryState = new ProcessMemoryState(uid, processName,
oomScore, memoryStat.pgfault, memoryStat.pgmajfault,
memoryStat.rssInBytes, memoryStat.cacheInBytes, memoryStat.swapInBytes,
- memoryStat.rssHighWatermarkInBytes);
+ memoryStat.rssHighWatermarkInBytes, memoryStat.startTimeNanos);
processMemoryStates.add(processMemoryState);
}
return processMemoryStates;
diff --git a/services/core/java/com/android/server/am/MemoryStatUtil.java b/services/core/java/com/android/server/am/MemoryStatUtil.java
index 2c4b33864ea3..f77be5b0799c 100644
--- a/services/core/java/com/android/server/am/MemoryStatUtil.java
+++ b/services/core/java/com/android/server/am/MemoryStatUtil.java
@@ -23,6 +23,8 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NA
import android.annotation.Nullable;
import android.os.FileUtils;
import android.os.SystemProperties;
+import android.system.Os;
+import android.system.OsConstants;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
@@ -71,6 +73,7 @@ public final class MemoryStatUtil {
static final int BYTES_IN_KILOBYTE = 1024;
static final int PAGE_SIZE = 4096;
+ static final long JIFFY_NANOS = 1_000_000_000 / Os.sysconf(OsConstants._SC_CLK_TCK);
private static final String TAG = TAG_WITH_CLASS_NAME ? "MemoryStatUtil" : TAG_AM;
@@ -103,6 +106,7 @@ public final class MemoryStatUtil {
private static final int PGFAULT_INDEX = 9;
private static final int PGMAJFAULT_INDEX = 11;
+ private static final int START_TIME_INDEX = 21;
private static final int RSS_IN_PAGES_INDEX = 23;
private MemoryStatUtil() {}
@@ -238,6 +242,7 @@ public final class MemoryStatUtil {
memoryStat.pgfault = Long.parseLong(splits[PGFAULT_INDEX]);
memoryStat.pgmajfault = Long.parseLong(splits[PGMAJFAULT_INDEX]);
memoryStat.rssInBytes = Long.parseLong(splits[RSS_IN_PAGES_INDEX]) * PAGE_SIZE;
+ memoryStat.startTimeNanos = Long.parseLong(splits[START_TIME_INDEX]) * JIFFY_NANOS;
return memoryStat;
} catch (NumberFormatException e) {
Slog.e(TAG, "Failed to parse value", e);
@@ -279,5 +284,7 @@ public final class MemoryStatUtil {
long swapInBytes;
/** Number of bytes of peak anonymous and swap cache memory */
long rssHighWatermarkInBytes;
+ /** Device time when the processes started. */
+ long startTimeNanos;
}
}
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index 5600749ee437..19487061496b 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -1017,6 +1017,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
e.writeLong(processMemoryState.pgmajfault);
e.writeLong(processMemoryState.rssInBytes);
e.writeLong(processMemoryState.rssHighWatermarkInBytes);
+ e.writeLong(processMemoryState.startTimeNanos);
pulledData.add(e);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java b/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
index 9a283febe906..72c5b105cfef 100644
--- a/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/MemoryStatUtilTest.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import static com.android.server.am.MemoryStatUtil.BYTES_IN_KILOBYTE;
+import static com.android.server.am.MemoryStatUtil.JIFFY_NANOS;
import static com.android.server.am.MemoryStatUtil.MemoryStat;
import static com.android.server.am.MemoryStatUtil.PAGE_SIZE;
import static com.android.server.am.MemoryStatUtil.parseMemoryMaxUsageFromMemCg;
@@ -96,7 +97,7 @@ public class MemoryStatUtilTest {
"-2",
"117",
"0",
- "2206",
+ "2222", // this in start time (in ticks per second)
"1257177088",
"3", // this is RSS (number of pages)
"4294967295",
@@ -219,6 +220,7 @@ public class MemoryStatUtilTest {
assertEquals(3 * PAGE_SIZE, stat.rssInBytes);
assertEquals(0, stat.cacheInBytes);
assertEquals(0, stat.swapInBytes);
+ assertEquals(2222 * JIFFY_NANOS, stat.startTimeNanos);
}
@Test