I’m curious as to whether the HTTP requests re-used the TCP socket or if they were dumb “Connection: close” ones that closed the socket and set up a new one for each request.

The overhead for that alone would outstrip any benefits.

I don't think the `ab` tool does anything special, so it's likely these are closed and reopened after each request. For the purposes of comparison of one architecture to another, this was sufficient, and mimics user behavior well enough. But feel free to try out the test with different headers!

Everyone I know in the API / CDN / Proxy space switched from using ab to wrk years ago for good reason. PSA: Please stop using ab and use wrk/wrk2. ab doesn't even support HTTP 1.1...

Good to know! Would you be interested in performing the same tests and using `wrk` and report the difference?

It would be more of apples to apples comparison to run it on the same setup you ran ab on. You can grab wrk here: https://github.com/wg/wrk Enjoy!