From a7f5e46549d2f31a26b9e44526aa9e34e9a64733 Mon Sep 17 00:00:00 2001 From: Anthony Volk Date: Mon, 6 Jul 2026 22:03:52 +0200 Subject: [PATCH] Lower ASGI gzip compresslevel from 9 to 4 Stage 2 warm-parity measurement found /us/metadata p95 at 13.2s on Cloud Run vs 4.3s on App Engine. The ~70MB raw payload is compressed in-request by GZipMiddleware at starlette's default level 9 on Cloud Run, while App Engine's nginx sidecar gzips natively. Measured on the real payload: level 9 = 5.5s -> 9.0MB, level 4 = 0.7s -> 9.9MB, a 7.5x compression speedup for ~10% larger output (~0.2s extra transfer). Fixes #3734 Co-Authored-By: Claude Opus 4.8 (1M context) --- changelog.d/metadata-gzip-compresslevel.fixed.md | 1 + policyengine_api/asgi_factory.py | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 changelog.d/metadata-gzip-compresslevel.fixed.md diff --git a/changelog.d/metadata-gzip-compresslevel.fixed.md b/changelog.d/metadata-gzip-compresslevel.fixed.md new file mode 100644 index 000000000..589044da6 --- /dev/null +++ b/changelog.d/metadata-gzip-compresslevel.fixed.md @@ -0,0 +1 @@ +Lower the ASGI gzip compression level from 9 to 4 so large responses like /us/metadata spend seconds less CPU compressing on Cloud Run, restoring warm-latency parity with App Engine. diff --git a/policyengine_api/asgi_factory.py b/policyengine_api/asgi_factory.py index e0fd10036..7eed9975e 100644 --- a/policyengine_api/asgi_factory.py +++ b/policyengine_api/asgi_factory.py @@ -53,7 +53,12 @@ def create_asgi_app(wsgi_app) -> FastAPI: redoc_url=None, openapi_url=None, ) - app.add_middleware(GZipMiddleware, minimum_size=1000) + # compresslevel 4 instead of starlette's default 9: /us/metadata is ~70MB + # raw, and level-9 compression inside the request costs seconds of CPU on + # Cloud Run (where no nginx sidecar handles gzip, unlike App Engine flex). + # Measured on the real payload: level 9 = 5.5s -> 9.0MB, level 4 = 0.7s -> + # 9.9MB — 7.5x faster for ~10% larger output. + app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=4) @app.middleware("http") async def add_cors_for_native_routes(request, call_next):