Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit06fb561

Browse files
committed
Increase io_combine_limit range to 1MB.
The default of 128kB is unchanged, but the upper limit is changed from32 blocks to 128 blocks, unless the operating system's IOV_MAX is toolow. Some other RDBMSes seem to cap their multi-block buffer pool I/Oaround this number, and it seems useful to allow experimentation.The concrete change is to our definition of PG_IOV_MAX, which providesthe maximum for io_combine_limit and io_max_combine_limit. It alsoaffects a couple of other places that work with arrays of struct iovecor smaller objects on the stack, so we still don't want to use thesystem IOV_MAX directly without a clamp: it is not under our control andlikely to be 1024. 128 seems acceptable for our current usage.For Windows, we can't use real scatter/gather yet, so we continue todefine our own IOV_MAX value of 16 and emulate preadv()/pwritev() withloops. Someone would need to research the trade-offs of raising thatnumber.NB if trying to see this working: you might temporarily need to hackBAS_BULKREAD to be bigger, since otherwise the obvious way of "a verybig 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
1 parent10f6646 commit06fb561

File tree

4 files changed

+16
-7
lines changed

4 files changed

+16
-7
lines changed

‎doc/src/sgml/config.sgml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2638,6 +2638,8 @@ include_dir 'conf.d'
26382638
This parameter can only be set in
26392639
the <filename>postgresql.conf</filename> file or on the server
26402640
command line.
2641+
The maximum possible size depends on the operating system and block
2642+
size, but is typically 1MB on Unix and 128kB on Windows.
26412643
The default is 128kB.
26422644
</para>
26432645
</listitem>
@@ -2655,6 +2657,8 @@ include_dir 'conf.d'
26552657
higher than the <varname>io_max_combine_limit</varname> parameter, the
26562658
lower value will silently be used instead, so both may need to be raised
26572659
to increase the I/O size.
2660+
The maximum possible size depends on the operating system and block
2661+
size, but is typically 1MB on Unix and 128kB on Windows.
26582662
The default is 128kB.
26592663
</para>
26602664
</listitem>

‎src/backend/storage/aio/read_stream.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -515,9 +515,10 @@ read_stream_begin_impl(int flags,
515515
* finishes we don't want to have to wait for its buffers to be consumed
516516
* before starting a new one.
517517
*
518-
* Be careful not to allow int16 to overflow (even though that's not
519-
* possible with the current GUC range limits), allowing also for the
520-
* spare entry and the overflow space.
518+
* Be careful not to allow int16 to overflow. That is possible with the
519+
* current GUC range limits, so this is an artificial limit of ~32k
520+
* buffers and we'd need to adjust the types to exceed that. We also have
521+
* to allow for the spare entry and the overflow space.
521522
*/
522523
max_pinned_buffers= (max_ios+1)*io_combine_limit;
523524
max_pinned_buffers=Min(max_pinned_buffers,

‎src/backend/utils/misc/postgresql.conf.sample

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,9 @@
200200
#backend_flush_after = 0# measured in pages, 0 disables
201201
#effective_io_concurrency = 16# 1-1000; 0 disables prefetching
202202
#maintenance_io_concurrency = 16# 1-1000; 0 disables prefetching
203-
#io_max_combine_limit = 128kB# usually 1-32 blocks (depends on OS)
203+
#io_max_combine_limit = 128kB# usually 1-128 blocks (depends on OS)
204204
# (change requires restart)
205-
#io_combine_limit = 128kB# usually 1-32 blocks (depends on OS)
205+
#io_combine_limit = 128kB# usually 1-128 blocks (depends on OS)
206206

207207
#io_method = worker# worker, sync (change requires restart)
208208
#io_max_concurrency = -1# Max number of IOs that one process

‎src/include/port/pg_iovec.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@ struct iovec
3333

3434
#endif
3535

36-
/* Define a reasonable maximum that is safe to use on the stack. */
37-
#definePG_IOV_MAX Min(IOV_MAX, 32)
36+
/*
37+
* Define a reasonable maximum that is safe to use on the stack in arrays of
38+
* struct iovec and other small types. The operating system could limit us to
39+
* a number as low as 16, but most systems have 1024.
40+
*/
41+
#definePG_IOV_MAX Min(IOV_MAX, 128)
3842

3943
/*
4044
* Like preadv(), but with a prefix to remind us of a side-effect: on Windows

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp