io_uring allows running a batch of operations fast, on behalf of the current process. As the name suggests, this works exceptionally well for I/O workloads. However, one of the most prominent workloads in software development involves executing other processes:
make and other build systems launch many other processes over the course of a build. How can we launch those processes faster?
What if we could launch other processes, and give them initial work to do using
io_uring, ending with an
exec? What if we could handle the pre-exec steps for a new process entirely in the kernel, with no userspace required, eliminating the need for
fork or even
vfork, and eliminating page-table CoW overhead?
In this talk, I'll introduce
io_uring_spawn, a mechanism for launching empty new processes with an associated
io_uring. I'll show how the kernel can launch a blank process, with no initial copy-on-write page tables, and initialize all of its resources from an
io_uring. I'll walk through both the successful path and the error-handling path, and show how to get information about the launched process. Finally, I'll show how existing userspace can take advantage of
io_uring_spawn to speed up
posix_spawn, and provide performance numbers for common workloads, including kernel compilation.
|I agree to abide by the anti-harassment policy||Yes|