Skip to content

io_uring: blocking libpq in the single-threaded ring worker collapses DB profiles (defer to the stateful-async migration) #83

Description

@enghitalo

Summary

The io_uring backend has no async runtime (README: request_handler only). The HttpArena DB endpoints call the blocking db.pg client (PQexecParams) synchronously inside the single-threaded ring worker → head-of-line blocking, the ring stalls on every query.

Impact (HttpArena, vanilla-io_uring vs vanilla-epoll)

  • async-db ~10.7k rps (epoll ~280k) — ~26× behind its own epoll
  • fortunes ~41 rps (epoll ~165k)
  • api-16 ~28k, api-4 ~29k, crud ~225k (epoll 307k)

epoll handles all of these fine via the per-worker async pool + async_handler; only io_uring collapses.

Resolution (deferred — per the roadmap)

Tracked for the planned "everything stateful-async in vanilla" direction: give the io_uring backend the same async runtime (await DB readiness on the ring instead of blocking), or route DB calls to a worker thread pool as an interim. Not a quick fix — XL. Filed so the io_uring DB collapse is documented and tied to that future work.

Fix location: io_uring backend (http_server/http_server_io_uring_linux.c.v + the async runtime). Found in the HttpArena profile audit.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions