From a20c33866a8a849f51dfd142c688d6b5e337aa03 Mon Sep 17 00:00:00 2001 From: Ioannis Ilkos Date: Tue, 8 Jun 2021 14:01:10 +0100 Subject: [PATCH] Add VmStat atom and read the count of OOM kills We want to understand how frequently the OOM killer is invoked in our droidfood / prod fleets. To do so, introduce a /proc/vmstat reading atom which we can subsequently use as a ValueMetric to count number of OOM kills per session. Bug: 154233512 Test: atest VmStatTests Change-Id: I58ad126aa691c4ee1c61468e4c5ff5331649791c --- .../server/stats/pull/ProcfsMemoryUtil.java | 21 ++++++++++++++++ .../stats/pull/StatsPullAtomService.java | 24 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java b/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java index e1e6195ad2602..f653e4b26438f 100644 --- a/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java +++ b/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java @@ -30,6 +30,9 @@ public final class ProcfsMemoryUtil { "RssAnon:", "VmSwap:" }; + private static final String[] VMSTAT_KEYS = new String[] { + "oom_kill" + }; private ProcfsMemoryUtil() {} @@ -99,4 +102,22 @@ public final class ProcfsMemoryUtil { public int anonRssInKilobytes; public int swapInKilobytes; } + + /** Reads and parses selected entries of /proc/vmstat. */ + @Nullable + static VmStat readVmStat() { + long[] vmstat = new long[VMSTAT_KEYS.length]; + vmstat[0] = -1; + Process.readProcLines("/proc/vmstat", VMSTAT_KEYS, vmstat); + if (vmstat[0] == -1) { + return null; + } + VmStat result = new VmStat(); + result.oomKillCount = (int) vmstat[0]; + return result; + } + + static final class VmStat { + public int oomKillCount; + } } diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index dc868b325900d..cd0ce2bd46a7b 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -544,6 +544,8 @@ public class StatsPullAtomService extends SystemService { return pullProcessDmabufMemory(atomTag, data); case FrameworkStatsLog.SYSTEM_MEMORY: return pullSystemMemory(atomTag, data); + case FrameworkStatsLog.VMSTAT: + return pullVmStat(atomTag, data); case FrameworkStatsLog.TEMPERATURE: synchronized (mTemperatureLock) { return pullTemperatureLocked(atomTag, data); @@ -842,6 +844,7 @@ public class StatsPullAtomService extends SystemService { registerProcessSystemIonHeapSize(); registerSystemMemory(); registerProcessDmabufMemory(); + registerVmStat(); registerTemperature(); registerCoolingDevice(); registerBinderCallsStats(); @@ -2273,6 +2276,27 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; } + private void registerVmStat() { + int tagId = FrameworkStatsLog.VMSTAT; + mStatsManager.setPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + DIRECT_EXECUTOR, + mStatsCallbackImpl + ); + } + + int pullVmStat(int atomTag, List pulledData) { + ProcfsMemoryUtil.VmStat vmStat = ProcfsMemoryUtil.readVmStat(); + if (vmStat != null) { + pulledData.add( + FrameworkStatsLog.buildStatsEvent( + atomTag, + vmStat.oomKillCount)); + } + return StatsManager.PULL_SUCCESS; + } + private void registerTemperature() { int tagId = FrameworkStatsLog.TEMPERATURE; mStatsManager.setPullAtomCallback(