Re: AIO / read stream heuristics adjustments for index prefetching
Andres Freund <andres@anarazel.de>
From: Andres Freund <andres@anarazel.de>
To: Melanie Plageman <melanieplageman@gmail.com>
Cc: pgsql-hackers@postgresql.org, Thomas Munro <thomas.munro@gmail.com>, Peter Geoghegan <pg@bowt.ie>, Tomas Vondra <tv@fuzzy.cz>, Nazir Bilal Yavuz <byavuz81@gmail.com>
Date: 2026-04-02T21:30:05Z
Lists: pgsql-hackers
Hi, On 2026-04-02 17:13:34 -0400, Melanie Plageman wrote: > On Thu, Apr 2, 2026 at 11:47 AM Andres Freund <andres@anarazel.de> wrote: > > > > > On some level, relying on worker mode overhead feels fragile. If > > > worker overhead decreases—say, by moving to IO worker threads—we won't > > > be able to rely on this to keep the distance to an advantageous level. > > > > I don't see why lower overhead would prevent this from working? > > needed_wait has to be true to increase the readahead distance and for > io_uring, when data was in the kernel buffer cache, needed_wait is > false, meaning the distance doesn't increase. Worker mode didn't have > this problem because of overhead. So needed_wait is true for workers. > But, now that we will have combine_distance, I guess we don't need to > rely on workers having overhead. I think we still do, but that it will continue to work, even if the overhead is much smaller than today. The workers will complete the IOs only after the memory copy is finished (duh). Therefore, if the distance is too small to allow workers to complete the copy, the distance will be increased, due to needed_wait. > So we are saying that readahead_distance is completely irrelevant for > copying from the kernel buffer cache and only combine_distance matters for > that now, right? I don't think so! The combine_distance thing is crucial to allow for IO combining, and, indirectly, for triggering the size based "async" heuristics with io_uring. Once the io_uring async heuristic is triggered, the needed_wait mechanism works to further increase the distance. That does mean that for random BLCKSZ sized IOs that are in the page cache the async mechanism won't typically be triggered - but from what I can tell that's ok, because lots of 8kB IOs is also where the dispatch overhead to the kernel threads doing the copying is the highest. Greetings, Andres Freund
Commits
-
aio: io_uring: Trigger async processing for large IOs
- a9ee66881744 19 (unreleased) landed
-
read stream: Split decision about look ahead for AIO and combining
- 8ca147d582a5 19 (unreleased) landed
-
read_stream: Move logic about IO combining & issuing to helpers
- 434dab76ba76 19 (unreleased) landed
-
read_stream: Only increase read-ahead distance when waiting for IO
- f63ca3379025 19 (unreleased) landed
-
read_stream: Prevent distance from decaying too quickly
- 6e36930f9aaf 19 (unreleased) landed
-
read_stream: Issue IO synchronously while in fast path
- cceb1bf45e3a 19 (unreleased) landed
-
aio: io_uring: Allow IO methods to check if IO completed in the background
- 6e648e353fa0 19 (unreleased) landed
-
bufmgr: Return whether WaitReadBuffers() needed to wait
- 513374a47a71 19 (unreleased) landed