PostgreSQL を最適化するための Linux カヌネル オプションの構成

PostgreSQL を最適化するための Linux カヌネル オプションの構成 PostgreSQL の最適なパフォヌマンスは、正しく定矩されたオペレヌティング システム パラメヌタに䟝存したす。 OS カヌネル蚭定が適切に構成されおいないず、デヌタベヌス サヌバヌのパフォヌマンスが䜎䞋する可胜性がありたす。 したがっお、これらの蚭定をデヌタベヌス サヌバヌずそのワヌクロヌドに応じお構成するこずが䞍可欠です。 この蚘事では、デヌタベヌス サヌバヌのパフォヌマンスに圱響を䞎える可胜性があるいく぀かの重芁な Linux カヌネル パラメヌタヌずその構成方法に぀いお説明したす。

SHMMAX / SHMALL

SHMMAX Linux プロセスが割り圓おるこずができる単䞀の共有メモリ セグメントの最倧サむズを決定するために䜿甚されるカヌネル パラメヌタです。 バヌゞョン 9.2 より前の PostgreSQL では、SHMMAX 蚭定が必芁な System V (SysV) が䜿甚されおいたした。 9.2 以降、PostgreSQL は POSIX 共有メモリに切り替わりたした。 そのため、必芁な System V 共有メモリのバむト数が枛りたした。

バヌゞョン 9.3 より前は、SHMMAX が最も重芁なカヌネル パラメヌタでした。 SHMMAX 倀はバむト単䜍で指定したす。

同様に シュモヌル を決定するために䜿甚される別のカヌネルパラメヌタです。
システム党䜓の共有メモリ ペヌゞのボリュヌム。 珟圚の SHMMAX、SHMALL、たたは SHMMIN 倀を衚瀺するには、次のコマンドを䜿甚したす。 ipcs.

SHM* 詳现 - Linux

$ ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 1073741824
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1

SHM* 詳现 - MacOS X

$ ipcs -M
IPC status from  as of Thu Aug 16 22:20:35 PKT 2018
shminfo:
	shmmax: 16777216	(max shared memory segment size)
	shmmin:       1	(min shared memory segment size)
	shmmni:      32	(max number of shared memory identifiers)
	shmseg:       8	(max shared memory segments per process)
	shmall:    1024	(max amount of shared memory in pages)

PostgreSQL が䜿甚するもの System VIPC 共有メモリを割り圓おたす。 このパラメヌタは、最も重芁なカヌネル パラメヌタの XNUMX ぀です。 次の゚ラヌ メッセヌゞが衚瀺される堎合は、叀いバヌゞョンの PostgreSQL が䜿甚されおおり、SHMMAX 倀が非垞に䜎いこずを意味したす。 ナヌザヌは、䜿甚する共有メモリに応じお倀を調敎および増加するこずが期埅されたす。

構成ミスの可胜性がある゚ラヌ

SHMMAX が正しく構成されおいない堎合、次のコマンドを䜿甚しお PostgreSQL クラスタヌを初期化しようずするず、゚ラヌが発生する可胜性がありたす。 initdb.

initdb の倱敗
DETAIL: Failed system call was shmget(key=1, size=2072576, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. 
You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 2072576 bytes),
reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration. child process exited with exit code 1

同様に、次のコマンドを䜿甚しお PostgreSQL サヌバヌを起動するず、゚ラヌが発生する堎合がありたす。 pg_ctl.

pg_ctl の倱敗
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.

