Until now we reduced the look-ahead distance by 1 on every hit, and doubled it on every miss. That is problematic because there are very common IO patterns where this prevents us from ever reaching a sufficiently high distance (e.g. a miss followed by a hit will never have the distance grow beyond 2). In many such cases, if we had ever reached a sufficient look-ahead distance, things would have been fine, because we grow the distance faster than we decrease it. One might think that the most obvious answer to this problem would be to never reduce the distance. However, that would not work well, as (particularly with upcoming users of read streams), it is reasonably common to at first have a lot of misses and then to transition to a fully cached workload, e.g. because the same blocks are needed repeatedly within one stream. Doing unnecessarily deep readahead can be costly, due to having to pin a lot more buffers, which increases CPU overhead. Because the cost of a synchronously handled miss can be very high (multiple milliseconds for every IO with commonly used storage) compared to the CPU overhead of keeping the distance too high, we want to err on the side of not reducing the distance too early. The insight that a decrease of the distance by 1 at ever hit may be ok at large distances, but not at low distances, shows a way out: If we only allow decreasing the distance once there were no misses for our maximum look-ahead distance, we will keep the distance high as long as readahead has a chance to do IO asynchronously, but not commonly when not. Several folks have written variants of this patch, including at least Thomas Munro, Melanie Plageman and I. Reviewed-by: Melanie Plageman <melanieplageman@gmail.com> Reviewed-by: Nazir Bilal Yavuz <byavuz81@gmail.com> Discussion: https://postgr.es/m/f3xxfrkafjxpyqxywcxricxgyizjirfceychyxsgn7bwjp5eda@kwbduhy7tfmu Discussion: https://postgr.es/m/CA+hUKGL2PhFyDoqrHefqasOnaXhSg48t1phs3VM8BAdrZqKZkw@mail.gmail.com Discussion: https://postgr.es/m/CAH2-Wz%3DkMg3PNay96cHMT0LFwtxP-cQSRZTZzh1Cixxf8G%3Dzrw%40mail.gmail.com |
||
|---|---|---|
| .github | ||
| config | ||
| contrib | ||
| doc | ||
| src | ||
| .cirrus.star | ||
| .cirrus.tasks.yml | ||
| .cirrus.yml | ||
| .dir-locals.el | ||
| .editorconfig | ||
| .git-blame-ignore-revs | ||
| .gitattributes | ||
| .gitignore | ||
| .mailmap | ||
| aclocal.m4 | ||
| configure | ||
| configure.ac | ||
| COPYRIGHT | ||
| GNUmakefile.in | ||
| HISTORY | ||
| Makefile | ||
| meson.build | ||
| meson_options.txt | ||
| README.md | ||
PostgreSQL Database Management System
This directory contains the source code distribution of the PostgreSQL database management system.
PostgreSQL is an advanced object-relational database management system that supports an extended subset of the SQL standard, including transactions, foreign keys, subqueries, triggers, user-defined types and functions. This distribution also contains C language bindings.
Copyright and license information can be found in the file COPYRIGHT.
General documentation about this version of PostgreSQL can be found at https://www.postgresql.org/docs/devel/. In particular, information about building PostgreSQL from the source code can be found at https://www.postgresql.org/docs/devel/installation.html.
The latest version of this software, and related software, may be obtained at https://www.postgresql.org/download/. For more information look at our web site located at https://www.postgresql.org/.