v8-0001-Introduce-huge_pages_required-GUC.patch
application/octet-stream
Filename: v8-0001-Introduce-huge_pages_required-GUC.patch
Type: application/octet-stream
Part: 1
Patch
Format: format-patch
Series: patch v8-0001
Subject: Introduce huge_pages_required GUC.
| File | + | − |
|---|---|---|
| doc/src/sgml/config.sgml | 21 | 0 |
| src/backend/port/sysv_shmem.c | 11 | 5 |
| src/backend/port/win32_shmem.c | 14 | 0 |
| src/backend/storage/ipc/ipci.c | 14 | 0 |
| src/backend/utils/misc/guc.c | 13 | 1 |
| src/include/storage/pg_shmem.h | 1 | 0 |
From b7da8e594f52cd45487c5637c70b0cc11087fb2f Mon Sep 17 00:00:00 2001
From: Nathan Bossart <bossartn@amazon.com>
Date: Wed, 8 Sep 2021 17:18:39 +0000
Subject: [PATCH v8 1/2] Introduce huge_pages_required GUC.
This runtime-computed GUC shows the number of huge pages required
for the server's main shared memory area.
---
doc/src/sgml/config.sgml | 21 +++++++++++++++++++++
src/backend/port/sysv_shmem.c | 16 +++++++++++-----
src/backend/port/win32_shmem.c | 14 ++++++++++++++
src/backend/storage/ipc/ipci.c | 14 ++++++++++++++
src/backend/utils/misc/guc.c | 14 +++++++++++++-
src/include/storage/pg_shmem.h | 1 +
6 files changed, 74 insertions(+), 6 deletions(-)
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index ef0e2a7746..b27d8aff15 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -10101,6 +10101,27 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
</listitem>
</varlistentry>
+ <varlistentry id="guc-huge-pages-required" xreflabel="huge_pages_required">
+ <term><varname>huge_pages_required</varname> (<type>integer</type>)
+ <indexterm>
+ <primary><varname>huge_pages_required</varname> configuration parameter</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ Reports the number of huge pages that are required for the main
+ shared memory area based on the specified
+ <xref linkend="guc-huge-page-size"/>. If huge pages are not supported,
+ this will be <literal>-1</literal>.
+ </para>
+ <para>
+ This setting is supported only on Linux. It is always set to
+ <literal>-1</literal> on other platforms. For more details about using
+ huge pages on Linux, see <xref linkend="linux-huge-pages"/>.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry id="guc-integer-datetimes" xreflabel="integer_datetimes">
<term><varname>integer_datetimes</varname> (<type>boolean</type>)
<indexterm>
diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c
index 9de96edf6a..125e2d47ec 100644
--- a/src/backend/port/sysv_shmem.c
+++ b/src/backend/port/sysv_shmem.c
@@ -456,8 +456,6 @@ PGSharedMemoryAttach(IpcMemoryId shmId,
return shmStat.shm_nattch == 0 ? SHMSTATE_UNATTACHED : SHMSTATE_ATTACHED;
}
-#ifdef MAP_HUGETLB
-
/*
* Identify the huge page size to use, and compute the related mmap flags.
*
@@ -476,11 +474,19 @@ PGSharedMemoryAttach(IpcMemoryId shmId,
* such as increasing shared_buffers to absorb the extra space.
*
* Returns the (real, assumed or config provided) page size into *hugepagesize,
- * and the hugepage-related mmap flags to use into *mmap_flags.
+ * and the hugepage-related mmap flags to use into *mmap_flags. If huge pages
+ * is not supported, *hugepagesize and *mmap_flags will be set to 0.
*/
-static void
+void
GetHugePageSize(Size *hugepagesize, int *mmap_flags)
{
+#ifndef MAP_HUGETLB
+
+ *hugepagesize = 0;
+ *mmap_flags = 0;
+
+#else
+
Size default_hugepagesize = 0;
/*
@@ -553,9 +559,9 @@ GetHugePageSize(Size *hugepagesize, int *mmap_flags)
*mmap_flags |= (shift & MAP_HUGE_MASK) << MAP_HUGE_SHIFT;
}
#endif
-}
#endif /* MAP_HUGETLB */
+}
/*
* Creates an anonymous mmap()ed shared memory segment.
diff --git a/src/backend/port/win32_shmem.c b/src/backend/port/win32_shmem.c
index d7a71992d8..90de2ab4e1 100644
--- a/src/backend/port/win32_shmem.c
+++ b/src/backend/port/win32_shmem.c
@@ -605,3 +605,17 @@ pgwin32_ReserveSharedMemoryRegion(HANDLE hChild)
return true;
}
+
+/*
+ * This function is provided for consistency with sysv_shmem.c and does not
+ * provide any useful information for Windows. To obtain the large page size,
+ * use GetLargePageMinimum() instead.
+ *
+ * This always sets *hugepagesize and *mmap_flags to 0.
+ */
+void
+GetHugePageSize(Size *hugepagesize, int *mmap_flags)
+{
+ *hugepagesize = 0;
+ *mmap_flags = 0;
+}
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c
index 13f3926ff6..91490653cf 100644
--- a/src/backend/storage/ipc/ipci.c
+++ b/src/backend/storage/ipc/ipci.c
@@ -326,6 +326,9 @@ InitializeShmemGUCs(void)
char buf[64];
Size size_b;
Size size_mb;
+ Size hp_size;
+ Size hp_required;
+ int unused;
/*
* Calculate the shared memory size and round up to the nearest megabyte.
@@ -334,4 +337,15 @@ InitializeShmemGUCs(void)
size_mb = add_size(size_b, (1024 * 1024) - 1) / (1024 * 1024);
sprintf(buf, "%zu", size_mb);
SetConfigOption("shared_memory_size", buf, PGC_INTERNAL, PGC_S_OVERRIDE);
+
+ /*
+ * Calculate the number of huge pages required.
+ */
+ GetHugePageSize(&hp_size, &unused);
+ if (hp_size != 0)
+ {
+ hp_required = (size_b / hp_size) + 1;
+ sprintf(buf, "%zu", hp_required);
+ SetConfigOption("huge_pages_required", buf, PGC_INTERNAL, PGC_S_OVERRIDE);
+ }
}
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index c339acf067..8edfd07340 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -665,6 +665,7 @@ static int max_identifier_length;
static int block_size;
static int segment_size;
static int shared_memory_size_mb;
+static int huge_pages_required;
static int wal_block_size;
static bool data_checksums;
static bool integer_datetimes;
@@ -2224,6 +2225,17 @@ static struct config_int ConfigureNamesInt[] =
NULL, NULL, NULL
},
+ {
+ {"huge_pages_required", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows the number of huge pages needed for the main shared memory area."),
+ gettext_noop("-1 indicates that the value could not be determined."),
+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &huge_pages_required,
+ -1, -1, INT_MAX,
+ NULL, NULL, NULL
+ },
+
{
/* This is PGC_SUSET to prevent hiding from log_lock_waits. */
{"deadlock_timeout", PGC_SUSET, LOCK_MANAGEMENT,
@@ -2339,7 +2351,7 @@ static struct config_int ConfigureNamesInt[] =
},
{
- {"shared_memory_size", PGC_INTERNAL, RESOURCES_MEM,
+ {"shared_memory_size", PGC_INTERNAL, PRESET_OPTIONS,
gettext_noop("Shows the size of the server's main shared memory area (rounded up to the nearest MB)."),
NULL,
GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_UNIT_MB
diff --git a/src/include/storage/pg_shmem.h b/src/include/storage/pg_shmem.h
index 059df1b72c..518eb86065 100644
--- a/src/include/storage/pg_shmem.h
+++ b/src/include/storage/pg_shmem.h
@@ -87,5 +87,6 @@ extern PGShmemHeader *PGSharedMemoryCreate(Size size,
PGShmemHeader **shim);
extern bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2);
extern void PGSharedMemoryDetach(void);
+extern void GetHugePageSize(Size *hugepagesize, int *mmap_flags);
#endif /* PG_SHMEM_H */
--
2.16.6