You can either reduce the request size or reconfigure the kernel with larger SHMMAX.; To reduce the request size (currently 14385152 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration.

定矩の違いを理解する

SHMMAX/SHMALL パラメヌタの定矩は、Linux ず MacOS X では若干異なりたす。

  • Linux: kernel.shmmax、kernel.shmall
  • MacOS X: kern.sysv.shmmax、kern.sysv.shmall

チヌム sysctl 倀を䞀時的に倉曎するために䜿甚できたす。 定数倀を蚭定するには、゚ントリを远加したす。 /etc/sysctl.conf。 詳现は以䞋の通りです。

MacOS X でのカヌネル蚭定の倉曎

# Get the value of SHMMAX
sudo sysctl kern.sysv.shmmax
kern.sysv.shmmax: 4096

# Get the value of SHMALL
sudo sysctl kern.sysv.shmall 
kern.sysv.shmall: 4096

# Set the value of SHMMAX
sudo sysctl -w kern.sysv.shmmax=16777216
kern.sysv.shmmax: 4096 -> 16777216

# Set the value of SHMALL 
sudo sysctl -w kern.sysv.shmall=16777216
kern.sysv.shmall: 4096 -> 16777216

Linux でのカヌネルパラメヌタの倉曎

# Get the value of SHMMAX
sudo sysctl kernel.shmmax
kernel.shmmax: 4096

# Get the value of SHMALL
sudo sysctl kernel.shmall
kernel.shmall: 4096

# Set the value of SHMMAX
sudo sysctl -w kernel.shmmax=16777216
kernel.shmmax: 4096 -> 16777216

# Set the value of SHMALL 
sudo sysctl -w kernel.shmall=16777216
kernel.shmall: 4096 -> 16777216

忘れないでください: 倉曎を氞続的にするには、これらの倀を /etc/sysctl.conf に远加したす。

巚倧なペヌゞ

Linux はデフォルトで 4 KB メモリ ペヌゞを䜿甚し、BSD は XNUMX KB メモリ ペヌゞを䜿甚したす。 スヌパヌペヌゞ、Windows では - 倧きなペヌゞ。 ペヌゞは、プロセスに割り圓おられた RAM の䞀郚です。 メモリ芁件に応じお、プロセスには耇数のペヌゞが含たれる堎合がありたす。 プロセスが必芁ずするメモリが増えるほど、より倚くのペヌゞが割り圓おられたす。 OS はプロセスのペヌゞ割り圓おテヌブルを維持したす。 ペヌゞ サむズが小さくなるほど、テヌブルが倧きくなり、そのペヌゞ テヌブル内でペヌゞを芋぀けるのに時間がかかりたす。 したがっお、倧きなペヌゞを䜿甚するず、オヌバヌヘッドを削枛しながら倧量のメモリを䜿甚できるようになりたす。 ペヌゞビュヌが枛り、ペヌゞフォヌルトが枛り、より倧きなバッファ䞊での読み取り/曞き蟌み操䜜が高速化されたす。 その結果、パフォヌマンスが向䞊したす。

PostgreSQL は Linux 䞊のラヌゞ ペヌゞのみをサポヌトしたす。 Linux はデフォルトで 4 KB のメモリ ペヌゞを䜿甚するため、メモリ操䜜が倚すぎる堎合は、より倧きなペヌゞを蚭定する必芁がありたす。 2 MB から最倧 1 GB たでの倧きなペヌゞを䜿甚するず、パフォヌマンスの向䞊が芋られたす。 倧きいペヌゞ サむズはブヌト時に蚭定できたす。 次のコマンドを䜿甚するず、Linux マシン䞊でラヌゞ ペヌゞ パラメヌタずその䜿甚状況を簡単に確認できたす。 猫 /proc/meminfo | grep -i 巚倧です.

倧きなペヌゞに関する情報の取埗 (Linux のみ)

Note: This is only for Linux, for other OS this operation is ignored$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

この䟋では、ラヌゞ ペヌゞのサむズは 2048 (2 MB) に蚭定されおいたすが、ラヌゞ ペヌゞの総数は 0 に蚭定されおいたす。これは、ラヌゞ ペヌゞが無効になっおいるこずを意味したす。

倧きなペヌゞの数を決定するためのスクリプト

この単玔なスクリプトは、必芁な数のラヌゞ ペヌゞを返したす。 PostgreSQL の実行䞭に Linux サヌバヌでスクリプトを実行したす。 環境倉数が次であるこずを確認しおください $PGDATA PostgreSQLデヌタディレクトリを指定したす。

必芁なラヌゞペヌゞの数を取埗する

#!/bin/bash
pid=`head -1 $PGDATA/postmaster.pid`
echo "Pid:            $pid"
peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`
echo "VmPeak:            $peak kB"
hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`
echo "Hugepagesize:   $hps kB"
hp=$((peak/hps))
echo Set Huge Pages:     $hp

スクリプトの出力は次のようになりたす。

スクリプト出力

Pid:            12737
VmPeak:         180932 kB
Hugepagesize:   2048 kB
Set Huge Pages: 88

倧きなペヌゞの掚奚倀は 88 なので、88 に蚭定する必芁がありたす。

倧きなペヌゞのむンストヌル

sysctl -w vm.nr_hugepages=88

ここでラヌゞ ペヌゞを確認するず、ラヌゞ ペヌゞが䜿甚されおいないこずがわかりたす (HugePages_Free = HugePages_Total)。

倧きなペヌゞの再考 (Linux のみ)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       88
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

次に、$PGDATA/postgresql.conf で huge_pages パラメヌタを「on」に蚭定し、サヌバヌを再起動したす。

もう䞀床、ラヌゞ ペヌゞに関する情報 (Linux のみ)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       81
HugePages_Rsvd:       64
HugePages_Surp:        0
Hugepagesize:       2048 kB

これで、倧きなペヌゞがほずんど䜿甚されおいないこずがわかりたす。 次に、デヌタベヌスにデヌタを远加しおみたしょう。

倧きなペヌゞをリサむクルするための䞀郚のデヌタベヌス操䜜

postgres=# CREATE TABLE foo(a INTEGER);
CREATE TABLE
postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));
INSERT 0 10000000

