DB Internals AtlasPostgreSQL 18.6 Home About

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 issues posix_fadvise hints 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/Os

In 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

All Resource Usage parameters