Parameter · Resource Usage / I/O
io_method
Selects the method for executing asynchronous I/O.
- Default:
worker - Type: enum
- Values: sync · worker · io_uring
- Applies: Restart required
In plain words
PostgreSQL 18 can start reads in advance and keep working while they complete. This setting chooses who does the actual reading: a small pool of I/O worker processes (default), the Linux kernel's io_uring interface, or nobody (sync, the old behaviour where each process reads for itself and waits).
For DBAs and operators
New in PostgreSQL 18 (asynchronous I/O for reads: sequential scans, bitmap heap scans, VACUUM, ANALYZE …; writes are still synchronous).
worker: backends put requests in a shared queue; io_workers processes (backend_type = 'io worker'in pg_stat_activity) execute them. Works everywhere.io_uring: each backend submits directly to the kernel; lowest overhead. Linux only, server built with liburing, and some container runtimes block io_uring syscalls by seccomp policy. Each backend needs an io_uring instance, which uses file descriptors.sync: no asynchrony; read-ahead still issuesposix_fadvisehints like PostgreSQL 17. Useful to rule out AIO when debugging.
SELECT pid, backend_type FROM pg_stat_activity
WHERE backend_type = 'io worker';
SELECT * FROM pg_aios; -- in-flight I/OsIn wait events, waiting on async reads appears as AioIoCompletion; I/O workers waiting for work show IoWorkerMain.
How to change it
Change in postgresql.conf or ALTER SYSTEM, then restart the server.
See it in context
Asynchronous I/O I/O workers Life of a SELECT Server startup sequence Buffer manager internals
Related parameters
io_workers effective_io_concurrency io_max_concurrency io_combine_limit