1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-28 23:42:10 +03:00

Increase io_combine_limit range to 1MB.

The default of 128kB is unchanged, but the upper limit is changed from
32 blocks to 128 blocks, unless the operating system's IOV_MAX is too
low.  Some other RDBMSes seem to cap their multi-block buffer pool I/O
around this number, and it seems useful to allow experimentation.

The concrete change is to our definition of PG_IOV_MAX, which provides
the maximum for io_combine_limit and io_max_combine_limit.  It also
affects a couple of other places that work with arrays of struct iovec
or smaller objects on the stack, so we still don't want to use the
system IOV_MAX directly without a clamp: it is not under our control and
likely to be 1024.  128 seems acceptable for our current usage.

For Windows, we can't use real scatter/gather yet, so we continue to
define our own IOV_MAX value of 16 and emulate preadv()/pwritev() with
loops.  Someone would need to research the trade-offs of raising that
number.

NB if trying to see this working: you might temporarily need to hack
BAS_BULKREAD to be bigger, since otherwise the obvious way of "a very
big SELECT" is limited by that for now.

Suggested-by: Tomas Vondra <tomas@vondra.me>
Discussion: https://postgr.es/m/CA%2BhUKG%2B2T9p-%2BzM6Eeou-RAJjTML6eit1qn26f9twznX59qtCA%40mail.gmail.com
This commit is contained in:
Thomas Munro
2025-03-19 15:23:12 +13:00
parent 10f6646847
commit 06fb5612c9
4 changed files with 16 additions and 7 deletions

View File

@ -2638,6 +2638,8 @@ include_dir 'conf.d'
This parameter can only be set in
the <filename>postgresql.conf</filename> file or on the server
command line.
The maximum possible size depends on the operating system and block
size, but is typically 1MB on Unix and 128kB on Windows.
The default is 128kB.
</para>
</listitem>
@ -2655,6 +2657,8 @@ include_dir 'conf.d'
higher than the <varname>io_max_combine_limit</varname> parameter, the
lower value will silently be used instead, so both may need to be raised
to increase the I/O size.
The maximum possible size depends on the operating system and block
size, but is typically 1MB on Unix and 128kB on Windows.
The default is 128kB.
</para>
</listitem>