You can compare worker_pool/io_uring/aio etc. using `fio` to see how different io approaches perform on the same hardware.
You can compare worker_pool/io_uring/aio etc. using `fio` to see how different io approaches perform on the same hardware.
With io_uring everything happens in the backend process, and so consumes some of the CPU time that might otherwise be spent executing the query. All the checksum verification, memcpy into shared buffers, etc. happen in the backend. And those things can be quite expensive. With worker this happens in the other processes, spreading the overhead.
Of course, on truly I/O-bound workload (actually waiting on the I/O), this may not be a huge difference. For warmed-up cases it may be more significant.
But this is more difficult than spawning thousands of os threads and running sync workers on them
Some of these limitations are mostly due to Postgres design, no doubt about that.
If there are no threads then this would be, you can have a process per cpu core