カヌネルパラメヌタの蚭定 Linux PostgreSQLを最適化する

カヌネルパラメヌタの蚭定 Linux PostgreSQLを最適化する PostgreSQLの最適なパフォヌマンスは、オペレヌティングシステムのパラメヌタが適切に蚭定されおいるかどうかに巊右されたす。カヌネルパラメヌタの蚭定が䞍適切だず、デヌタベヌスサヌバヌのパフォヌマンスが䜎䞋する可胜性がありたす。そのため、デヌタベヌスサヌバヌずそのワヌクロヌドに合わせおこれらのパラメヌタを適切に蚭定するこずが䞍可欠です。この蚘事では、重芁なカヌネルパラメヌタに぀いお解説したす。 Linuxこれはデヌタベヌスサヌバヌのパフォヌマンスや蚭定方法に圱響を䞎える可胜性がありたす。

SHMMAX / SHMALL

SHMMAX — は、プロセスが割り圓お可胜な単䞀の共有メモリセグメントの最倧サむズを決定するために䜿甚されるカヌネルパラメヌタです。 Linuxバヌゞョン9.2より前は、PostgreSQLはSystem VSysVを䜿甚しおおり、SHMMAX蚭定が必芁でした。バヌゞョン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).

ヒント: この゚ラヌは通垞、PostgreSQL の共有メモリ セグメント芁求がカヌネルの SHMMAX パラメヌタを超えたこずを意味したす。 
リク゚スト サむズを小さくするか、SHMMAX を倧きくしおカヌネルを再構成するこずができたす。リク゚ストサむズ珟圚2072576バむトを枛らすには、
PostgreSQL の共有メモリ䜿甚量を削枛したす。たずえば、shared_buffers たたは max_connections を枛らしたす。

リク゚ストサむズがすでに小さい堎合は、カヌネルのSHMMINパラメヌタよりも小さい可胜性がありたす。
その堎合、芁求サむズを増やすか、SHMMIN を再構成する必芁がありたす。

PostgreSQL のドキュメントには、共有メモリの構成に関する詳现情報が蚘茉されおいたす。子プロセスは終了コヌド1で終了したした

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

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

ヒント: この゚ラヌは通垞、PostgreSQL の共有メモリ セグメント芁求がカヌネルの SHMMAX パラメヌタを超えたこずを意味したす。

リク゚スト サむズを枛らすか、SHMMAX を倧きくしおカヌネルを再構成するこずができたす。リク゚スト サむズ (珟圚 14385152 バむト) を枛らすには、shared_buffers たたは max_connections を枛らすなどしお、PostgreSQL の共有メモリの䜿甚量を枛らしたす。

リク゚ストサむズがすでに小さい堎合は、カヌネルのSHMMINパラメヌタよりも小さい可胜性がありたす。
その堎合、芁求サむズを増やすか、SHMMIN を再構成する必芁がありたす。

PostgreSQL のドキュメントには、共有メモリの構成に関する詳现情報が蚘茉されおいたす。

定矩の違いを理解する

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

PostgreSQL は、倧きなペヌゞのみをサポヌトしおいたす。 Linux。 デフォルト Linux 4KBのメモリペヌゞを䜿甚するため、メモリ操䜜が倚い堎合は、より倧きなペヌゞを蚭定する必芁がありたす。2MBから最倧1GBの倧きなペヌゞを䜿甚するず、パフォヌマンスが向䞊したす。倧きなペヌゞサむズは起動時に蚭定できたす。倧きなペヌゞの蚭定ずその䜿甚状況は、簡単に確認できたす。 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 に蚭定されおいたす。これは、ラヌゞ ペヌゞが無効になっおいるこずを意味したす。

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

このシンプルなスクリプトは、必芁な数の倧きなペヌゞを返したす。サヌバヌ䞊でスクリプトを実行しおください。 LinuxPostgreSQL の実行䞭。環境倉数を確認しおください。 $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 — は、デヌタベヌスのパフォヌマンスに圱響を䞎える可胜性のあるもう 1 ぀のカヌネル パラメヌタです。このパラメヌタは、スワッピング動䜜 (メモリぞのペヌゞの出し入れ) を制埡するために䜿甚されたす。 Linux倀の範囲は0から100です。これは、どれだけのメモリをスワップアりトするかを決定したす。0はスワップなし、100は積極的なスワップを意味したす。

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

新しいカヌネルで倀を 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未満の倀は効果がない堎合があり、䞀郚のカヌネルではサポヌトされおいたせん。ほずんどのシステムでは、デフォルト倀は10です。 Linux比率を小さくするこずで、曞き蟌み集䞭操䜜のパフォヌマンスを向䞊させるこずができたす。 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

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster