mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
The default values for shared_buffers and max_connections are now 1000
and 100 respectively, if the platform will allow it. initdb selects values that are not too large to allow the postmaster to start, and places these values in the installed postgresql.conf file. This allows us to continue to start up out-of-the-box on platforms with small SHMMAX, while having somewhat-realistic default settings on platforms with reasonable SHMMAX. Per recent pghackers discussion.
This commit is contained in:
parent
8460000069
commit
de98a7e23a
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.192 2003/07/09 08:52:56 momjian Exp $
|
$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.193 2003/07/14 20:00:22 tgl Exp $
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<Chapter Id="runtime">
|
<Chapter Id="runtime">
|
||||||
@ -608,9 +608,18 @@ SET ENABLE_SEQSCAN TO OFF;
|
|||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
Determines the maximum number of concurrent connections to the
|
Determines the maximum number of concurrent connections to the
|
||||||
database server. The default is 32 (unless altered while
|
database server. The default is typically 100, but may be less
|
||||||
building the server). This parameter can only be set at server
|
if your kernel settings will not support it (as determined
|
||||||
start.
|
during <application>initdb</>).
|
||||||
|
This parameter can only be set at server start.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Increasing this parameter may cause <productname>PostgreSQL</>
|
||||||
|
to request more <systemitem class="osname">System V</> shared
|
||||||
|
memory or semaphores than your operating system's default configuration
|
||||||
|
allows. See <xref linkend="sysvipc"> for information on how to
|
||||||
|
adjust these parameters, if necessary.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
@ -831,13 +840,16 @@ SET ENABLE_SEQSCAN TO OFF;
|
|||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
Sets the number of shared memory buffers used by the database
|
Sets the number of shared memory buffers used by the database
|
||||||
server. The default is 64. Each buffer is typically 8192
|
server. The default is typically 1000, but may be less
|
||||||
bytes. This must be greater than 16, as well as at least twice
|
if your kernel settings will not support it (as determined
|
||||||
the value of <varname>MAX_CONNECTIONS</varname>; however, a
|
during <application>initdb</>). Each buffer is 8192
|
||||||
higher value can often improve performance.
|
bytes, unless a different value of <literal>BLCKSZ</> was chosen
|
||||||
Values of a few thousand are recommended
|
when building the server. This setting must be at least 16,
|
||||||
for production installations. This option can only be set at
|
as well as at least twice the value of
|
||||||
server start.
|
<varname>MAX_CONNECTIONS</varname>; however, settings significantly
|
||||||
|
higher than the minimum are usually needed for good performance.
|
||||||
|
Values of a few thousand are recommended for production installations.
|
||||||
|
This option can only be set at server start.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
@ -2796,7 +2808,7 @@ $ <userinput>postmaster -o '-S 1024 -s'</userinput>
|
|||||||
number</quote>, to detect collision with semaphore sets used by
|
number</quote>, to detect collision with semaphore sets used by
|
||||||
other applications. The maximum number of semaphores in the system
|
other applications. The maximum number of semaphores in the system
|
||||||
is set by <varname>SEMMNS</>, which consequently must be at least
|
is set by <varname>SEMMNS</>, which consequently must be at least
|
||||||
as high as the connection setting plus one extra for each 16
|
as high as <literal>max_connections</> plus one extra for each 16
|
||||||
allowed connections (see the formula in <xref
|
allowed connections (see the formula in <xref
|
||||||
linkend="sysvipc-parameters">). The parameter <varname>SEMMNI</>
|
linkend="sysvipc-parameters">). The parameter <varname>SEMMNI</>
|
||||||
determines the limit on the number of semaphore sets that can
|
determines the limit on the number of semaphore sets that can
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/port/sysv_shmem.c,v 1.10 2003/05/08 19:17:07 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/port/sysv_shmem.c,v 1.11 2003/07/14 20:00:22 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -45,10 +45,8 @@ void *UsedShmemSegAddr = NULL;
|
|||||||
static void *InternalIpcMemoryCreate(IpcMemoryKey memKey, uint32 size);
|
static void *InternalIpcMemoryCreate(IpcMemoryKey memKey, uint32 size);
|
||||||
static void IpcMemoryDetach(int status, Datum shmaddr);
|
static void IpcMemoryDetach(int status, Datum shmaddr);
|
||||||
static void IpcMemoryDelete(int status, Datum shmId);
|
static void IpcMemoryDelete(int status, Datum shmId);
|
||||||
static void *PrivateMemoryCreate(uint32 size);
|
|
||||||
static void PrivateMemoryDelete(int status, Datum memaddr);
|
|
||||||
static PGShmemHeader *PGSharedMemoryAttach(IpcMemoryKey key,
|
static PGShmemHeader *PGSharedMemoryAttach(IpcMemoryKey key,
|
||||||
IpcMemoryId *shmid, void *addr);
|
IpcMemoryId *shmid);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -243,41 +241,6 @@ PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
|
||||||
* private memory support
|
|
||||||
*
|
|
||||||
* Rather than allocating shmem segments with IPC_PRIVATE key, we
|
|
||||||
* just malloc() the requested amount of space. This code emulates
|
|
||||||
* the needed shmem functions.
|
|
||||||
* ----------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void *
|
|
||||||
PrivateMemoryCreate(uint32 size)
|
|
||||||
{
|
|
||||||
void *memAddress;
|
|
||||||
|
|
||||||
memAddress = malloc(size);
|
|
||||||
if (!memAddress)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "PrivateMemoryCreate: malloc(%u) failed\n", size);
|
|
||||||
proc_exit(1);
|
|
||||||
}
|
|
||||||
MemSet(memAddress, 0, size); /* keep Purify quiet */
|
|
||||||
|
|
||||||
/* Register on-exit routine to release storage */
|
|
||||||
on_shmem_exit(PrivateMemoryDelete, PointerGetDatum(memAddress));
|
|
||||||
|
|
||||||
return memAddress;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
PrivateMemoryDelete(int status, Datum memaddr)
|
|
||||||
{
|
|
||||||
free(DatumGetPointer(memaddr));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PGSharedMemoryCreate
|
* PGSharedMemoryCreate
|
||||||
*
|
*
|
||||||
@ -289,6 +252,9 @@ PrivateMemoryDelete(int status, Datum memaddr)
|
|||||||
* collision with non-Postgres shmem segments. The idea here is to detect and
|
* collision with non-Postgres shmem segments. The idea here is to detect and
|
||||||
* re-use keys that may have been assigned by a crashed postmaster or backend.
|
* re-use keys that may have been assigned by a crashed postmaster or backend.
|
||||||
*
|
*
|
||||||
|
* makePrivate means to always create a new segment, rather than attach to
|
||||||
|
* or recycle any existing segment.
|
||||||
|
*
|
||||||
* The port number is passed for possible use as a key (for SysV, we use
|
* The port number is passed for possible use as a key (for SysV, we use
|
||||||
* it to generate the starting shmem key). In a standalone backend,
|
* it to generate the starting shmem key). In a standalone backend,
|
||||||
* zero will be passed.
|
* zero will be passed.
|
||||||
@ -307,8 +273,7 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
|
|||||||
/* Just attach and return the pointer */
|
/* Just attach and return the pointer */
|
||||||
if (ExecBackend && UsedShmemSegAddr != NULL && !makePrivate)
|
if (ExecBackend && UsedShmemSegAddr != NULL && !makePrivate)
|
||||||
{
|
{
|
||||||
if ((hdr = (PGShmemHeader *) memAddress = PGSharedMemoryAttach(
|
if ((hdr = PGSharedMemoryAttach(UsedShmemSegID, &shmid)) == NULL)
|
||||||
UsedShmemSegID, &shmid, UsedShmemSegAddr)) == NULL)
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Unable to attach to proper memory at fixed address: shmget(key=%d, addr=%p) failed: %s\n",
|
fprintf(stderr, "Unable to attach to proper memory at fixed address: shmget(key=%d, addr=%p) failed: %s\n",
|
||||||
(int) UsedShmemSegID, UsedShmemSegAddr, strerror(errno));
|
(int) UsedShmemSegID, UsedShmemSegAddr, strerror(errno));
|
||||||
@ -317,34 +282,29 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
|
|||||||
return hdr;
|
return hdr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create shared memory */
|
/* Loop till we find a free IPC key */
|
||||||
|
NextShmemSegID = port * 1000;
|
||||||
NextShmemSegID = port * 1000 + 1;
|
|
||||||
|
|
||||||
for (;;NextShmemSegID++)
|
for (NextShmemSegID++;; NextShmemSegID++)
|
||||||
{
|
{
|
||||||
/* Special case if creating a private segment --- just malloc() it */
|
|
||||||
if (makePrivate)
|
|
||||||
{
|
|
||||||
memAddress = PrivateMemoryCreate(size);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try to create new segment */
|
/* Try to create new segment */
|
||||||
memAddress = InternalIpcMemoryCreate(NextShmemSegID, size);
|
memAddress = InternalIpcMemoryCreate(NextShmemSegID, size);
|
||||||
if (memAddress)
|
if (memAddress)
|
||||||
break; /* successful create and attach */
|
break; /* successful create and attach */
|
||||||
|
|
||||||
/* Check shared memory and possibly remove and recreate */
|
/* Check shared memory and possibly remove and recreate */
|
||||||
|
|
||||||
if ((hdr = (PGShmemHeader *) memAddress = PGSharedMemoryAttach(
|
if (makePrivate) /* a standalone backend shouldn't do this */
|
||||||
NextShmemSegID, &shmid, UsedShmemSegAddr)) == NULL)
|
continue;
|
||||||
|
|
||||||
|
if ((memAddress = PGSharedMemoryAttach(NextShmemSegID, &shmid)) == NULL)
|
||||||
continue; /* can't attach, not one of mine */
|
continue; /* can't attach, not one of mine */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If I am not the creator and it belongs to an extant process,
|
* If I am not the creator and it belongs to an extant process,
|
||||||
* continue.
|
* continue.
|
||||||
*/
|
*/
|
||||||
|
hdr = (PGShmemHeader *) memAddress;
|
||||||
if (hdr->creatorPID != getpid())
|
if (hdr->creatorPID != getpid())
|
||||||
{
|
{
|
||||||
if (kill(hdr->creatorPID, 0) == 0 || errno != ESRCH)
|
if (kill(hdr->creatorPID, 0) == 0 || errno != ESRCH)
|
||||||
@ -407,22 +367,25 @@ PGSharedMemoryCreate(uint32 size, bool makePrivate, int port)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attach to shared memory and make sure it has a Postgres header
|
* Attach to shared memory and make sure it has a Postgres header
|
||||||
|
*
|
||||||
|
* Returns attach address if OK, else NULL
|
||||||
*/
|
*/
|
||||||
static PGShmemHeader *
|
static PGShmemHeader *
|
||||||
PGSharedMemoryAttach(IpcMemoryKey key, IpcMemoryId *shmid, void *addr)
|
PGSharedMemoryAttach(IpcMemoryKey key, IpcMemoryId *shmid)
|
||||||
{
|
{
|
||||||
PGShmemHeader *hdr;
|
PGShmemHeader *hdr;
|
||||||
|
|
||||||
if ((*shmid = shmget(key, sizeof(PGShmemHeader), 0)) < 0)
|
if ((*shmid = shmget(key, sizeof(PGShmemHeader), 0)) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
hdr = (PGShmemHeader *) shmat(*shmid, UsedShmemSegAddr,
|
hdr = (PGShmemHeader *) shmat(*shmid,
|
||||||
|
UsedShmemSegAddr,
|
||||||
#if defined(solaris) && defined(__sparc__)
|
#if defined(solaris) && defined(__sparc__)
|
||||||
/* use intimate shared memory on SPARC Solaris */
|
/* use intimate shared memory on Solaris */
|
||||||
SHM_SHARE_MMU
|
SHM_SHARE_MMU
|
||||||
#else
|
#else
|
||||||
0
|
0
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -434,5 +397,6 @@ PGSharedMemoryAttach(IpcMemoryKey key, IpcMemoryId *shmid, void *addr)
|
|||||||
shmdt(hdr);
|
shmdt(hdr);
|
||||||
return NULL; /* segment belongs to a non-Postgres app */
|
return NULL; /* segment belongs to a non-Postgres app */
|
||||||
}
|
}
|
||||||
|
|
||||||
return hdr;
|
return hdr;
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.122 2003/06/27 14:45:30 petere Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.123 2003/07/14 20:00:22 tgl Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
@ -176,12 +176,8 @@ InitCommunication(void)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We're running a postgres bootstrap process or a standalone backend.
|
* We're running a postgres bootstrap process or a standalone backend.
|
||||||
* Create private "shmem" and semaphores. Force MaxBackends to 1 so
|
* Create private "shmem" and semaphores.
|
||||||
* that we don't allocate more resources than necessary.
|
|
||||||
*/
|
*/
|
||||||
SetConfigOption("max_connections", "1",
|
|
||||||
PGC_POSTMASTER, PGC_S_OVERRIDE);
|
|
||||||
|
|
||||||
CreateSharedMemoryAndSemaphores(true, MaxBackends, 0);
|
CreateSharedMemoryAndSemaphores(true, MaxBackends, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -210,6 +210,10 @@
|
|||||||
#client_encoding = sql_ascii # actually, defaults to database encoding
|
#client_encoding = sql_ascii # actually, defaults to database encoding
|
||||||
|
|
||||||
# These settings are initialized by initdb -- they may be changed
|
# These settings are initialized by initdb -- they may be changed
|
||||||
|
#lc_messages = 'C' # locale for system error message strings
|
||||||
|
#lc_monetary = 'C' # locale for monetary formatting
|
||||||
|
#lc_numeric = 'C' # locale for number formatting
|
||||||
|
#lc_time = 'C' # locale for time formatting
|
||||||
|
|
||||||
# Other Defaults
|
# Other Defaults
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
# Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
# Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||||
# Portions Copyright (c) 1994, Regents of the University of California
|
# Portions Copyright (c) 1994, Regents of the University of California
|
||||||
#
|
#
|
||||||
# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.193 2003/07/04 16:41:21 tgl Exp $
|
# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.194 2003/07/14 20:00:23 tgl Exp $
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -577,6 +577,40 @@ echo "$short_version" > "$PGDATA/base/1/PG_VERSION" || exit_nicely
|
|||||||
|
|
||||||
echo "ok"
|
echo "ok"
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# DETERMINE PLATFORM-SPECIFIC CONFIG SETTINGS
|
||||||
|
#
|
||||||
|
# Use reasonable values if kernel will let us, else scale back
|
||||||
|
|
||||||
|
cp /dev/null "$PGDATA"/postgresql.conf || exit_nicely
|
||||||
|
|
||||||
|
$ECHO_N "selecting default shared_buffers... "$ECHO_C
|
||||||
|
|
||||||
|
for nbuffers in 1000 900 800 700 600 500 400 300 200 100 50
|
||||||
|
do
|
||||||
|
TEST_OPT="$PGSQL_OPT -c shared_buffers=$nbuffers -c max_connections=5"
|
||||||
|
if "$PGPATH"/postgres $TEST_OPT template1 </dev/null >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "$nbuffers"
|
||||||
|
|
||||||
|
$ECHO_N "selecting default max_connections... "$ECHO_C
|
||||||
|
|
||||||
|
for nconns in 100 50 40 30 20 10
|
||||||
|
do
|
||||||
|
TEST_OPT="$PGSQL_OPT -c shared_buffers=$nbuffers -c max_connections=$nconns"
|
||||||
|
if "$PGPATH"/postgres $TEST_OPT template1 </dev/null >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "$nconns"
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
#
|
#
|
||||||
# CREATE CONFIG FILES
|
# CREATE CONFIG FILES
|
||||||
@ -585,14 +619,13 @@ $ECHO_N "creating configuration files... "$ECHO_C
|
|||||||
|
|
||||||
cp "$PG_HBA_SAMPLE" "$PGDATA"/pg_hba.conf || exit_nicely
|
cp "$PG_HBA_SAMPLE" "$PGDATA"/pg_hba.conf || exit_nicely
|
||||||
cp "$PG_IDENT_SAMPLE" "$PGDATA"/pg_ident.conf || exit_nicely
|
cp "$PG_IDENT_SAMPLE" "$PGDATA"/pg_ident.conf || exit_nicely
|
||||||
(
|
sed -e "s/^#shared_buffers = 64/shared_buffers = $nbuffers/" \
|
||||||
trigger="# These settings are initialized by initdb -- they may be changed"
|
-e "s/^#max_connections = 32/max_connections = $nconns/" \
|
||||||
sed -n "1,/$trigger/p" "$POSTGRESQL_CONF_SAMPLE"
|
-e "s/^#lc_messages = 'C'/lc_messages = '`pg_getlocale MESSAGES`'/" \
|
||||||
for cat in MESSAGES MONETARY NUMERIC TIME; do
|
-e "s/^#lc_monetary = 'C'/lc_monetary = '`pg_getlocale MONETARY`'/" \
|
||||||
echo "LC_$cat = '`pg_getlocale $cat`'"
|
-e "s/^#lc_numeric = 'C'/lc_numeric = '`pg_getlocale NUMERIC`'/" \
|
||||||
done
|
-e "s/^#lc_time = 'C'/lc_time = '`pg_getlocale TIME`'/" \
|
||||||
sed -n "1,/$trigger/!p" "$POSTGRESQL_CONF_SAMPLE"
|
"$POSTGRESQL_CONF_SAMPLE" > "$PGDATA"/postgresql.conf || exit_nicely
|
||||||
) > "$PGDATA"/postgresql.conf || exit_nicely
|
|
||||||
|
|
||||||
chmod 0600 "$PGDATA"/pg_hba.conf "$PGDATA"/pg_ident.conf \
|
chmod 0600 "$PGDATA"/pg_hba.conf "$PGDATA"/pg_ident.conf \
|
||||||
"$PGDATA"/postgresql.conf
|
"$PGDATA"/postgresql.conf
|
||||||
|
Loading…
x
Reference in New Issue
Block a user