<row>
<entry><varname>SEMMNI</varname></entry>
<entry>Maximum number of semaphore identifiers (i.e., sets)</entry>
- <entry>at least <literal>ceil(num_os_semaphores / 19)</literal> plus room for other applications</entry>
+ <entry>at least <literal>ceil(num_os_semaphores / 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(num_os_semaphores / 19) * 20</literal> plus room for other applications</entry>
+ <entry><literal>ceil(num_os_semaphores / 16) * 17</literal> plus room for other applications</entry>
</row>
<row>
<entry><varname>SEMMSL</varname></entry>
<entry>Maximum number of semaphores per set</entry>
- <entry>at least 20</entry>
+ <entry>at least 17</entry>
</row>
<row>
(<xref linkend="guc-max-connections"/>), allowed autovacuum worker process
(<xref linkend="guc-autovacuum-worker-slots"/>), allowed WAL sender process
(<xref linkend="guc-max-wal-senders"/>), allowed background
- process (<xref linkend="guc-max-worker-processes"/>), etc., in sets of 19.
+ process (<xref linkend="guc-max-worker-processes"/>), etc., in sets of 16.
The runtime-computed parameter <xref linkend="guc-num-os-semaphores"/>
reports the number of semaphores required. This parameter can be viewed
before starting the server with a <command>postgres</command> command like:
</para>
<para>
- Each set of 19 semaphores will
- also contain a 20th semaphore which contains a <quote>magic
+ Each set of 16 semaphores 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 <literal>num_os_semaphores</literal> plus one extra for
- each set of 19 required semaphores (see the formula in <xref
+ 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(num_os_semaphores / 19)</literal>.
+ least <literal>ceil(num_os_semaphores / 16)</literal>.
Lowering the number
of allowed connections is a temporary workaround for failures,
which are usually confusingly worded <quote>No space
<para>
The default shared memory settings are usually good enough, unless
you have set <literal>shared_memory_type</literal> to <literal>sysv</literal>.
- You will usually want to increase <literal>kern.ipc.semmni</literal>
+ However, you will need to increase <literal>kern.ipc.semmni</literal>
and <literal>kern.ipc.semmns</literal>,
as <systemitem class="osname">NetBSD</systemitem>'s default settings
- for these are uncomfortably small.
+ for these are unworkably small.
</para>
<para>
<para>
The default shared memory settings are usually good enough, unless
you have set <literal>shared_memory_type</literal> to <literal>sysv</literal>.
- You will usually want to
+ However, you will need to
increase <literal>kern.seminfo.semmni</literal>
and <literal>kern.seminfo.semmns</literal>,
as <systemitem class="osname">OpenBSD</systemitem>'s default settings
- for these are uncomfortably small.
+ for these are unworkably small.
</para>
<para>
* we allocate. It must be *less than* your kernel's SEMMSL (max semaphores
* per set) parameter, which is often around 25. (Less than, because we
* allocate one extra sema in each set for identification purposes.)
- *
- * The present value of 19 is chosen with one eye on NetBSD/OpenBSD's default
- * SEMMNS setting of 60. Remembering the extra sema per set, this lets us
- * allocate three sets with 57 useful semaphores before exceeding that, which
- * is enough to run our core regression tests. Users of those systems will
- * still want to raise SEMMNS for any sort of production work, though.
*/
-#define SEMAS_PER_SET 19
+#define SEMAS_PER_SET 16
#define IPCProtection (0600) /* access/modify by user only */
* for a given max_connections value. Note that it has been carefully
* crafted to provide specific values for the associated values in
* trial_conns. We want it to return autovacuum_worker_slots's initial
- * default value (16) for the maximum value in trial_conns (100), and we
- * want it to return close to the minimum value we'd consider (3, which is
- * the default of autovacuum_max_workers) for the minimum value in
- * trial_conns (25).
+ * default value (16) for the maximum value in trial_conns[] (100), while
+ * it mustn't return less than the default value of autovacuum_max_workers
+ * (3) for the minimum value in trial_conns[].
*/
#define AV_SLOTS_FOR_CONNS(nconns) ((nconns) / 6)
static const int trial_conns[] = {
- 100, 50, 40, 30, 25
+ 100, 50, 40, 30, 20
};
static const int trial_bufs[] = {
16384, 8192, 4096, 3584, 3072, 2560, 2048, 1536,