From: Nathan Bossart <nathandbossart@gmail.com>
To: Imseih (AWS), Sami <simseih@amazon.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Justin Pryzby <pryzby@telsasoft.com>
Cc: pgsql-hackers@postgresql.org <pgsql-hackers@postgresql.org>
Subject: Re: problems with "Shared Memory and Semaphores" section of docs
Date: Thu, 6 Jun 2024 14:21:38 -0500
Message-ID: <ZmIMQqOyDNLVsplz@nathan> (raw)
In-Reply-To: <ZmDM9dp9oY6Je8K7@nathan>
References: <20240517164452.GA1914161@nathanxps13>
<2463906.1715965795@sss.pgh.pa.us>
<20240517174837.GB1918496@nathanxps13>
<20240517192123.GA1933425@nathanxps13>
<ZkzyBOD-cX35wKuM@nathan>
<F4131F24-A20F-4A04-B1A6-60242A7C7A43@amazon.com>
<Zl363er4TUbOkJEf@nathan>
<Zl4TswfwPUZkHHfn@nathan>
<ZmDM9dp9oY6Je8K7@nathan>
Here is a rebased version of the patch for v18 that adds a runtime-computed
GUC. As I noted earlier, there still isn't a consensus on this approach.
--
nathan
From 74f638f7df9c51f5ab47b282bb7107c4ba6cb5b6 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nathan@postgresql.org>
Date: Tue, 21 May 2024 14:02:22 -0500
Subject: [PATCH v2 1/1] add semaphores_required GUC
---
doc/src/sgml/config.sgml | 14 +++++++++++
doc/src/sgml/runtime.sgml | 39 ++++++++++++++++-------------
src/backend/storage/ipc/ipci.c | 6 ++++-
src/backend/utils/misc/guc_tables.c | 12 +++++++++
4 files changed, 53 insertions(+), 18 deletions(-)
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgmlindex 698169afdb..f6afc941df 100644--- a/doc/src/sgml/config.sgml+++ b/doc/src/sgml/config.sgml@@ -11215,6 +11215,20 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
</listitem>
</varlistentry>
+ <varlistentry id="guc-semaphores-required" xreflabel="semaphores_required">+ <term><varname>semaphores_required</varname> (<type>integer</type>)+ <indexterm>+ <primary><varname>semaphores_required</varname> configuration parameter</primary>+ </indexterm>+ </term>+ <listitem>+ <para>+ Reports the number of semaphores that are needed for the server based+ on the number of allowed connections, worker processes, etc.+ </para>+ </listitem>+ </varlistentry>+
<varlistentry id="guc-ssl-library" xreflabel="ssl_library">
<term><varname>ssl_library</varname> (<type>string</type>)
<indexterm>
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgmlindex 2f7c618886..c387f302d7 100644--- a/doc/src/sgml/runtime.sgml+++ b/doc/src/sgml/runtime.sgml@@ -781,13 +781,13 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such
<row>
<entry><varname>SEMMNI</varname></entry>
<entry>Maximum number of semaphore identifiers (i.e., sets)</entry>
- <entry>at least <literal>ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16)</literal> plus room for other applications</entry>+ <entry>at least <literal>ceil(semaphores_required / 16)</literal> plus room for other applications</entry>
</row>
<row>
<entry><varname>SEMMNS</varname></entry>
<entry>Maximum number of semaphores system-wide</entry>
- <entry><literal>ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16) * 17</literal> plus room for other applications</entry>+ <entry><literal>ceil(semaphores_required / 16) * 17</literal> plus room for other applications</entry>
</row>
<row>
@@ -836,30 +836,38 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such
<para>
When using System V semaphores,
- <productname>PostgreSQL</productname> uses one semaphore per allowed connection- (<xref linkend="guc-max-connections"/>), allowed autovacuum worker process- (<xref linkend="guc-autovacuum-max-workers"/>), allowed WAL sender process- (<xref linkend="guc-max-wal-senders"/>), and allowed background- process (<xref linkend="guc-max-worker-processes"/>), in sets of 16.+ <productname>PostgreSQL</productname> uses one semaphore per allowed connection,+ worker process, etc., in sets of 16.
Each such set will
also contain a 17th semaphore which contains a <quote>magic
number</quote>, to detect collision with semaphore sets used by
other applications. The maximum number of semaphores in the system
is set by <varname>SEMMNS</varname>, which consequently must be at least
- as high as <varname>max_connections</varname> plus- <varname>autovacuum_max_workers</varname> plus <varname>max_wal_senders</varname>,- plus <varname>max_worker_processes</varname>, plus one extra for each 16- allowed connections plus workers (see the formula in <xref+ as high as <xref linkend="guc-semaphores-required"/> plus one extra for+ each set of 16 required semaphores (see the formula in <xref
linkend="sysvipc-parameters"/>). The parameter <varname>SEMMNI</varname>
determines the limit on the number of semaphore sets that can
exist on the system at one time. Hence this parameter must be at
- least <literal>ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16)</literal>.+ least <literal>ceil(semaphores_required / 16)</literal>.
Lowering the number
of allowed connections is a temporary workaround for failures,
which are usually confusingly worded <quote>No space
left on device</quote>, from the function <function>semget</function>.
</para>
+ <para>+ The number of semaphores required by <productname>PostgreSQL</productname>+ is provided by the runtime-computed parameter+ <varname>semaphores_required</varname>, which can be determined before+ starting the server with a <command>postgres</command> command like:+<programlisting>+$ <userinput>postgres -D $PGDATA -C semaphores_required</userinput>+</programlisting>+ The value of <varname>semaphores_required</varname> should be input into+ the aforementioned formulas to determine appropriate values for+ <varname>SEMMNI</varname> and <varname>SEMMNS</varname>.+ </para>+
<para>
In some cases it might also be necessary to increase
<varname>SEMMAP</varname> to be at least on the order of
@@ -882,11 +890,8 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such
<para>
When using POSIX semaphores, the number of semaphores needed is the
- same as for System V, that is one semaphore per allowed connection- (<xref linkend="guc-max-connections"/>), allowed autovacuum worker process- (<xref linkend="guc-autovacuum-max-workers"/>), allowed WAL sender process- (<xref linkend="guc-max-wal-senders"/>), and allowed background- process (<xref linkend="guc-max-worker-processes"/>).+ same as for System V, that is one semaphore per allowed connection,+ worker process, etc.
On the platforms where this option is preferred, there is no specific
kernel limit on the number of POSIX semaphores.
</para>
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.cindex 521ed5418c..3e030accac 100644--- a/src/backend/storage/ipc/ipci.c+++ b/src/backend/storage/ipc/ipci.c@@ -372,11 +372,12 @@ InitializeShmemGUCs(void)
Size size_b;
Size size_mb;
Size hp_size;
+ int num_semas;
/*
* Calculate the shared memory size and round up to the nearest megabyte.
*/
- size_b = CalculateShmemSize(NULL);+ size_b = CalculateShmemSize(&num_semas);
size_mb = add_size(size_b, (1024 * 1024) - 1) / (1024 * 1024);
sprintf(buf, "%zu", size_mb);
SetConfigOption("shared_memory_size", buf,
@@ -395,4 +396,7 @@ InitializeShmemGUCs(void)
SetConfigOption("shared_memory_size_in_huge_pages", buf,
PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
}
++ sprintf(buf, "%d", num_semas);+ SetConfigOption("semaphores_required", buf, PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
}
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.cindex 46c258be28..86157394d8 100644--- a/src/backend/utils/misc/guc_tables.c+++ b/src/backend/utils/misc/guc_tables.c@@ -599,6 +599,7 @@ static int segment_size;
static int shared_memory_size_mb;
static int shared_memory_size_in_huge_pages;
static int wal_block_size;
+static int semaphores_required;
static bool data_checksums;
static bool integer_datetimes;
@@ -2291,6 +2292,17 @@ struct config_int ConfigureNamesInt[] =
NULL, NULL, NULL
},
+ {+ {"semaphores_required", PGC_INTERNAL, PRESET_OPTIONS,+ gettext_noop("Shows the number of semaphores required for the server."),+ NULL,+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_RUNTIME_COMPUTED+ },+ &semaphores_required,+ 0, 0, INT_MAX,+ NULL, NULL, NULL+ },+
{
{"commit_timestamp_buffers", PGC_POSTMASTER, RESOURCES_MEM,
gettext_noop("Sets the size of the dedicated buffer pool used for the commit timestamp cache."),
--
2.39.3 (Apple Git-146)
Attachments:
[text/plain] v2-0001-add-semaphores_required-GUC.patch (8.0K, ../ZmIMQqOyDNLVsplz@nathan/2-v2-0001-add-semaphores_required-GUC.patch)
download | inline diff:
From 74f638f7df9c51f5ab47b282bb7107c4ba6cb5b6 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nathan@postgresql.org>
Date: Tue, 21 May 2024 14:02:22 -0500
Subject: [PATCH v2 1/1] add semaphores_required GUC
---
doc/src/sgml/config.sgml | 14 +++++++++++
doc/src/sgml/runtime.sgml | 39 ++++++++++++++++-------------
src/backend/storage/ipc/ipci.c | 6 ++++-
src/backend/utils/misc/guc_tables.c | 12 +++++++++
4 files changed, 53 insertions(+), 18 deletions(-)
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgmlindex 698169afdb..f6afc941df 100644--- a/doc/src/sgml/config.sgml+++ b/doc/src/sgml/config.sgml@@ -11215,6 +11215,20 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
</listitem>
</varlistentry>
+ <varlistentry id="guc-semaphores-required" xreflabel="semaphores_required">+ <term><varname>semaphores_required</varname> (<type>integer</type>)+ <indexterm>+ <primary><varname>semaphores_required</varname> configuration parameter</primary>+ </indexterm>+ </term>+ <listitem>+ <para>+ Reports the number of semaphores that are needed for the server based+ on the number of allowed connections, worker processes, etc.+ </para>+ </listitem>+ </varlistentry>+
<varlistentry id="guc-ssl-library" xreflabel="ssl_library">
<term><varname>ssl_library</varname> (<type>string</type>)
<indexterm>
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgmlindex 2f7c618886..c387f302d7 100644--- a/doc/src/sgml/runtime.sgml+++ b/doc/src/sgml/runtime.sgml@@ -781,13 +781,13 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such
<row>
<entry><varname>SEMMNI</varname></entry>
<entry>Maximum number of semaphore identifiers (i.e., sets)</entry>
- <entry>at least <literal>ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16)</literal> plus room for other applications</entry>+ <entry>at least <literal>ceil(semaphores_required / 16)</literal> plus room for other applications</entry>
</row>
<row>
<entry><varname>SEMMNS</varname></entry>
<entry>Maximum number of semaphores system-wide</entry>
- <entry><literal>ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16) * 17</literal> plus room for other applications</entry>+ <entry><literal>ceil(semaphores_required / 16) * 17</literal> plus room for other applications</entry>
</row>
<row>
@@ -836,30 +836,38 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such
<para>
When using System V semaphores,
- <productname>PostgreSQL</productname> uses one semaphore per allowed connection- (<xref linkend="guc-max-connections"/>), allowed autovacuum worker process- (<xref linkend="guc-autovacuum-max-workers"/>), allowed WAL sender process- (<xref linkend="guc-max-wal-senders"/>), and allowed background- process (<xref linkend="guc-max-worker-processes"/>), in sets of 16.+ <productname>PostgreSQL</productname> uses one semaphore per allowed connection,+ worker process, etc., in sets of 16.
Each such set will
also contain a 17th semaphore which contains a <quote>magic
number</quote>, to detect collision with semaphore sets used by
other applications. The maximum number of semaphores in the system
is set by <varname>SEMMNS</varname>, which consequently must be at least
- as high as <varname>max_connections</varname> plus- <varname>autovacuum_max_workers</varname> plus <varname>max_wal_senders</varname>,- plus <varname>max_worker_processes</varname>, plus one extra for each 16- allowed connections plus workers (see the formula in <xref+ as high as <xref linkend="guc-semaphores-required"/> plus one extra for+ each set of 16 required semaphores (see the formula in <xref
linkend="sysvipc-parameters"/>). The parameter <varname>SEMMNI</varname>
determines the limit on the number of semaphore sets that can
exist on the system at one time. Hence this parameter must be at
- least <literal>ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16)</literal>.+ least <literal>ceil(semaphores_required / 16)</literal>.
Lowering the number
of allowed connections is a temporary workaround for failures,
which are usually confusingly worded <quote>No space
left on device</quote>, from the function <function>semget</function>.
</para>
+ <para>+ The number of semaphores required by <productname>PostgreSQL</productname>+ is provided by the runtime-computed parameter+ <varname>semaphores_required</varname>, which can be determined before+ starting the server with a <command>postgres</command> command like:+<programlisting>+$ <userinput>postgres -D $PGDATA -C semaphores_required</userinput>+</programlisting>+ The value of <varname>semaphores_required</varname> should be input into+ the aforementioned formulas to determine appropriate values for+ <varname>SEMMNI</varname> and <varname>SEMMNS</varname>.+ </para>+
<para>
In some cases it might also be necessary to increase
<varname>SEMMAP</varname> to be at least on the order of
@@ -882,11 +890,8 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such
<para>
When using POSIX semaphores, the number of semaphores needed is the
- same as for System V, that is one semaphore per allowed connection- (<xref linkend="guc-max-connections"/>), allowed autovacuum worker process- (<xref linkend="guc-autovacuum-max-workers"/>), allowed WAL sender process- (<xref linkend="guc-max-wal-senders"/>), and allowed background- process (<xref linkend="guc-max-worker-processes"/>).+ same as for System V, that is one semaphore per allowed connection,+ worker process, etc.
On the platforms where this option is preferred, there is no specific
kernel limit on the number of POSIX semaphores.
</para>
diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.cindex 521ed5418c..3e030accac 100644--- a/src/backend/storage/ipc/ipci.c+++ b/src/backend/storage/ipc/ipci.c@@ -372,11 +372,12 @@ InitializeShmemGUCs(void)
Size size_b;
Size size_mb;
Size hp_size;
+ int num_semas;
/*
* Calculate the shared memory size and round up to the nearest megabyte.
*/
- size_b = CalculateShmemSize(NULL);+ size_b = CalculateShmemSize(&num_semas);
size_mb = add_size(size_b, (1024 * 1024) - 1) / (1024 * 1024);
sprintf(buf, "%zu", size_mb);
SetConfigOption("shared_memory_size", buf,
@@ -395,4 +396,7 @@ InitializeShmemGUCs(void)
SetConfigOption("shared_memory_size_in_huge_pages", buf,
PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
}
++ sprintf(buf, "%d", num_semas);+ SetConfigOption("semaphores_required", buf, PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT);
}
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.cindex 46c258be28..86157394d8 100644--- a/src/backend/utils/misc/guc_tables.c+++ b/src/backend/utils/misc/guc_tables.c@@ -599,6 +599,7 @@ static int segment_size;
static int shared_memory_size_mb;
static int shared_memory_size_in_huge_pages;
static int wal_block_size;
+static int semaphores_required;
static bool data_checksums;
static bool integer_datetimes;
@@ -2291,6 +2292,17 @@ struct config_int ConfigureNamesInt[] =
NULL, NULL, NULL
},
+ {+ {"semaphores_required", PGC_INTERNAL, PRESET_OPTIONS,+ gettext_noop("Shows the number of semaphores required for the server."),+ NULL,+ GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_RUNTIME_COMPUTED+ },+ &semaphores_required,+ 0, 0, INT_MAX,+ NULL, NULL, NULL+ },+
{
{"commit_timestamp_buffers", PGC_POSTMASTER, RESOURCES_MEM,
gettext_noop("Sets the size of the dedicated buffer pool used for the commit timestamp cache."),
--
2.39.3 (Apple Git-146)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: nathandbossart@gmail.com, simseih@amazon.com, tgl@sss.pgh.pa.us, pryzby@telsasoft.com
Subject: Re: problems with "Shared Memory and Semaphores" section of docs
In-Reply-To: <ZmIMQqOyDNLVsplz@nathan>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox