Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a20c3386 authored by Ioannis Ilkos's avatar Ioannis Ilkos
Browse files

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
parent 7dfe7b74
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -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;
    }
}
+24 −0
Original line number Diff line number Diff line
@@ -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<StatsEvent> 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(