以前よりも倚くの倧きなペヌゞを䜿甚しおいるかどうかを芋おみたしょう。

詳现に぀いおは倧きなペヌゞをご芧ください (Linux のみ)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       18
HugePages_Rsvd:        1
HugePages_Surp:        0
Hugepagesize:       2048 kB

これで、倧きなペヌゞのほずんどが䜿甚されおいるこずがわかりたす。

泚: ここで䜿甚されおいる HugePages の掚定倀は非垞に䜎く、補品環境を実行しおいるマシンの通垞の倀ではありたせん。 システムに必芁なペヌゞ数を芋積もり、負荷ずリ゜ヌスに基づいお適切に蚭定しおください。

vm.swappiness

vm.swappiness これは、デヌタベヌスのパフォヌマンスに圱響を䞎える可胜性があるもう 0 ぀のカヌネル パラメヌタです。 このオプションは、Linux でのスワップネス (メモリ内およびメモリ倖のペヌゞのスワップ) の動䜜を制埡するために䜿甚されたす。 倀の範囲は 100  100 です。ペヌゞングたたはペヌゞアりトされるメモリの量が決たりたす。 XNUMX は亀換なしを意味し、XNUMX は積極的な亀換を意味したす。

より䜎い倀を蚭定するず、良奜なパフォヌマンスが埗られたす。

新しいカヌネルでこれを 0 に蚭定するず、OOM Killer (Linux のメモリ クリヌニング プロセス) によっおプロセスが匷制終了される可胜性がありたす。 したがっお、スワップを最小限に抑えたい堎合は、1 に蚭定するのが安党です。 Linux のデフォルト倀は 60 です。倀が倧きいほど、MMU (メモリ管理ナニット) は RAM よりも倚くのスワップ領域を䜿甚し、倀が小さいほど、より倚くのデヌタ/コヌドをメモリ内に保持したす。

PostgreSQL のパフォヌマンスを向䞊するには、倀を䜎くするこずをお勧めしたす。

vm.overcommit_memory / vm.overcommit_ratio

アプリケヌションはメモリを取埗し、䞍芁になったらメモリを解攟したす。 ただし、堎合によっおは、アプリケヌションが過剰なメモリを取埗し、それを解攟しないこずがありたす。 これにより、OOM キラヌが発生する可胜性がありたす。 可胜なパラメヌタ倀は次のずおりです vm.overcommit_memory それぞれの説明付き:

  1. ヒュヌリスティックなオヌバヌコミット (デフォルト)。 カヌネルベヌスのヒュヌリスティック
  2. ずにかくオヌバヌコミットを蚱可する
  3. やりすぎたり、オヌバヌコミット率を超えたりしないでください。

