BroadcastQueue: Initial deterministic perf test.

As we start working on the "modern" alternative broadcast queue
implementation, we'd like to gain confidence that we're actually
improving the metrics we care about, without having to wait for
changes to deploy to wider user populations.

Instead of writing these using a traditional timing approach (which
can suffer from scheduling noise), we explore "playing back" a set
of well-known pathological scenarios, which will result in a
deterministic output that can be used to immediately judge if a
given CL improves or regresses a measured metric.

Bug: 245771249
Test: atest FrameworksMockingServicesTests:BroadcastQueueTest
Change-Id: I6f562c0b6f2a71fef52aae013899de7f2f95bc71
This commit is contained in:
Jeff Sharkey
2023-04-10 15:21:44 -06:00
parent 1be684590b
commit 3f400959e2

View File

@@ -1980,6 +1980,46 @@ public class BroadcastQueueTest {
verify(mAms, never()).enqueueOomAdjTargetLocked(any());
}
/**
* Confirm how many times a pathological broadcast pattern results in OOM
* adjusts; watches for performance regressions.
*/
@Test
public void testOomAdjust_TriggerCount() throws Exception {
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
// Send 8 broadcasts, 4 receivers in the first process,
// and 2 alternating in each of the remaining processes
synchronized (mAms) {
for (int i = 0; i < 8; i++) {
final Intent intent = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
mQueue.enqueueBroadcastLocked(makeBroadcastRecord(intent, callerApp,
List.of(makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN),
makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN),
makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN),
makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN),
makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE),
makeManifestReceiver(PACKAGE_YELLOW, CLASS_YELLOW),
makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE),
makeManifestReceiver(PACKAGE_YELLOW, CLASS_YELLOW))));
}
}
waitForIdle();
final int expectedTimes;
switch (mImpl) {
// Original stack requested for every single receiver; yikes
case DEFAULT: expectedTimes = 64; break;
// Modern stack requests once each time we promote a process to
// running; we promote "green" twice, and "blue" and "yellow" once
case MODERN: expectedTimes = 4; break;
default: throw new UnsupportedOperationException();
}
verify(mAms, times(expectedTimes))
.updateOomAdjPendingTargetsLocked(eq(OOM_ADJ_REASON_START_RECEIVER));
}
/**
* Verify that expected events are triggered when a broadcast is finished.
*/