v4-0003-Introduce-huge_pages_required-GUC.patch
application/octet-stream
Filename: v4-0003-Introduce-huge_pages_required-GUC.patch
Type: application/octet-stream
Part: 1
Patch
Format: format-patch
Series: patch v4-0003
Subject: Introduce huge_pages_required GUC.
| File | + | − |
|---|---|---|
| doc/src/sgml/config.sgml | 16 | 0 |
| doc/src/sgml/runtime.sgml | 9 | 18 |
| src/backend/port/sysv_shmem.c | 1 | 1 |
| src/backend/storage/ipc/ipci.c | 26 | 0 |
| src/backend/utils/misc/guc.c | 12 | 0 |
| src/include/storage/pg_shmem.h | 4 | 0 |
From e51d8d40dd21697e5a4e2b79be8125bec3707b49 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <bossartn@amazon.com>
Date: Wed, 1 Sep 2021 18:12:28 +0000
Subject: [PATCH v4 3/3] Introduce huge_pages_required GUC.
This runtime-computed GUC shows the number of huge pages required
for the server's main shared memory area. It can be viewed with
'postgres -C' so that the huge pages can be allocated prior to
startup.
---
doc/src/sgml/config.sgml | 16 ++++++++++++++++
doc/src/sgml/runtime.sgml | 27 +++++++++------------------
src/backend/port/sysv_shmem.c | 2 +-
src/backend/storage/ipc/ipci.c | 26 ++++++++++++++++++++++++++
src/backend/utils/misc/guc.c | 12 ++++++++++++
src/include/storage/pg_shmem.h | 4 ++++
6 files changed, 68 insertions(+), 19 deletions(-)
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index ef0e2a7746..781147f719 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -10101,6 +10101,22 @@ 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 the huge page size cannot
+ be determined, this will be <literal>-1</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry id="guc-integer-datetimes" xreflabel="integer_datetimes">
<term><varname>integer_datetimes</varname> (<type>boolean</type>)
<indexterm>
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index 2144c0abad..d955639900 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1444,28 +1444,19 @@ export PG_OOM_ADJUST_VALUE=0
the operating system to provide enough huge pages of the desired size.
To estimate the number of huge pages needed, use the
<command>postgres</command> command to see the value of
- <xref linkend="guc-shared-memory-size"/>, and use the
- <filename>/proc</filename> and <filename>/sys</filename> file systems
- to find the system's default and supported huge page sizes. This might
- look like:
+ <xref linkend="guc-huge-pages-required"/>. This might look like:
<programlisting>
-$ <userinput>postgres -D $PGDATA -C shared_memory_size</userinput>
-6339
-$ <userinput>grep ^Hugepagesize /proc/meminfo</userinput>
-Hugepagesize: 2048 kB
-$ <userinput>ls /sys/kernel/mm/hugepages</userinput>
-hugepages-1048576kB hugepages-2048kB
+$ <userinput>postgres -D $PGDATA -C huge_pages_required</userinput>
+3170
</programlisting>
- In this example the default is 2MB, but you can also explicitly request
- either 2MB or 1GB with <xref linkend="guc-huge-page-size"/>.
+ Note that you can explicitly request either 2MB or 1GB huge pages with
+ <xref linkend="guc-huge-page-size"/>.
- Assuming <literal>2MB</literal> huge pages,
- <literal>6339</literal> / <literal>2</literal> gives
- <literal>3169.5</literal>, so in this example we need at
- least <literal>3170</literal> huge pages. A larger setting would be
- appropriate if other programs on the machine also need huge pages.
- We can set this with:
+ While we need at least <literal>3170</literal> huge pages in this
+ example, a larger setting would be appropriate if other programs on
+ the machine also need huge pages. We can allocate the huge pages
+ with:
<programlisting>
# <userinput>sysctl -w vm.nr_hugepages=3170</userinput>
</programlisting>
diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c
index 9de96edf6a..f42f1ac171 100644
--- a/src/backend/port/sysv_shmem.c
+++ b/src/backend/port/sysv_shmem.c
@@ -478,7 +478,7 @@ PGSharedMemoryAttach(IpcMemoryId shmId,
* Returns the (real, assumed or config provided) page size into *hugepagesize,
* and the hugepage-related mmap flags to use into *mmap_flags.
*/
-static void
+void
GetHugePageSize(Size *hugepagesize, int *mmap_flags)
{
Size default_hugepagesize = 0;
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c
index f5736703a8..a625dd7701 100644
--- a/src/backend/storage/ipc/ipci.c
+++ b/src/backend/storage/ipc/ipci.c
@@ -14,6 +14,10 @@
*/
#include "postgres.h"
+#ifndef WIN32
+#include <sys/mman.h>
+#endif
+
#include "access/clog.h"
#include "access/commit_ts.h"
#include "access/heapam.h"
@@ -326,6 +330,13 @@ InitializeShmemGUCs(void)
char buf[64];
Size size_b;
Size size_mb;
+#if defined(MAP_HUGETLB) || defined(WIN32)
+ Size hp_size;
+ Size hp_required;
+#endif
+#ifdef MAP_HUGETLB
+ int unused;
+#endif
/*
* Calculate the shared memory size and round up to the nearest
@@ -336,4 +347,19 @@ InitializeShmemGUCs(void)
sprintf(buf, "%lu MB", size_mb);
SetConfigOption("shared_memory_size", buf, PGC_INTERNAL, PGC_S_OVERRIDE);
+
+ /* Calculate the number of huge pages required */
+#if defined(MAP_HUGETLB)
+ GetHugePageSize(&hp_size, &unused);
+#elif defined(WIN32)
+ hp_size = GetLargePageMinimum();
+#endif
+
+#if defined(MAP_HUGETLB) || defined(WIN32)
+ if (hp_size == 0)
+ return;
+ hp_required = (size_b / hp_size) + 1;
+ sprintf(buf, "%lu", hp_required);
+ SetConfigOption("huge_pages_required", buf, PGC_INTERNAL, PGC_S_OVERRIDE);
+#endif
}
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index a11387c5ce..3e9a01746e 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -621,6 +621,7 @@ char *pgstat_temp_directory;
char *application_name;
int shmem_size_mb;
+int huge_pages_required;
int tcp_keepalives_idle;
int tcp_keepalives_interval;
@@ -2225,6 +2226,17 @@ static struct config_int ConfigureNamesInt[] =
NULL, NULL, NULL
},
+ {
+ {"huge_pages_required", PGC_INTERNAL, RESOURCES_MEM,
+ gettext_noop("Shows the number of huge pages needed for the main shared memory area."),
+ gettext_noop("-1 indicates that the huge page size 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,
diff --git a/src/include/storage/pg_shmem.h b/src/include/storage/pg_shmem.h
index 059df1b72c..c44403ed6a 100644
--- a/src/include/storage/pg_shmem.h
+++ b/src/include/storage/pg_shmem.h
@@ -88,4 +88,8 @@ extern PGShmemHeader *PGSharedMemoryCreate(Size size,
extern bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2);
extern void PGSharedMemoryDetach(void);
+#ifdef MAP_HUGETLB
+extern void GetHugePageSize(Size *hugepagesize, int *mmap_flags);
+#endif
+
#endif /* PG_SHMEM_H */
--
2.16.6