pgsql: Introduce PG_IO_ALIGN_SIZE and align all I/O buffers.
От | Thomas Munro |
---|---|
Тема | pgsql: Introduce PG_IO_ALIGN_SIZE and align all I/O buffers. |
Дата | |
Msg-id | E1pl0IC-001z10-0L@gemulon.postgresql.org обсуждение исходный текст |
Список | pgsql-committers |
Introduce PG_IO_ALIGN_SIZE and align all I/O buffers. In order to have the option to use O_DIRECT/FILE_FLAG_NO_BUFFERING in a later commit, we need the addresses of user space buffers to be well aligned. The exact requirements vary by OS and file system (typically sectors and/or memory pages). The address alignment size is set to 4096, which is enough for currently known systems: it matches modern sectors and common memory page size. There is no standard governing O_DIRECT's requirements so we might eventually have to reconsider this with more information from the field or future systems. Aligning I/O buffers on memory pages is also known to improve regular buffered I/O performance. Three classes of I/O buffers for regular data pages are adjusted: (1) Heap buffers are now allocated with the new palloc_aligned() or MemoryContextAllocAligned() functions introduced by commit 439f6175. (2) Stack buffers now use a new struct PGIOAlignedBlock to respect PG_IO_ALIGN_SIZE, if possible with this compiler. (3) The buffer pool is also aligned in shared memory. WAL buffers were already aligned on XLOG_BLCKSZ. It's possible for XLOG_BLCKSZ to be configured smaller than PG_IO_ALIGNED_SIZE and thus for O_DIRECT WAL writes to fail to be well aligned, but that's a pre-existing condition and will be addressed by a later commit. BufFiles are not yet addressed (there's no current plan to use O_DIRECT for those, but they could potentially get some incidental speedup even in plain buffered I/O operations through better alignment). If we can't align stack objects suitably using the compiler extensions we know about, we disable the use of O_DIRECT by setting PG_O_DIRECT to 0. This avoids the need to consider systems that have O_DIRECT but can't align stack objects the way we want; such systems could in theory be supported with more work but we don't currently know of any such machines, so it's easier to pretend there is no O_DIRECT support instead. That's an existing and tested class of system. Add assertions that all buffers passed into smgrread(), smgrwrite() and smgrextend() are correctly aligned, unless PG_O_DIRECT is 0 (= stack alignment tricks may be unavailable) or the block size has been set too small to allow arrays of buffers to be all aligned. Author: Thomas Munro <thomas.munro@gmail.com> Author: Andres Freund <andres@anarazel.de> Reviewed-by: Justin Pryzby <pryzby@telsasoft.com> Discussion: https://postgr.es/m/CA+hUKGK1X532hYqJ_MzFWt0n1zt8trz980D79WbjwnT-yYLZpg@mail.gmail.com Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/faeedbcefd40bfdf314e048c425b6d9208896d90 Modified Files -------------- contrib/bloom/blinsert.c | 2 +- contrib/pg_prewarm/pg_prewarm.c | 2 +- src/backend/access/gist/gistbuild.c | 9 ++++---- src/backend/access/hash/hashpage.c | 2 +- src/backend/access/heap/rewriteheap.c | 2 +- src/backend/access/nbtree/nbtree.c | 2 +- src/backend/access/nbtree/nbtsort.c | 8 +++++--- src/backend/access/spgist/spginsert.c | 2 +- src/backend/access/transam/generic_xlog.c | 13 ++++++++---- src/backend/access/transam/xlog.c | 2 +- src/backend/catalog/storage.c | 2 +- src/backend/storage/buffer/buf_init.c | 10 ++++++--- src/backend/storage/buffer/bufmgr.c | 2 +- src/backend/storage/buffer/localbuf.c | 7 +++++-- src/backend/storage/file/buffile.c | 6 ++++++ src/backend/storage/page/bufpage.c | 5 ++++- src/backend/storage/smgr/md.c | 15 +++++++++++++- src/backend/utils/sort/logtape.c | 2 +- src/bin/pg_checksums/pg_checksums.c | 2 +- src/bin/pg_rewind/local_source.c | 4 ++-- src/bin/pg_upgrade/file.c | 4 ++-- src/common/file_utils.c | 4 ++-- src/include/c.h | 34 +++++++++++++++++++++++-------- src/include/pg_config_manual.h | 6 ++++++ src/include/storage/fd.h | 5 +++-- src/tools/pgindent/typedefs.list | 1 + 26 files changed, 108 insertions(+), 45 deletions(-)
В списке pgsql-committers по дате отправления:
Предыдущее
От: Amit KapilaДата:
Сообщение: pgsql: Doc: Fix the datatype of the newly added SUBSCRIPTION options.
Следующее
От: Andres FreundДата:
Сообщение: pgsql: Replace replication slot's invalidated_at LSN with an enum