Paid: bounded by hit latency, not the 30 s CPU budget.
The batch is small because php._run() is synchronous: a fill occupies the single-threaded
object and queued hits wait. At fillBatchSize: 25 alarms cost 4,337-5,832 ms of cpuTime (n=6)
and racing /__serve calls waited 5.0-6.8 s (n=5); a wall-clock guard cannot bound it (frozen
clock). The alarm re-arms 130-160 ms apart, so short batches match long ones' throughput; 8
fills at ~81 ms is ~650 ms of occupancy. Drain limits stay small for subrequests and memory.
Batching does amortise (per-page wall 109 ms at k=1 to 42.9 at k=20, deployed free, n=5), but
that is throughput on an idle object; the bounds are hit latency and the 128 MiB isolate.
Paid: bounded by hit latency, not the 30 s CPU budget.
The batch is small because
php._run()is synchronous: a fill occupies the single-threaded object and queued hits wait. AtfillBatchSize: 25alarms cost 4,337-5,832 ms of cpuTime (n=6) and racing/__servecalls waited 5.0-6.8 s (n=5); a wall-clock guard cannot bound it (frozen clock). The alarm re-arms 130-160 ms apart, so short batches match long ones' throughput; 8 fills at ~81 ms is ~650 ms of occupancy. Drain limits stay small for subrequests and memory. Batching does amortise (per-page wall 109 ms at k=1 to 42.9 at k=20, deployed free, n=5), but that is throughput on an idle object; the bounds are hit latency and the 128 MiB isolate.