<productname>PostgreSQL</productname> can sometimes exhaust various operating system resource limits, especially when multiple copies of the server are running on the same system, or in very large installations. This section explains the kernel resources used by <productname>PostgreSQL</productname> and the steps you can take to resolve problems related to kernel resource consumption. PostgreSQLは、特に同一システム上で複数のサーバコピーを実行している場合や非常に大規模なインストレーションでは、オペレーティングシステムの様々なリソース制限を超えてしまうことがあります。 本節では、PostgreSQLで使用されるカーネルリソース、およびカーネルリソース消費に関連した問題を解消する時に取ることができる手順について説明します。
<productname>PostgreSQL</productname> requires the operating system to provide inter-process communication (<acronym>IPC</acronym>) features, specifically shared memory and semaphores. Unix-derived systems typically provide <quote><systemitem class="osname">System V</systemitem></quote> <acronym>IPC</acronym>, <quote><systemitem class="osname">POSIX</systemitem></quote> <acronym>IPC</acronym>, or both. <systemitem class="osname">Windows</systemitem> has its own implementation of these features and is not discussed here. PostgreSQLはオペレーティングシステムが、プロセス間通信(IPC)特に共有メモリとセマフォ機能を提供することを要求します。 Unix(派生)システムでは、「System V」 IPCや、「POSIX」 IPC、またはその両方を提供します。 Windowsは、これらの機能を独自で実装しているため、ここでは説明しません。
By default, <productname>PostgreSQL</productname> allocates
a very small amount of System V shared memory, as well as a much larger
amount of anonymous <function>mmap</function> shared memory.
Alternatively, a single large System V shared memory region can be used
(see <xref linkend="guc-shared-memory-type"/>).
In addition a significant number of semaphores, which can be either
System V or POSIX style, are created at server startup. Currently,
POSIX semaphores are used on Linux and FreeBSD systems while other
platforms use System V semaphores.
デフォルトではPostgreSQLは通常、非常に少量のSystem V共有メモリと、もっと大量の無名mmap
共有メモリを割り当てます。
代替方法として、単一の大きなSystem Vメモリリージョンも利用できます
(shared_memory_type参照)。
さらに、System V又はPOSIXスタイルのどちらかのセマフォがサーバの起動時に作成されます。
現在、LinuxとFreeBSDシステムではPOSIXセマフォが使用され、それ以外のプラットフォームではSystem Vセマフォが使用されます。
System V <acronym>IPC</acronym> features are typically constrained by system-wide allocation limits. When <productname>PostgreSQL</productname> exceeds one of these limits, the server will refuse to start and should leave an instructive error message describing the problem and what to do about it. (See also <xref linkend="server-start-failures"/>.) The relevant kernel parameters are named consistently across different systems; <xref linkend="sysvipc-parameters"/> gives an overview. The methods to set them, however, vary. Suggestions for some platforms are given below. System V IPC機能は、通常システム全体の割り当て制限に制約されます。 PostgreSQLがこれらの制限のいずれかを超えると、サーバは起動を拒否し、問題および何をすべきかを説明するエラーメッセージを残します。 (18.3.1 も参照してください。) 関係するカーネルパラメータは別々のシステム上でも統一して名付けられています。 表 18.1で概略がわかります。 しかしこれらを設定するための方法は異なります。 以下に、いくつかのプラットフォームへの提案を挙げます。
表18.1 System V IPCパラメータ
名前 | 説明 | 一つのPostgreSQLインスタンスに必要な値 |
---|---|---|
SHMMAX | 共有メモリセグメントの最大サイズ(バイト) | 最小でも1キロバイト(ただしデフォルトはもっと多くなっています) |
SHMMIN | 共有メモリセグメントの最小サイズ(バイト) | 1 |
SHMALL | 使用可能な共有メモリの総量(バイトまたはページ) | バイト指定の場合はSHMMAX と同じ。ページ指定の場合はceil(SHMMAX/PAGE_SIZE) 。 + 他のアプリケーション用の空間 |
SHMSEG | プロセスごとの共有メモリセグメントの最大数 | 必要なのは1セグメントのみ(ただしデフォルトはもっと多くなっています) |
SHMMNI | システム全体の共有メモリセグメントの最大数 | SHMSEG と同様 + 他のアプリケーション用の空間 |
SEMMNI | セマフォ識別子の最大数(つまりセット) | 最低ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16) + 他のアプリケーション用の空間 |
SEMMNS | システム全体のセマフォの最大数 | ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16) * 17 + 他のアプリケーション用の空間 |
SEMMSL | セットごとのセマフォの最大数 | 最低17 |
SEMMAP | セマフォマップの中の項目の数 | 本文を参照 |
SEMVMX | セマフォの最大値 | 最低1000(デフォルトはしばしば32767ですが、必要がなければ変更しないでください) |
<productname>PostgreSQL</productname> requires a few bytes of System V shared memory
(typically 48 bytes, on 64-bit platforms) for each copy of the server.
On most modern operating systems, this amount can easily be allocated.
However, if you are running many copies of the server or you explicitly
configure the server to use large amounts of System V shared memory (see
<xref linkend="guc-shared-memory-type"/> and <xref
linkend="guc-dynamic-shared-memory-type"/>), it may be necessary to
increase <varname>SHMALL</varname>, which is the total amount of System V shared
memory system-wide. Note that <varname>SHMALL</varname> is measured in pages
rather than bytes on many systems.
PostgreSQLは、サーバのコピー毎にSystem V共有メモリの数バイト(64ビットプラットフォームでは通常48バイト)を必要とします。
最近のほとんどのオペレーティングシステムでは、このくらいの量は簡単に割り当てられます。
しかし複数のサーバのコピーを実行している場合やSystem V共有メモリを使用する他のアプリケーションを実行している場合(shared_memory_typeおよびdynamic_shared_memory_typeを参照)は、システム全体のSystem V共有メモリであるSHMALL
を増加させる必要があるかもしれません。
多くのシステムではSHMALL
をバイト単位ではなくページ単位で測ることに注意してください。
Less likely to cause problems is the minimum size for shared
memory segments (<varname>SHMMIN</varname>), which should be at most
approximately 32 bytes for <productname>PostgreSQL</productname> (it is
usually just 1). The maximum number of segments system-wide
(<varname>SHMMNI</varname>) or per-process (<varname>SHMSEG</varname>) are unlikely
to cause a problem unless your system has them set to zero.
問題が少ないのは共有メモリセグメントの最小サイズ(SHMMIN
)で、PostgreSQLでは最大でもおよそ32バイトのはずです(通常では1です)。
システム全体のセグメントの最大数(SHMMNI
)もしくはプロセスごとのセグメントの最大数(SHMSEG
)に関して、使用しているシステムで0に設定されていない限り、問題が起きることはほぼありません。
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.
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
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>.
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>.
System V セマフォを使用している場合、PostgreSQLは、許可した接続(max_connections)、許可したオートバキュームワーカープロセス(autovacuum_max_workers)、許可したWAL送信プロセス(max_wal_senders)、許可したバックエンドプロセス(max_worker_processes)ごとに1つのセマフォを使用し、16個のセマフォをセットとして扱います。
それぞれそのようなセットは、他のアプリケーションに使われているセマフォセットとの衝突を検出するための「マジックナンバー」が含まれている17個目のセマフォを持っています。
システム内のセマフォの最大数はSEMMNS
によって設定され、その結果としてその値は少なくともmax_connections
+autovacuum_max_workers
+max_wal_senders
+max_worker_processes
と同じ、ただし、許可された接続とワーカー16個ごとに余分な1個を加えた値以上はなければいけません(表 18.1の公式を参照してください)。
SEMMNI
パラメータはシステム上に同時に存在できるセマフォ集合の数の上限を決定します。
ですから、このパラメータは少なくともceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 16)
以上はなくてはいけません。
一時的な失敗の回避策としては許可される接続の数を下げることができますが、「No space left on device」という紛らわしい言葉がsemget
関数から表示されます。
In some cases it might also be necessary to increase
<varname>SEMMAP</varname> to be at least on the order of
<varname>SEMMNS</varname>. If the system has this parameter
(many do not), it defines the size of the semaphore
resource map, in which each contiguous block of available semaphores
needs an entry. When a semaphore set is freed it is either added to
an existing entry that is adjacent to the freed block or it is
registered under a new map entry. If the map is full, the freed
semaphores get lost (until reboot). Fragmentation of the semaphore
space could over time lead to fewer available semaphores than there
should be.
場合によってはSEMMAP
を少なくともSEMMNS
と同程度に増やすことが必要になる場合があるかもしれません。
システムにこのパラメータがあるなら(ないかもしれません)、このパラメータはセマフォリソースマップのサイズを定義し、その中では有効なセマフォのそれぞれの隣接したブロックの項目が必要です。
セマフォ集合が解放されると、解放されたブロックに隣接する既に存在する項目に追加されるか、もしくは新しいマップの項目の下に登録されます。
もしマップが一杯だった場合、解放されたセマフォは(再起動するまで)失われます。
セマフォ空間の断片化により時間が経つごとに、有効なセマフォがあるべき量よりも少なくなる可能性があります。
Various other settings related to <quote>semaphore undo</quote>, such as
<varname>SEMMNU</varname> and <varname>SEMUME</varname>, do not affect
<productname>PostgreSQL</productname>.
SEMMNU
とSEMUME
のような、その他の様々な「semaphore undo」に関する設定はPostgreSQLには影響を与えません。
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"/>). On the platforms where this option is preferred, there is no specific kernel limit on the number of POSIX semaphores. POSIXセマフォを使用している場合、System Vと同じ数のセマフォを必要とします。 つまり、許可した接続(max_connections)、許可したオートバキュームワーカープロセス(autovacuum_max_workers)、許可したWAL送信プロセス(max_wal_senders)、許可したバックエンドプロセス(max_worker_processes)ごとに1つのセマフォを使用します。 このオプションが優先されるプラットフォームでは、POSIXセマフォの数に特定のカーネル制限はありません。
The default shared memory settings are usually good enough, unless
you have set <literal>shared_memory_type</literal> to <literal>sysv</literal>.
System V semaphores are not used on this platform.
shared_memory_type
をsysv
に設定していない限り、通常はデフォルトの共有メモリ設定で十分です。
System V セマフォはこのプラットフォームでは使用しません。
The default IPC settings can be changed using
the <command>sysctl</command> or
<command>loader</command> interfaces. The following
parameters can be set using <command>sysctl</command>:
デフォルトのIPC設定はsysctl
またはloader
インタフェースを使用して変更を行うことができます。
以下ではsysctl
を使用してパラメータを変更しています。
#
sysctl kern.ipc.shmall=32768
#
sysctl kern.ipc.shmmax=134217728
To make these settings persist over reboots, modify
<filename>/etc/sysctl.conf</filename>.
これらの設定を再起動しても永続化するには、/etc/sysctl.conf
を変更します。
If you have set <literal>shared_memory_type</literal> to
<literal>sysv</literal>, you might also want to configure your kernel
to lock System V shared memory into RAM and prevent it from being paged
out to swap. This can be accomplished using the <command>sysctl</command>
setting <literal>kern.ipc.shm_use_phys</literal>.
shared_memory_type
をsysv
に設定している場合は、System V共有メモリをRAM上に固定して、スワップによってページアウトされるのを避けるために、カーネルを設定することもできます。
これはsysctl
を使用してkern.ipc.shm_use_phys
を設定することで実現できます。
If running in a FreeBSD jail, you should set its
<literal>sysvshm</literal> parameter to <literal>new</literal>, so that
it has its own separate System V shared memory namespace.
(Before FreeBSD 11.0, it was necessary to enable shared access to
the host's IPC namespace from jails, and take measures to avoid
collisions.)
FreeBSD jailを実行している場合、sysvshm
パラメータをnew
に設定して、独自のSystem V共有メモリ名前空間を有するようにする必要があります。
(FreeBSD 11.0以前は、jailからIPC名前空間への共有アクセスを可能にし、衝突を避けるための対策を講じる必要がありました。)
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>
and <literal>kern.ipc.semmns</literal>,
as <systemitem class="osname">NetBSD</systemitem>'s default settings
for these are uncomfortably small.
shared_memory_type
をsysv
に設定していない限り、通常はデフォルトの共有メモリ設定で十分です。
通常は、kern.ipc.semmni
とkern.ipc.semmns
を増やす必要があります。これは、NetBSDのデフォルト設定は不適切に小さいためです。
IPC parameters can be adjusted using <command>sysctl</command>,
for example:
以下の例のようにIPCパラメータをsysctl
を用いて調整することができます。
#
sysctl -w kern.ipc.semmni=100
To make these settings persist over reboots, modify
<filename>/etc/sysctl.conf</filename>.
これらの設定を再起動しても永続化するには、/etc/sysctl.conf
を変更します。
If you have set <literal>shared_memory_type</literal> to
<literal>sysv</literal>, you might also want to configure your kernel
to lock System V shared memory into RAM and prevent it from being paged
out to swap. This can be accomplished using the <command>sysctl</command>
setting <literal>kern.ipc.shm_use_phys</literal>.
shared_memory_type
をsysv
に設定している場合は、System V共有メモリをRAM上に固定して、スワップによってページアウトされるのを避けるために、カーネルを設定することもできます。
これはsysctl
を使用してkern.ipc.shm_use_phys
を設定することで実現できます。
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.seminfo.semmni</literal>
and <literal>kern.seminfo.semmns</literal>,
as <systemitem class="osname">OpenBSD</systemitem>'s default settings
for these are uncomfortably small.
shared_memory_type
をsysv
に設定していない限り、通常はデフォルトの共有メモリ設定で十分です。
通常は、kern.seminfo.semmni
とkern.seminfo.semmns
を増やす必要があります。これは、OpenBSDのデフォルト設定は不適切に小さいためです。
IPC parameters can be adjusted using <command>sysctl</command>,
for example:
以下の例のようにIPCパラメータをsysctl
を用いて調整することができます。
#
sysctl kern.seminfo.semmni=100
To make these settings persist over reboots, modify
<filename>/etc/sysctl.conf</filename>.
これらの設定を再起動しても永続化するには、/etc/sysctl.conf
を変更します。
The default shared memory settings are usually good enough, unless
you have set <literal>shared_memory_type</literal> to <literal>sysv</literal>,
and even then only on older kernel versions that shipped with low defaults.
System V semaphores are not used on this platform.
shared_memory_type
をsysv
に設定していて、低いデフォルトで出荷されたより古いカーネルバージョンでない限り、通常はデフォルトの共有メモリ設定で十分です。
System V セマフォはこのプラットフォームでは使用しません。
The shared memory size settings can be changed via the
<command>sysctl</command> interface. For example, to allow 16 GB:
共有メモリサイズの設定はsysctl
インタフェースを使用して変更可能です。
例えば16ギガバイトまで許すには以下のようにします。
$
sysctl -w kernel.shmmax=17179869184
$
sysctl -w kernel.shmall=4194304
To make these settings persist over reboots, see
<filename>/etc/sysctl.conf</filename>.
これらの設定を再起動しても永続化するには、/etc/sysctl.conf
を参照してください。
The default shared memory and semaphore settings are usually good enough, unless
you have set <literal>shared_memory_type</literal> to <literal>sysv</literal>.
shared_memory_type
をsysv
に設定していない限り、通常はデフォルトの共有メモリとセマフォ設定で十分です。
The recommended method for configuring shared memory in macOS
is to create a file named <filename>/etc/sysctl.conf</filename>,
containing variable assignments such as:
macOSにおける共有メモリの推奨設定方法は、以下のような変数代入文からなる/etc/sysctl.conf
という名称のファイルを作成することです。
kern.sysv.shmmax=4194304 kern.sysv.shmmin=1 kern.sysv.shmmni=32 kern.sysv.shmseg=8 kern.sysv.shmall=1024
Note that in some macOS versions,
<emphasis>all five</emphasis> shared-memory parameters must be set in
<filename>/etc/sysctl.conf</filename>, else the values will be ignored.
一部のバージョンのmacOSでは/etc/sysctl.conf
内に共有メモリパラメータ5つすべてを設定しなければならないという点に注意してください。
さもなくば値が無視されます。
<varname>SHMMAX</varname> can only be set to a multiple of 4096.
SHMMAX
は4096の倍数のみ設定できます。
<varname>SHMALL</varname> is measured in 4 kB pages on this platform.
このプラットフォームではSHMALL
は4キロバイトページ単位です。
It is possible to change all but <varname>SHMMNI</varname> on the fly, using
<application>sysctl</application>. But it's still best to set up your preferred
values via <filename>/etc/sysctl.conf</filename>, so that the values will be
kept across reboots.
SHMMNI
以外の変更は、sysctlを用いることにより、その場でおこなうことができます。
しかしいずれにせよ/etc/sysctl.conf
経由で望む値に設定することが最善です。
再起動を行っても値が保持されるからです。
The default shared memory and semaphore settings are usually good enough for most
<productname>PostgreSQL</productname> applications. Solaris defaults
to a <varname>SHMMAX</varname> of one-quarter of system <acronym>RAM</acronym>.
To further adjust this setting, use a project setting associated
with the <literal>postgres</literal> user. For example, run the
following as <literal>root</literal>:
大抵のPostgreSQLアプリケーションではデフォルトの共有メモリとセマフォ設定で十分です。
SolarisのデフォルトのSHMMAX
はシステムのRAMの1/4になりました。
さらにこの設定を調整するためには、postgres
ユーザに関するプロジェクト設定を使用しなければなりません。
例えば以下をroot
権限で実行してください。
projadd -c "PostgreSQL DB User" -K "project.max-shm-memory=(privileged,8GB,deny)" -U postgres -G postgres user.postgres
This command adds the <literal>user.postgres</literal> project and
sets the shared memory maximum for the <literal>postgres</literal>
user to 8GB, and takes effect the next time that user logs
in, or when you restart <productname>PostgreSQL</productname> (not reload).
The above assumes that <productname>PostgreSQL</productname> is run by
the <literal>postgres</literal> user in the <literal>postgres</literal>
group. No server reboot is required.
このコマンドはuser.postgres
プロジェクトを追加し、postgres
ユーザの共有メモリの最大サイズを8GBに設定します。
この影響は次にこのユーザがログインした時、またはPostgreSQLを再起動した時(再読み込み時ではありません)に有効になります。
上ではPostgreSQLはpostgres
グループに属するpostgres
ユーザにより実行されていることを前提としています。
サーバの再起動は不要です。
Other recommended kernel setting changes for database servers which will have a large number of connections are: 多くの接続を受け付けるデータベースサーバにおいて推奨するカーネル設定にはこの他に以下があります。
project.max-shm-ids=(priv,32768,deny) project.max-sem-ids=(priv,4096,deny) project.max-msg-ids=(priv,4096,deny)
Additionally, if you are running <productname>PostgreSQL</productname>
inside a zone, you may need to raise the zone resource usage
limits as well. See "Chapter2: Projects and Tasks" in the
<citetitle>System Administrator's Guide</citetitle> for more
information on <literal>projects</literal> and <command>prctl</command>.
さらに、ゾーン内でPostgreSQLを実行している場合、ゾーンのリソース使用上限も上げる必要があるかもしれません。
projects
とprctl
についてはSystem Administrator's Guideの第2章 プロジェクトとタスクを参照してください。
If <productname>systemd</productname> is in use, some care must be taken
that IPC resources (including shared memory) are not prematurely
removed by the operating system. This is especially of concern when
installing PostgreSQL from source. Users of distribution packages of
PostgreSQL are less likely to be affected, as
the <literal>postgres</literal> user is then normally created as a system
user.
systemdが使用されている場合、(共有メモリを含む)IPCリソースがオペレーティングシステムによって時期尚早に削除されないように注意する必要があります。
これはPostgreSQLをソースからインストールした場合に特に重要です。
PostgreSQLのディストリビューションパッケージのユーザは、通常postgres
ユーザがシステムユーザで作成されるため、影響を受けにくいでしょう。
The setting <literal>RemoveIPC</literal>
in <filename>logind.conf</filename> controls whether IPC objects are
removed when a user fully logs out. System users are exempt. This
setting defaults to on in stock <productname>systemd</productname>, but
some operating system distributions default it to off.
logind.conf
のRemoveIPC
の設定はユーザが完全にログアウトしたときにIPCオブジェクトを削除するかどうかを制御します。
システムユーザは免除されます。
この設定のデフォルトはsystemdですが、いくつかのオペレーティングシステムではデフォルトでオフになっています。
A typical observed effect when this setting is on is that shared memory objects used for parallel query execution are removed at apparently random times, leading to errors and warnings while attempting to open and remove them, like この設定が有効になっている時の典型的な影響は、並列問い合わせの実行で使われる共有メモリオブジェクトが見かけ上ランダムな時間に削除され、共有メモリオブジェクトをオープンしようとしたり、削除しようとしたりした時に以下のようなエラーや警告が出ることです。
WARNING: could not remove shared memory segment "/PostgreSQL.1450751626": No such file or directory
Different types of IPC objects (shared memory vs. semaphores, System V vs. POSIX) are treated slightly differently by <productname>systemd</productname>, so one might observe that some IPC resources are not removed in the same way as others. But it is not advisable to rely on these subtle differences. IPCオブジェクトの違い(共有メモリ vs. セマフォ、System V vs. POSIX)はsystemdによって若干扱いが異なるため一部のIPCは他のものと違って削除されないことがあります。 しかし、これらの微妙な違いに依存することはお勧めできません。
A <quote>user logging out</quote> might happen as part of a maintenance
job or manually when an administrator logs in as
the <literal>postgres</literal> user or something similar, so it is hard
to prevent in general.
「ユーザログアウト」は、メンテナンスジョブの一環として、又は手動で、管理者がpostgres
ユーザや類似のユーザでログインする可能性があるため、一般的に防止することは困難です。
What is a <quote>system user</quote> is determined
at <productname>systemd</productname> compile time from
the <symbol>SYS_UID_MAX</symbol> setting
in <filename>/etc/login.defs</filename>.
「システムユーザ」は、/etc/login.defs
のSYS_UID_MAX
の設定によりsystemdのコンパイル時に決定されます。
Packaging and deployment scripts should be careful to create
the <literal>postgres</literal> user as a system user by
using <literal>useradd -r</literal>, <literal>adduser --system</literal>,
or equivalent.
パッケージとデプロイスクリプトは、useradd -r
, adduser --system
又は同等のコマンドを使用してpostgres
ユーザを作成するように注意する必要があります。
Alternatively, if the user account was created incorrectly or cannot be changed, it is recommended to set また、ユーザアカウントが誤って作成されて変更出来ないような場合は、以下を設定することを推奨します。
RemoveIPC=no
in <filename>/etc/systemd/logind.conf</filename> or another appropriate
configuration file.
/etc/systemd/logind.conf
又はその他の設定ファイルで上記を入れます。
At least one of these two things has to be ensured, or the PostgreSQL server will be very unreliable. これらの2つのうち少なくとも1つが保証されてないとなりません。そうでないとPostgreSQLサーバは非常に信頼性が低くなります。
Unix-like operating systems enforce various kinds of resource limits
that might interfere with the operation of your
<productname>PostgreSQL</productname> server. Of particular
importance are limits on the number of processes per user, the
number of open files per process, and the amount of memory available
to each process. Each of these have a <quote>hard</quote> and a
<quote>soft</quote> limit. The soft limit is what actually counts
but it can be changed by the user up to the hard limit. The hard
limit can only be changed by the root user. The system call
<function>setrlimit</function> is responsible for setting these
parameters. The shell's built-in command <command>ulimit</command>
(Bourne shells) or <command>limit</command> (<application>csh</application>) is
used to control the resource limits from the command line. On
BSD-derived systems the file <filename>/etc/login.conf</filename>
controls the various resource limits set during login. See the
operating system documentation for details. The relevant
parameters are <varname>maxproc</varname>,
<varname>openfiles</varname>, and <varname>datasize</varname>. For
example:
UnixライクなオペレーティングシステムではPostgreSQLサーバの操作と関係する可能性のある様々な種類のリソース制限があります。
特に重要なのは、ユーザごとのプロセス数の制限、プロセスごとのオープンファイルの数、プロセスごとの利用可能なメモリの量です。
これらのそれぞれが「ハード」と「ソフト」の2つの制限を持っています。
ソフト制限が実際に有効な制限ですが、ユーザによってハード制限まで変えることが可能です。
ハード制限はrootユーザによってのみ変えることができます。
setrlimit
システムコールがこれらのパラメータの設定を行います。
シェルの組み込みコマンドulimit
(Bourne シェル)もしくはlimit
(csh)は、コマンドラインからリソース制限を制御するために使われます。
BSD派生システム上では/etc/login.conf
ファイルが、ログイン時に設定される様々なリソース制限を制御します。
詳細はオペレーティングシステムの文書を参照してください。
関連するパラメータはmaxproc
、openfiles
、datasize
です。
以下に例を示します。
default:\ ... :datasize-cur=256M:\ :maxproc-cur=256:\ :openfiles-cur=256:\ ...
(<literal>-cur</literal> is the soft limit. Append
<literal>-max</literal> to set the hard limit.)
(-cur
はソフト制限です。
ハード制限を設定するためには-max
を付けてください。)
Kernels can also have system-wide limits on some resources. カーネルはいくつかのリソースに対して、システム全体の制限も持つことができます。
On <productname>Linux</productname> the kernel parameter
<varname>fs.file-max</varname> determines the maximum number of open
files that the kernel will support. It can be changed with
<literal>sysctl -w fs.file-max=<replaceable>N</replaceable></literal>.
To make the setting persist across reboots, add an assignment
in <filename>/etc/sysctl.conf</filename>.
The maximum limit of files per process is fixed at the time the
kernel is compiled; see
<filename>/usr/src/linux/Documentation/proc.txt</filename> for
more information.
Linuxカーネルパラメータfs.file-max
は、カーネルがサポートするオープンファイルの最大数を決定します。
これはsysctl-w fs.file-max=
で変更できます。
再起動後もこの設定を保持するには、N
/etc/sysctl.conf
に割り当てを追加します。
プロセスあたりのファイル数の上限は、カーネルのコンパイル時に固定されます。
詳細は/usr/src/linux/Documentation/proc.txt
を参照してください。
The <productname>PostgreSQL</productname> server uses one process per connection so you should provide for at least as many processes as allowed connections, in addition to what you need for the rest of your system. This is usually not a problem but if you run several servers on one machine things might get tight. PostgreSQLサーバは接続ごとに1つのプロセスを使うので、少なくとも許可された接続の数だけのプロセスに残りのシステムで必要な分を追加したものが必要になります。 通常はこれは問題ではありませんが、1つのマシン上でいくつかのサーバを起動している場合は厳しい状況になるかもしれません。
The factory default limit on open files is often set to <quote>socially friendly</quote> values that allow many users to coexist on a machine without using an inappropriate fraction of the system resources. If you run many servers on a machine this is perhaps what you want, but on dedicated servers you might want to raise this limit. オープンファイルの制限の出荷時のデフォルトは、しばしば大多数のユーザはマシン上でシステムリソースの不正使用をしないという前堤に立った「社会的に友好的な」値を設定してしまいます。 もし1つのマシン上で複数のサーバを起動する場合はそれが必要でしょうが、専用サーバではこの制限を上げたいかもしれません。
On the other side of the coin, some systems allow individual processes to open large numbers of files; if more than a few processes do so then the system-wide limit can easily be exceeded. If you find this happening, and you do not want to alter the system-wide limit, you can set <productname>PostgreSQL</productname>'s <xref linkend="guc-max-files-per-process"/> configuration parameter to limit the consumption of open files. 反対に、個々のプロセスが多数のファイルをオープンすることを許可するシステムもあります。 そのようなプロセスが数個以上あれば、システム全体の制限は簡単に超えてしまいます。 この発生を検知し、システム全体の制限の変更を望まない場合は、PostgreSQLのmax_files_per_process設定パラメータを設定し、オープンファイルの消費を制限することができます。
Another kernel limit that may be of concern when supporting large
numbers of client connections is the maximum socket connection queue
length. If more than that many connection requests arrive within a very
short period, some may get rejected before the <productname>PostgreSQL</productname> server can service
the requests, with those clients receiving unhelpful connection failure
errors such as <quote>Resource temporarily unavailable</quote> or
<quote>Connection refused</quote>. The default queue length limit is 128
on many platforms. To raise it, adjust the appropriate kernel parameter
via <application>sysctl</application>, then restart the <productname>PostgreSQL</productname> server.
The parameter is variously named <varname>net.core.somaxconn</varname>
on Linux, <varname>kern.ipc.soacceptqueue</varname> on newer FreeBSD,
and <varname>kern.ipc.somaxconn</varname> on macOS and other BSD
variants.
多数のクライアント接続をサポートする場合に懸念されるもう1つのカーネル制限は、ソケット接続キューの最大長です。
非常に短い時間内にそれ以上の数の接続要求が到着すると、PostgreSQLサーバが要求を処理する前に一部が拒否される可能性があります。
これらのクライアントは「Resource temporarily unavailable」や「Connection refused」などの役に立たない接続失敗エラーを受け取ります。
多くのプラットフォームでデフォルトのキュー長制限は128です。
これを上げるにはsysctlで適切なカーネルパラメータを調整し、PostgreSQLサーバを再起動します。
このパラメータはLinuxではnet.core.somaxconn
、新しいFreeBSDではkern.ipc.soacceptqueue
、macOSや他のBSD系ではkern.ipc.somaxconn
と様々な名前が付けられています。
The default virtual memory behavior on Linux is not optimal for <productname>PostgreSQL</productname>. Because of the way that the kernel implements memory overcommit, the kernel might terminate the <productname>PostgreSQL</productname> postmaster (the supervisor server process) if the memory demands of either <productname>PostgreSQL</productname> or another process cause the system to run out of virtual memory. Linuxでのデフォルトの仮想メモリの動作はPostgreSQLには最適ではありません。 カーネルがメモリオーバーコミットを実装する方法のため、カーネルは、PostgreSQLや他のプロセスのメモリ要求がシステムの仮想メモリを枯渇させた場合、PostgreSQL postmaster (スーパーバイザサーバプロセス)を終了させる可能性があります。
If this happens, you will see a kernel message that looks like this (consult your system documentation and configuration on where to look for such a message): これが発生した場合、以下のようなカーネルメッセージが現れます (こうしたメッセージを検索する場所についてはシステム文書と設定を参照してください)。
Out of Memory: Killed process 12345 (postgres).
This indicates that the <filename>postgres</filename> process
has been terminated due to memory pressure.
Although existing database connections will continue to function
normally, no new connections will be accepted. To recover,
<productname>PostgreSQL</productname> will need to be restarted.
これは、postgres
プロセスがメモリ不足のために終了してしまったことを示します。
起動中のデータベース接続は正常に動作しますが、新しい接続は受け付けられません。
復旧するには、PostgreSQLを再起動しなければなりません。
One way to avoid this problem is to run <productname>PostgreSQL</productname> on a machine where you can be sure that other processes will not run the machine out of memory. If memory is tight, increasing the swap space of the operating system can help avoid the problem, because the out-of-memory (OOM) killer is invoked only when physical memory and swap space are exhausted. この問題を防止する1つの方法として、PostgreSQLを他のプロセスがそのマシンのメモリを枯渇させないことが確実なマシンで起動するというものがあります。 物理メモリとスワップ領域が消費尽くされた時のみにメモリ不足(OOM)killerが発生するため、メモリが不足する場合、オペレーティングシステムのスワップ領域を増やすことが問題解決の役にたちます。
If <productname>PostgreSQL</productname> itself is the cause of the
system running out of memory, you can avoid the problem by changing
your configuration. In some cases, it may help to lower memory-related
configuration parameters, particularly
<link linkend="guc-shared-buffers"><varname>shared_buffers</varname></link>,
<link linkend="guc-work-mem"><varname>work_mem</varname></link>, and
<link linkend="guc-hash-mem-multiplier"><varname>hash_mem_multiplier</varname></link>.
In other cases, the problem may be caused by allowing too many
connections to the database server itself. In many cases, it may
be better to reduce
<link linkend="guc-max-connections"><varname>max_connections</varname></link>
and instead make use of external connection-pooling software.
PostgreSQL自体が実行中のシステムのメモリ不足を引き起こした場合、設定を変更することで問題を防止することができます。
場合によっては、メモリ関連の設定パラメータ、shared_buffers
、work_mem
およびhash_mem_multiplier
を低くすることで回避できる場合もあります。
この他にもデータベースサーバ自体への接続を多く許可しすぎることで問題が引き起こされる場合もあります。
多くの場合、max_connections
を減らし、外部のコネクションプールソフトウェアを使用することで改善されます。
It is possible to modify the
kernel's behavior so that it will not <quote>overcommit</quote> memory.
Although this setting will not prevent the <ulink
url="https://lwn.net/Articles/104179/">OOM killer</ulink> from being invoked
altogether, it will lower the chances significantly and will therefore
lead to more robust system behavior. This is done by selecting strict
overcommit mode via <command>sysctl</command>:
メモリを「オーバーコミット」させないようにカーネルの動作を変更することができます。
この設定は完全にOOM killerの発生を防ぐことはできませんが、その発生頻度をかなり軽減しますので、システム動作の堅牢性をより高めます。
これは、以下のようにsysctl
を使用して厳密なオーバーコミットモードを選択することで実施されます。
sysctl -w vm.overcommit_memory=2
or placing an equivalent entry in <filename>/etc/sysctl.conf</filename>.
You might also wish to modify the related setting
<varname>vm.overcommit_ratio</varname>. For details see the kernel documentation
file <ulink url="https://www.kernel.org/doc/Documentation/vm/overcommit-accounting"></ulink>.
または/etc/sysctl.conf
に同等のエントリを配置します。
また、関連するvm.overcommit_ratio
設定を変更した方が良いでしょう。
詳細はカーネル文書ファイルhttps://www.kernel.org/doc/Documentation/vm/overcommit-accountingを参照してください。
Another approach, which can be used with or without altering
<varname>vm.overcommit_memory</varname>, is to set the process-specific
<firstterm>OOM score adjustment</firstterm> value for the postmaster process to
<literal>-1000</literal>, thereby guaranteeing it will not be targeted by the OOM
killer. The simplest way to do this is to execute
vm.overcommit_memory
の変更と関係なく使用できるその他の方法は、プロセス固有のOOMスコア調整値をpostmasterプロセス向けに-1000
に設定することです。
これによりOOM killerの対象とならないことが保証されます。
このための最も簡単な方法は以下をPostgreSQLの起動スクリプト内でpostgres
を実行する直前に実行することです。
echo -1000 > /proc/self/oom_score_adj
in the <productname>PostgreSQL</productname> startup script just before
invoking <filename>postgres</filename>.
Note that this action must be done as root, or it will have no effect;
so a root-owned startup script is the easiest place to do it. If you
do this, you should also set these environment variables in the startup
script before invoking <filename>postgres</filename>:
この作業をrootで実行しなければならないことに注意して下さい。
さもないと効果がありません。
このためrootが所有する起動スクリプトが、これを行うための最も簡単な場所です。
その場合には、起動スクリプトのpostgres
の起動前に以下の環境変数を設定することも推奨します。
export PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj export PG_OOM_ADJUST_VALUE=0
These settings will cause postmaster child processes to run with the
normal OOM score adjustment of zero, so that the OOM killer can still
target them at need. You could use some other value for
<envar>PG_OOM_ADJUST_VALUE</envar> if you want the child processes to run
with some other OOM score adjustment. (<envar>PG_OOM_ADJUST_VALUE</envar>
can also be omitted, in which case it defaults to zero.) If you do not
set <envar>PG_OOM_ADJUST_FILE</envar>, the child processes will run with the
same OOM score adjustment as the postmaster, which is unwise since the
whole point is to ensure that the postmaster has a preferential setting.
これらの設定は、いざという時にpostmasterの子プロセスをOOM killerのターゲットに出来るようにOOMスコア調整を通常のゼロで実行します。
子プロセスを他のOOMスコア調整で実行したい場合には、PG_OOM_ADJUST_VALUE
により別の値にすることが出来ます。
(PG_OOM_ADJUST_VALUE
は省略することが出来て、その場合はデフォルトのゼロになります。)
PG_OOM_ADJUST_FILE
を設定しない場合、子プロセスはpostmasterと同じOOMスコア調整で実行されますが、postmasterが優先される設定にすることが肝心なので、それは賢明とは言えません。
Using huge pages reduces overhead when using large contiguous chunks of
memory, as <productname>PostgreSQL</productname> does, particularly when
using large values of <xref linkend="guc-shared-buffers"/>. To use this
feature in <productname>PostgreSQL</productname> you need a kernel
with <varname>CONFIG_HUGETLBFS=y</varname> and
<varname>CONFIG_HUGETLB_PAGE=y</varname>. You will also have to configure
the operating system to provide enough huge pages of the desired size.
To determine the number of huge pages needed, use the
<command>postgres</command> command to see the value of
<xref linkend="guc-shared-memory-size-in-huge-pages"/>. Note that the
server must be shut down to view this runtime-computed parameter.
This might look like:
PostgreSQLのように、メモリの大きな連続チャンクを使用するとき、特にshared_buffersの値が大きい場合に、huge pagesを使用するとオーバーヘッドが減少します。
PostgreSQLでこの機能を有効にするには、CONFIG_HUGETLBFS=y
およびCONFIG_HUGETLB_PAGE=y
としたカーネルが必要です。
また、要求される十分な量だけhuge pagesを提供するようにオペレーティングシステムを調整する必要があるでしょう。
必要なhuge pages数を決定するには、postgres
コマンドを起動してshared_memory_size_in_huge_pagesの値を調べます。
実行時に計算されたこのパラメータを見るためには、サーバを停止しなければならないことに注意してください。
これは以下のような感じになるでしょう。
$postgres -D $PGDATA -C shared_memory_size_in_huge_pages
3170 $grep ^Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB $ls /sys/kernel/mm/hugepages
hugepages-1048576kB hugepages-2048kB
In this example the default is 2MB, but you can also explicitly request
either 2MB or 1GB with <xref linkend="guc-huge-page-size"/> to adapt
the number of pages calculated by
<varname>shared_memory_size_in_huge_pages</varname>.
この例ではデフォルトは2MBですが、明示的に2MBまたは1GBをhuge_page_sizeで要求して、shared_memory_size_in_huge_pages
で計算されたページ数を調整することもできます。
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 set this with:
この例では少なくとも3170
のhuge pageが必要ですが、マシン上の他のプログラムもhuge pageを必要とする場合には、より大きな設定が適切です。
これは以下のように設定できます。
# sysctl -w vm.nr_hugepages=3170
Don't forget to add this setting to <filename>/etc/sysctl.conf</filename>
so that it is reapplied after reboots. For non-default huge page sizes,
we can instead use:
再起動後にこの設定が行われるように、/etc/sysctl.conf
にこの設定を追加するのを忘れないようにしましょう。
非標準のhuge pageサイズなら、代わりに以下のようにできます。
# echo 3170 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
It is also possible to provide these settings at boot time using
kernel parameters such as <literal>hugepagesz=2M hugepages=3170</literal>.
hugepagesz=2M hugepages=3170
のようにして、起動時にカーネルパラメータとしてこれらの設定を与えることもできます。
Sometimes the kernel is not able to allocate the desired number of huge pages immediately due to fragmentation, so it might be necessary to repeat the command or to reboot. (Immediately after a reboot, most of the machine's memory should be available to convert into huge pages.) To verify the huge page allocation situation for a given size, use: 時には、断片化のためにカーネルは求められた数のhuge pagesを直ちには割り当てることができないことがあるので、そのコマンドを繰り返すか、再起動する必要があるかもしれません。 (再起動の直後は、マシンのメモリの大部分はhuge pagesへの変更が可能なはずです。) 指定サイズに対するhuge pagesの割り当ての状況を確認するには、次のようにします。
$ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
It may also be necessary to give the database server's operating system
user permission to use huge pages by setting
<varname>vm.hugetlb_shm_group</varname> via <application>sysctl</application>, and/or
give permission to lock memory with <command>ulimit -l</command>.
sysctlを使ってvm.hugetlb_shm_group
を設定する、あるいはulimit -l
でメモリをロックする権限を与えることで、データベースサーバのOSユーザにhuge pagesを使用する権限を与える必要もあるかもしれません。
The default behavior for huge pages in
<productname>PostgreSQL</productname> is to use them when possible, with
the system's default huge page size, and
to fall back to normal pages on failure. To enforce the use of huge
pages, you can set <xref linkend="guc-huge-pages"/>
to <literal>on</literal> in <filename>postgresql.conf</filename>.
Note that with this setting <productname>PostgreSQL</productname> will fail to
start if not enough huge pages are available.
PostgreSQLのhuge pagesのデフォルトの動作は、可能な場合はシステムのデフォルトサイズのhuge pagesを使用し、失敗した場合は通常のページを使用します。
postgresql.conf
でhuge_pagesをon
に設定することで、huge pagesの使用を強制することができます。
この設定の場合、十分なhuge pagesが確保できなければ、PostgreSQLの起動に失敗することに注意してください。
For a detailed description of the <productname>Linux</productname> huge pages feature have a look at <ulink url="https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt"></ulink>. Linuxのhuge pages機能の詳細はhttps://www.kernel.org/doc/Documentation/vm/hugetlbpage.txtを参照してください。