DB Internals AtlasPostgreSQL 18.6 Home About

Parameter · Resource Usage / I/O

effective_io_concurrency

Number of simultaneous requests that can be handled efficiently by the disk subsystem. 0 disables simultaneous requests.

  • Default: 16
  • Type: integer
  • Range: 0 … 1000
  • Applies: Session (any user)

In plain words

Modern disks, SSDs and cloud volumes can serve many requests at the same time. When PostgreSQL knows which blocks it will need next, it can ask for several in advance instead of waiting for each one. This setting is how far ahead it may go, i.e. how many reads a single session keeps in flight.

For DBAs and operators

Default changed from 1 to 16 in PostgreSQL 18, which introduced asynchronous I/O (io_method). It now controls the look-ahead distance of the read stream machinery used by sequential scans, bitmap heap scans, and other streaming reads; before PostgreSQL 17 it was used mainly for bitmap heap scan prefetching via posix_fadvise. 0 disables issuing asynchronous requests.

Sizing: for local NVMe and cloud block storage (EBS, Persistent Disk, Azure) values of 32–256 often help large scans, especially with high per-request latency. Spinning disks: low single digits. Too high adds latency for other sessions and wastes I/O if the scan stops early (LIMIT). Can be set per tablespace: ALTER TABLESPACE fast SET (effective_io_concurrency = 128).

-- watch I/Os in flight (PG18):
SELECT pid, operation, state, length, target_desc FROM pg_aios;
EXPLAIN (ANALYZE, BUFFERS) SELECT ...   -- compare timings

The actual number in flight is also capped by io_max_concurrency, and for maintenance work maintenance_io_concurrency is used instead.

How to change it

Any user can change it for their session with SET.

See it in context

Asynchronous I/O I/O workers Scan methods

Related parameters

maintenance_io_concurrency io_method io_max_concurrency io_combine_limit random_page_cost

All Resource Usage parameters