diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-08-30 00:58:48 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-08-30 00:58:48 +0000 |
commit | 78ef2d3feb3192c7b727463d66d5b082ff756def (patch) | |
tree | 7b9b66957591fb12faf5816df738c79cbcfa2bf7 /doc/src | |
parent | 037709e0b3da1f7ac3d794c60216365cf3e23de1 (diff) | |
download | postgresql-78ef2d3feb3192c7b727463d66d5b082ff756def.tar.gz postgresql-78ef2d3feb3192c7b727463d66d5b082ff756def.zip |
Update documentation about shared memory sizing to reflect current
reality.
Diffstat (limited to 'doc/src')
-rw-r--r-- | doc/src/sgml/runtime.sgml | 162 |
1 files changed, 132 insertions, 30 deletions
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index e346ece23ca..3d34835ea15 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -1,5 +1,5 @@ <!-- -$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.349 2005/08/29 21:38:17 tgl Exp $ +$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.350 2005/08/30 00:58:47 tgl Exp $ --> <chapter Id="runtime"> @@ -1161,7 +1161,7 @@ SET ENABLE_SEQSCAN TO OFF; buffers is only a buffer descriptor, or about 64 bytes, per increment in <varname>temp_buffers</>. However if a buffer is actually used an additional 8192 bytes will be consumed for it - (or in general <symbol>BLCKSZ</symbol> bytes). + (or in general, <symbol>BLCKSZ</symbol> bytes). </para> </listitem> </varlistentry> @@ -1184,6 +1184,14 @@ SET ENABLE_SEQSCAN TO OFF; </para> <para> + If you are not using prepared transactions, this parameter may as + well be set to zero. If you are using them, you will probably + want <varname>max_prepared_transactions</varname> to be at least + as large as <xref linkend="guc-max-connections">, to avoid unwanted + failures at the prepare step. + </para> + + <para> Increasing this parameter may cause <productname>PostgreSQL</> to request more <systemitem class="osname">System V</> shared memory than your operating system's default configuration @@ -1267,6 +1275,32 @@ SET ENABLE_SEQSCAN TO OFF; <sect3 id="runtime-config-resource-fsm"> <title>Free Space Map</title> + <indexterm> + <primary>free space map</primary> + </indexterm> + + <para> + These parameters control the size of the shared <firstterm>free space + map</>, which tracks the locations of unused space in the database. + An undersized free space map may cause the database to consume + increasing amounts of disk space over time, because free space that + is not in the map cannot be re-used; instead <productname>PostgreSQL</> + will request more disk space from the operating system when it needs + to store new data. + The last few lines displayed by a database-wide <command>VACUUM VERBOSE</> + command can help in determining if the current settings are adequate. + A <literal>NOTICE</> message is also printed during such an operation + if the current settings are too low. + </para> + + <para> + Increasing these parameters may cause <productname>PostgreSQL</> + to request more <systemitem class="osname">System V</> shared + memory than your operating system's default configuration + allows. See <xref linkend="sysvipc"> for information on how to + adjust those parameters, if necessary. + </para> + <variablelist> <varlistentry id="guc-max-fsm-pages" xreflabel="max_fsm_pages"> <term><varname>max_fsm_pages</varname> (<type>integer</type>)</term> @@ -1279,10 +1313,6 @@ SET ENABLE_SEQSCAN TO OFF; be tracked in the shared free-space map. Six bytes of shared memory are consumed for each page slot. This setting must be more than 16 * <varname>max_fsm_relations</varname>. The default is 20000. - The last few lines of a database-wide <command>VACUUM VERBOSE</> - can help in determining if the the default setting is suitable. - A <literal>NOTICE</> message is also printed during such an operation - if the current setting is too low. This option can only be set at server start. </para> </listitem> @@ -1297,12 +1327,8 @@ SET ENABLE_SEQSCAN TO OFF; <para> Sets the maximum number of relations (tables and indexes) for which free space will be tracked in the shared free-space map. Roughly - fifty bytes of shared memory are consumed for each slot. + seventy bytes of shared memory are consumed for each slot. The default is 1000. - The last few lines of a database-wide <command>VACUUM VERBOSE</> - can help in determining if the the default setting is suitable. - A <literal>NOTICE</> message is also printed during such an operation - if the current setting is too low. This option can only be set at server start. </para> </listitem> @@ -1804,9 +1830,18 @@ SET ENABLE_SEQSCAN TO OFF; <para> Number of disk-page buffers allocated in shared memory for WAL data. The default is 8. The setting need only be large enough to hold - the amount of WAL data generated by one typical transaction. + the amount of WAL data generated by one typical transaction, since + the data is flushed to disk at every transaction commit. This option 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 than your operating system's default configuration + allows. See <xref linkend="sysvipc"> for information on how to + adjust those parameters, if necessary. + </para> </listitem> </varlistentry> @@ -3952,9 +3987,11 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' </indexterm> <listitem> <para> - The shared lock table is sized on the assumption that at most + The shared lock table is created with room to describe locks on <varname>max_locks_per_transaction</varname> * - <varname>max_connections</varname> distinct objects will need to + (<xref linkend="guc-max-connections"> + + <xref linkend="guc-max-prepared-transactions">) objects; + hence, no more than this many distinct objects can be locked at any one time. (Thus, this parameter's name may be confusing: it is not a hard limit on the number of locks taken by any one transaction, but rather a maximum average value.) @@ -3963,6 +4000,14 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' have clients that touch many different tables in a single transaction. This option 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 than your operating system's default configuration + allows. See <xref linkend="sysvipc"> for information on how to + adjust those parameters, if necessary. + </para> </listitem> </varlistentry> @@ -4653,9 +4698,10 @@ $ <userinput>postmaster -o '-S 1024 -s'</userinput> relevant for <productname>PostgreSQL</>). Almost all modern operating systems provide these features, but not all of them have them turned on or sufficiently sized by default, especially systems - with BSD heritage. (For the <systemitem class="osname">QNX</> and - <systemitem class="osname">BeOS</> ports, <productname>PostgreSQL</> - provides its own replacement implementation of these facilities.) + with BSD heritage. (For the <systemitem class="osname">Windows</>, + <systemitem class="osname">QNX</> and <systemitem class="osname">BeOS</> + ports, <productname>PostgreSQL</> provides its own replacement + implementation of these facilities.) </para> <para> @@ -4695,8 +4741,7 @@ $ <userinput>postmaster -o '-S 1024 -s'</userinput> <row> <entry><varname>SHMMAX</></> <entry>Maximum size of shared memory segment (bytes)</> - <entry>250 kB + 8.2 kB * <xref linkend="guc-shared-buffers"> + - 14.2 kB * <xref linkend="guc-max-connections"> up to infinity</entry> + <entry>at least several megabytes (see text)</entry> </row> <row> @@ -4764,14 +4809,17 @@ $ <userinput>postmaster -o '-S 1024 -s'</userinput> bytes, of a shared memory segment. If you get an error message from <function>shmget</> like <errorname>Invalid argument</>, it is likely that this limit has been exceeded. The size of the required - shared memory segment varies both with the number of requested - buffers (<option>-B</> option) and the number of allowed connections - (<option>-N</> option), although the former is the most significant. - (You can, as a temporary solution, lower these settings to eliminate - the failure.) As a rough approximation, you can estimate the - required segment size as suggested in <xref - linkend="sysvipc-parameters">. Any error message you might get will - contain the size of the failed allocation request. + shared memory segment varies depending on several + <productname>PostgreSQL</> configuration parameters, as shown in + <xref linkend="shared-memory-parameters">. + You can, as a temporary solution, lower some of those settings to + avoid the failure. As a rough approximation, you can estimate the + required segment size as 500 kB plus the variable amounts shown in + the table. (Any error message you might get will include the exact + size of the failed allocation request.) While it is possible to get + <productname>PostgreSQL</> to run with <varname>SHMMAX</> as small as + 1 MB, you need at least 4 MB for acceptable performance, and desirable + settings are in the tens of megabytes. </para> <para> @@ -4785,7 +4833,7 @@ $ <userinput>postmaster -o '-S 1024 -s'</userinput> <para> Less likely to cause problems is the minimum size for shared memory segments (<varname>SHMMIN</>), which should be at most - approximately 256 kB for <productname>PostgreSQL</> (it is + approximately 500 kB for <productname>PostgreSQL</> (it is usually just 1). The maximum number of segments system-wide (<varname>SHMMNI</>) or per-process (<varname>SHMSEG</>) are unlikely to cause a problem unless your system has them set to zero. @@ -4793,8 +4841,8 @@ $ <userinput>postmaster -o '-S 1024 -s'</userinput> <para> <productname>PostgreSQL</> uses one semaphore per allowed connection - (<option>-N</> option), in sets of 16. Each such set will also - contain a 17th semaphore which contains a <quote>magic + (<xref linkend="guc-max-connections">), 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</>, which consequently must be at least @@ -4834,6 +4882,7 @@ $ <userinput>postmaster -o '-S 1024 -s'</userinput> for <productname>PostgreSQL</>. </para> + <variablelist> <varlistentry> @@ -5172,6 +5221,59 @@ set semsys:seminfo_semmsl=32 </varlistentry> </variablelist> + + + <table id="shared-memory-parameters"> + <title>Configuration parameters affecting + <productname>PostgreSQL</productname>'s shared memory usage</> + + <tgroup cols="2"> + <thead> + <row> + <entry>Name</> + <entry>Approximate multiplier (bytes per increment)</> + </row> + </thead> + + <tbody> + <row> + <entry><xref linkend="guc-max-connections"></> + <entry>400 (but see also <varname>max_locks_per_transaction</>)</entry> + </row> + + <row> + <entry><xref linkend="guc-max-prepared-transactions"></> + <entry>600 (but see also <varname>max_locks_per_transaction</>)</entry> + </row> + + <row> + <entry><xref linkend="guc-max-locks-per-transaction"></> + <entry>220 * (<xref linkend="guc-max-connections"> + + <xref linkend="guc-max-prepared-transactions">)</> + </row> + + <row> + <entry><xref linkend="guc-shared-buffers"></> + <entry>8300</> + </row> + + <row> + <entry><xref linkend="guc-wal-buffers"></> + <entry>8200</> + </row> + + <row> + <entry><xref linkend="guc-max-fsm-relations"></> + <entry>70</> + </row> + + <row> + <entry><xref linkend="guc-max-fsm-pages"></> + <entry>6</> + </row> + </tbody> + </tgroup> + </table> </sect2> |