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

Commit 11965ede authored by Olivier Gaillard's avatar Olivier Gaillard
Browse files

Track max CPU and latency of binder calls

Test: unit tested

Change-Id: I1429e8c34e9cb0572975fda3ec18e85d6caf3cad
parent 22e64ec6
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -122,25 +122,25 @@ public class BinderCallsStats {
                mUidEntries.put(callingUid, uidEntry);
            }

            CallStat callStat;
            if (mDetailedTracking) {
                // Find CallStat entry and update its total time
                CallStat callStat = uidEntry.getOrCreate(s.callStat);
                callStat.callCount++;
                callStat.cpuTimeMicros += duration;
                callStat.latencyMicros += latencyDuration;
                callStat = uidEntry.getOrCreate(s.callStat);
                callStat.exceptionCount += s.exceptionThrown ? 1 : 0;
                callStat.maxLatencyMicros = Math.max(callStat.maxLatencyMicros, latencyDuration);
                callStat.maxRequestSizeBytes =
                        Math.max(callStat.maxRequestSizeBytes, parcelRequestSize);
                callStat.maxReplySizeBytes =
                        Math.max(callStat.maxReplySizeBytes, parcelReplySize);
            } else {
                // update sampled timings in the beginning of each interval
                if (s.cpuTimeStarted >= 0) {
                    s.sampledCallStat.cpuTimeMicros += duration;
                    s.sampledCallStat.latencyMicros += latencyDuration;
                callStat = s.sampledCallStat;
            }
                s.sampledCallStat.callCount++;
            callStat.callCount++;
            if (s.cpuTimeStarted >= 0) {
                callStat.cpuTimeMicros += duration;
                callStat.maxCpuTimeMicros = Math.max(callStat.maxCpuTimeMicros, duration);
                callStat.latencyMicros += latencyDuration;
                callStat.maxLatencyMicros = Math.max(callStat.maxLatencyMicros, latencyDuration);
            }

            uidEntry.cpuTimeMicros += duration;
@@ -189,7 +189,7 @@ public class BinderCallsStats {
        StringBuilder sb = new StringBuilder();
        if (mDetailedTracking) {
            pw.println("Per-UID raw data " + datasetSizeDesc
                    + "(uid, call_desc, cpu_time_micros, latency_time_micros, "
                    + "(uid, call_desc, cpu_time_micros, max_cpu_time_micros, latency_time_micros, "
                    + "max_latency_time_micros, exception_count, max_request_size_bytes, "
                    + "max_reply_size_bytes, call_count):");
            List<UidEntry> topEntries = verbose ? entries
@@ -200,6 +200,7 @@ public class BinderCallsStats {
                    sb.append("    ")
                            .append(uidEntry.uid).append(",").append(e)
                            .append(',').append(e.cpuTimeMicros)
                            .append(',').append(e.maxCpuTimeMicros)
                            .append(',').append(e.latencyMicros)
                            .append(',').append(e.maxLatencyMicros)
                            .append(',').append(e.exceptionCount)
@@ -260,7 +261,7 @@ public class BinderCallsStats {
        return Binder.getCallingUid();
    }

    private long getElapsedRealtimeMicro() {
    protected long getElapsedRealtimeMicro() {
        return SystemClock.elapsedRealtimeNanos() / 1000;
    }

@@ -288,11 +289,13 @@ public class BinderCallsStats {
        public String className;
        public int msg;
        public long cpuTimeMicros;
        public long maxCpuTimeMicros;
        public long latencyMicros;
        public long maxLatencyMicros;
        public long callCount;
        // The following fields are only computed if mDetailedTracking is set.
        public long maxRequestSizeBytes;
        public long maxReplySizeBytes;
        public long callCount;
        public long exceptionCount;

        CallStat() {
+42 −0
Original line number Diff line number Diff line
@@ -154,6 +154,42 @@ public class BinderCallsStatsTest {
        assertEquals(REPLY_SIZE, callStatsList.get(0).maxReplySizeBytes);
    }

    @Test
    public void testMaxCpu() {
        TestBinderCallsStats bcs = new TestBinderCallsStats(true);
        Binder binder = new Binder();
        BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
        bcs.time += 50;
        bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);

        callSession = bcs.callStarted(binder, 1);
        bcs.time += 10;
        bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);

        List<BinderCallsStats.CallStat> callStatsList =
                bcs.getUidEntries().get(TEST_UID).getCallStatsList();

        assertEquals(50, callStatsList.get(0).maxCpuTimeMicros);
    }

    @Test
    public void testMaxLatency() {
        TestBinderCallsStats bcs = new TestBinderCallsStats(true);
        Binder binder = new Binder();
        BinderCallsStats.CallSession callSession = bcs.callStarted(binder, 1);
        bcs.elapsedTime += 5;
        bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);

        callSession = bcs.callStarted(binder, 1);
        bcs.elapsedTime += 1;
        bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE);

        List<BinderCallsStats.CallStat> callStatsList =
                bcs.getUidEntries().get(TEST_UID).getCallStatsList();

        assertEquals(5, callStatsList.get(0).maxLatencyMicros);
    }

    @Test
    public void testGetHighestValues() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
@@ -165,6 +201,7 @@ public class BinderCallsStatsTest {
    static class TestBinderCallsStats extends BinderCallsStats {
        int callingUid = TEST_UID;
        long time = 1234;
        long elapsedTime = 0;

        TestBinderCallsStats(boolean detailedTracking) {
            super(detailedTracking);
@@ -175,6 +212,11 @@ public class BinderCallsStatsTest {
            return time;
        }

        @Override
        protected long getElapsedRealtimeMicro() {
            return elapsedTime;
        }

        @Override
        protected int getCallingUid() {
            return callingUid;