mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +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:
parent
10f6646847
commit
06fb5612c9
@ -2638,6 +2638,8 @@ include_dir 'conf.d'
|
|||||||
This parameter can only be set in
|
This parameter can only be set in
|
||||||
the <filename>postgresql.conf</filename> file or on the server
|
the <filename>postgresql.conf</filename> file or on the server
|
||||||
command line.
|
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.
|
The default is 128kB.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
@ -2655,6 +2657,8 @@ include_dir 'conf.d'
|
|||||||
higher than the <varname>io_max_combine_limit</varname> parameter, the
|
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
|
lower value will silently be used instead, so both may need to be raised
|
||||||
to increase the I/O size.
|
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.
|
The default is 128kB.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
@ -515,9 +515,10 @@ read_stream_begin_impl(int flags,
|
|||||||
* finishes we don't want to have to wait for its buffers to be consumed
|
* finishes we don't want to have to wait for its buffers to be consumed
|
||||||
* before starting a new one.
|
* before starting a new one.
|
||||||
*
|
*
|
||||||
* Be careful not to allow int16 to overflow (even though that's not
|
* Be careful not to allow int16 to overflow. That is possible with the
|
||||||
* possible with the current GUC range limits), allowing also for the
|
* current GUC range limits, so this is an artificial limit of ~32k
|
||||||
* spare entry and the overflow space.
|
* buffers and we'd need to adjust the types to exceed that. We also have
|
||||||
|
* to allow for the spare entry and the overflow space.
|
||||||
*/
|
*/
|
||||||
max_pinned_buffers = (max_ios + 1) * io_combine_limit;
|
max_pinned_buffers = (max_ios + 1) * io_combine_limit;
|
||||||
max_pinned_buffers = Min(max_pinned_buffers,
|
max_pinned_buffers = Min(max_pinned_buffers,
|
||||||
|
@ -200,9 +200,9 @@
|
|||||||
#backend_flush_after = 0 # measured in pages, 0 disables
|
#backend_flush_after = 0 # measured in pages, 0 disables
|
||||||
#effective_io_concurrency = 16 # 1-1000; 0 disables prefetching
|
#effective_io_concurrency = 16 # 1-1000; 0 disables prefetching
|
||||||
#maintenance_io_concurrency = 16 # 1-1000; 0 disables prefetching
|
#maintenance_io_concurrency = 16 # 1-1000; 0 disables prefetching
|
||||||
#io_max_combine_limit = 128kB # usually 1-32 blocks (depends on OS)
|
#io_max_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
|
||||||
# (change requires restart)
|
# (change requires restart)
|
||||||
#io_combine_limit = 128kB # usually 1-32 blocks (depends on OS)
|
#io_combine_limit = 128kB # usually 1-128 blocks (depends on OS)
|
||||||
|
|
||||||
#io_method = worker # worker, sync (change requires restart)
|
#io_method = worker # worker, sync (change requires restart)
|
||||||
#io_max_concurrency = -1 # Max number of IOs that one process
|
#io_max_concurrency = -1 # Max number of IOs that one process
|
||||||
|
@ -33,8 +33,12 @@ struct iovec
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define a reasonable maximum that is safe to use on the stack. */
|
/*
|
||||||
#define PG_IOV_MAX Min(IOV_MAX, 32)
|
* Define a reasonable maximum that is safe to use on the stack in arrays of
|
||||||
|
* struct iovec and other small types. The operating system could limit us to
|
||||||
|
* a number as low as 16, but most systems have 1024.
|
||||||
|
*/
|
||||||
|
#define PG_IOV_MAX Min(IOV_MAX, 128)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Like preadv(), but with a prefix to remind us of a side-effect: on Windows
|
* Like preadv(), but with a prefix to remind us of a side-effect: on Windows
|
||||||
|
Loading…
x
Reference in New Issue
Block a user