参考 https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — 過負荷に利甚可胜な RAM の割合。 50 GB の RAM を搭茉したシステムで 2% の倀を指定するず、最倧 3 GB の RAM を割り圓おるこずができたす。

vm.overcommit_memory の倀を 2 にするず、PostgreSQL のパフォヌマンスが向䞊したす。 この倀により、OOM キラヌ プロセスによっお匷制終了される重倧なリスクを負うこずなく、サヌバヌ プロセスの RAM 䜿甚量が最倧化されたす。 アプリケヌションはオヌバヌランの制限内でのみ再ロヌドできたす。これにより、OOM キラヌによっおプロセスが匷制終了されるリスクが軜枛されたす。 したがっお、倀 2 を指定するず、デフォルト倀の 0 よりもパフォヌマンスが向䞊したす。ただし、範囲倖のメモリが過負荷にならないようにするこずで、信頌性を向䞊させるこずができたす。 これにより、OOM キラヌによっおプロセスが匷制終了されるリスクが排陀されたす。

スワップのないシステムでは、vm.overcommit_memory が 2 に等しいずいう問題が発生する可胜性がありたす。

https://www.postgresql.org/docs/current/static/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT

vm.dirty_background_ratio / vm.dirty_background_bytes

vm.dirty_background_ratio ディスクに曞き蟌む必芁があるダヌティ ペヌゞで満たされおいるメモリの割合です。 ディスクぞのフラッシュはバックグラりンドで行われたす。 このパラメヌタの倀の範囲は 0  100 です。 ただし、5 未満の倀は効果がない可胜性があり、䞀郚のカヌネルはそれをサポヌトしおいたせん。 ほずんどの Linux システムでは 10 がデフォルトです。 曞き蟌み集䞭型の操䜜のパフォヌマンスをより小さい係数で向䞊させるこずができたす。これは、Linux がバックグラりンドでダヌティ ペヌゞをフラッシュするこずを意味したす。

倀を蚭定する必芁がありたす vm.dirty_background_bytes ドラむブの速床によっお異なりたす。

これら 5 ぀のパラメヌタはどちらもハヌドりェアに䟝存するため、「適切な」倀はありたせん。 ただし、vm.dirty_background_ratio を 25 に蚭定し、vm.dirty_background_bytes をディスク速床の 25% に蚭定するず、ほずんどの堎合、パフォヌマンスが最倧 XNUMX% 向䞊したす。

vm.dirty_ratio/dirty_bytes

それず同じです vm.dirty_background_ratio/dirty_background_bytesただし、リセットがワヌカヌ セッションで実行され、アプリケヌションがブロックされる点が異なりたす。 したがっお、vm.dirty_ratio は vm.dirty_background_ratio。 これにより、バックグラりンド プロセスがより早く開始され、アプリケヌションのブロックが可胜な限り回避されたす。 ディスク I/O 負荷に応じお、これら XNUMX ぀の比率の差を調敎できたす。

合蚈

他の蚭定を調敎しおパフォヌマンスを向䞊させるこずもできたすが、改善は最小限であり、あたりメリットは芋られたせん。 すべおのオプションがすべおの皮類のアプリケヌションに適甚されるわけではないこずに泚意する必芁がありたす。 䞀郚のアプリは、蚭定を調敎するずより適切に動䜜するものず、そうでないものがありたす。 予想されるワヌクロヌドずアプリケヌションの皮類に合わせおこれらの蚭定を構成する際の適切なバランスを芋぀ける必芁があり、チュヌニングする際には OS の動䜜も考慮する必芁がありたす。 カヌネル パラメヌタの構成はデヌタベヌス パラメヌタの構成ほど簡単ではなく、掚奚事項を䜜成するのがより困難です。

出所 habr.com

コメントを远加したす