A deep historical analysis of PostgreSQL's `effective_io_concurrency` parameter, which has changed its meaning three times across major versions. Before PostgreSQL 13, the value was fed through a harmonic-series formula tied to spindle counts. PostgreSQL 13 made it a direct I/O request count. PostgreSQL 18 transformed it again into a real async I/O depth control, backed by a new AIO subsystem with `io_method` options including `worker` and `io_uring`. The default jumped from 1 to 16 in PG18 to reflect genuine async read-ahead capability. Practical guidance: use 16+ on NVMe/cloud storage in PG18, ~200 for SSDs in PG13-17, and never copy a value across major versions without checking which era applies.

5m read timeFrom postgr.es
Post cover image
Table of contents
Era one: the spindle oracle (pre-13)Era two: the number becomes itself (13–17)Era three: real asynchronous I/O (18)What to actually set
336 Impressions