Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 30 Aug 12:38
· 54 commits to master since this release
The released binaries are now statically linked against musl, so one binary
runs whatever glibc the machine has. The previous ones were linked against the
build runner's glibc and refused to start on anything older.

That is only worth doing because shb no longer uses musl's allocator. Measured
against nginx with paired interleaved runs, musl's own costs twice the
userspace CPU per request that glibc's does on HTTP/2 and HTTP/3. How much of
that reaches throughput depends on how much of the work is in userspace, and
the three protocols answer differently: HTTP/3 loses 36% - 292k requests/sec
down to 186k - HTTP/2 loses 4%, and HTTP/1.1 loses nothing, because 98% of its
time is already in the kernel. Every build now uses mimalloc, which closes the
gap entirely and measures as no change on glibc. cargo install
--no-default-features opts out.

Fixes a portability bug that only building for one libc had hidden:
msg_controllen and cmsg_len are size_t against glibc and socklen_t against
musl, so the HTTP/3 GSO send path did not compile for musl at all.

Also since 0.2.4, the interop suites grew to cover implementations rather than
products: Hypercorn, Node and Go for HTTP/2 decoders written independently of
the C proxies, aioquic for a fourth containerised QUIC stack, and endpoints
that reach a 48 KB header block split across CONTINUATION frames, a server
that sends GOAWAY mid-run, HTTP/2 trailers from a gRPC server, and a real 100
Continue.