Ngonfigurasi parameter kernel Linux kanggo ngoptimalake PostgreSQL

Ngonfigurasi parameter kernel Linux kanggo ngoptimalake PostgreSQL Kinerja PostgreSQL sing optimal gumantung saka parameter sistem operasi sing dikonfigurasi kanthi bener. Parameter kernel sing dikonfigurasi kanthi ora apik bisa nyebabake kinerja server basis data sing mudhun. Mulane, penting kanggo ngonfigurasi parameter kasebut kanthi tepat kanggo server basis data lan beban kerjane. Ing postingan iki, kita bakal ngrembug sawetara parameter kernel sing penting. Linux, sing bisa mengaruhi kinerja server basis data lan cara ngonfigurasine.

SHMMAX / SHMALL

SHMMAX — minangka parameter kernel sing digunakake kanggo nemtokake ukuran maksimal segmen memori sing dienggo bareng sing bisa dialokasikan dening proses. LinuxSadurunge versi 9.2, PostgreSQL nggunakake System V (SysV), sing mbutuhake setelan SHMMAX. Sawise 9.2, PostgreSQL ganti menyang memori bareng POSIX. Iki tegese luwih sithik byte memori bareng System V sing dibutuhake saiki.

Sadurunge versi 9.3, SHMMAX minangka parameter kernel sing paling penting. Nilai SHMMAX ditemtokake ing bita.

Kajaba iku SHMALL punika parameter kernel liyane digunakake kanggo nemtokake
volume saka sudhut sistem kaca memori sing dienggo bareng. Kanggo ndeleng nilai SHMMAX, SHMALL, utawa SHMMIN saiki, gunakake perintah kasebut ipcs.

Rincian 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* Rincian - 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 nggunakake Sistem V IPC kanggo ngalokasi memori sing dienggo bareng. Parameter iki minangka salah sawijining parameter kernel sing paling penting. Saben sampeyan nampa pesen kesalahan ing ngisor iki, tegese sampeyan duwe versi PostgreSQL lawas lan nilai SHMMAX sampeyan sithik banget. Pangguna wis samesthine kanggo nyetel lan nambah nilai miturut memori sambungan sing arep digunakake.

Kemungkinan kesalahan konfigurasi

Yen SHMMAX ora dikonfigurasi kanthi bener, sampeyan bisa nampa kesalahan nalika nyoba miwiti kluster PostgreSQL nggunakake perintah kasebut. initdb.

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

Petunjuk: Kesalahan iki biasane tegese panjaluk PostgreSQL kanggo bagean memori sing dienggo bareng ngluwihi parameter SHMMAX kernel sampeyan. 
Sampeyan bisa nyuda ukuran panyuwunan utawa ngatur ulang kernel kanthi SHMMAX luwih gedhe. Kanggo nyuda ukuran panyuwunan (saiki 2072576 bita),
nyuda panggunaan memori sambungan PostgreSQL, mbok menawa kanthi nyuda shared_buffers utawa max_connections.

Yen ukuran panjalukan wis cilik, bisa uga kurang saka parameter SHMMIN kernel sampeyan,
ing kasus iki mundhakaken ukuran request utawa reconfiguring SHMMIN diarani.

Dokumentasi PostgreSQL ngemot informasi luwih lengkap babagan konfigurasi memori sing dienggo bareng. proses anak metu karo kode metu 1

Kajaba iku, sampeyan bisa uga nampa kesalahan nalika miwiti server PostgreSQL nggunakake printah kasebut pg_ctl.

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

Petunjuk: Kesalahan iki biasane tegese panjaluk PostgreSQL kanggo bagean memori sing dienggo bareng ngluwihi parameter SHMMAX kernel sampeyan.

Sampeyan bisa uga nyuda ukuran request utawa reconfigure kernel karo SHMMAX luwih gedhe.; Kanggo nyuda ukuran panjalukan (saiki 14385152 bita), nyuda panggunaan memori bareng PostgreSQL, mbok menawa kanthi nyuda shared_buffers utawa max_connections.

Yen ukuran panjalukan wis cilik, bisa uga kurang saka parameter SHMMIN kernel sampeyan,
ing kasus iki mundhakaken ukuran request utawa reconfiguring SHMMIN diarani.

Dokumentasi PostgreSQL ngemot informasi luwih lengkap babagan konfigurasi memori sing dienggo bareng.

Ngerteni bedane definisi

Definisi parameter SHMMAX/SHMALL rada beda ing Linux lan MacOS X:

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

tim sysctl bisa digunakake kanggo ngganti nilai sementara. Kanggo nyetel nilai pancet, nambah entri menyang /etc/sysctl.conf. Rincian ing ngisor iki.

Ngganti Setelan Kernel ing 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

Ngganti parameter kernel aktif 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

Aja lali: Kanggo nggawe owahan permanen, nambah nilai iki kanggo /etc/sysctl.conf

Ageng Kaca

В Linux Sacara standar, kaca memori 4 KB digunakake, ing BSD - Kaca Super, lan ing Windows - Kaca Gedhe. Kaca minangka potongan RAM sing diparengake kanggo proses. Proses bisa duwe pirang-pirang kaca gumantung saka syarat memori. Luwih akeh memori sing dibutuhake proses, luwih akeh kaca sing diparengake. OS njaga tabel alokasi kaca kanggo proses. Ukuran kaca sing luwih cilik, luwih gedhe tabel, luwih suwe kanggo nemokake kaca ing tabel kaca kasebut. Kaca-kaca gedhe mula ngidini akeh memori digunakake kanthi overhead sing suda; tampilan kaca luwih sithik, kesalahan kaca luwih sithik, operasi maca / nulis luwih cepet tinimbang buffer sing luwih gedhe. Asil punika kinerja apik.

PostgreSQL mung ndhukung kaca gedhe ing Linux. Default Linux migunakake 4 KB kaca memori, mula ing kasus nalika ana akeh operasi memori, perlu nyetel kaca sing luwih gedhe. Peningkatan kinerja diamati nalika nggunakake kaca gedhe 2 MB lan nganti 1 GB. Ukuran kaca gedhe bisa disetel nalika boot. Sampeyan bisa kanthi gampang mriksa setelan kaca gedhe lan panggunaane ing komputer sampeyan. Linux-komputer nggunakake printah cat /proc/meminfo | grep -i ageng.

Entuk informasi babagan kaca gedhe (mung ing 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

Ing conto iki, sanajan ukuran kaca gedhe disetel dadi 2048 (2 MB), jumlah total kaca gedhe disetel dadi 0. Iki tegese kaca gedhe dipateni.

Skrip kanggo nemtokake jumlah kaca gedhe

Skrip prasaja iki ngasilake jumlah kaca gedhe sing dibutuhake. Jalanake skrip ing server sampeyan. Linuxnalika PostgreSQL lagi mlaku. Priksa manawa variabel lingkungan $PGDATA Direktori data PostgreSQL ditemtokake.

Entuk jumlah kaca gedhe sing dibutuhake

#!/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

Output skrip katon kaya iki:

Output skrip

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

Nilai sing disaranake kanggo kaca gedhe yaiku 88, dadi sampeyan kudu nyetel menyang 88.

Nginstal Kaca Gedhe

sysctl -w vm.nr_hugepages=88

Priksa kaca gedhe saiki, sampeyan bakal weruh manawa kaca gedhe ora digunakake (HugePages_Free = HugePages_Total).

Informasi luwih lengkap babagan kaca gedhe (mung ing 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

Saiki nyetel parameter huge_pages menyang "on" ing $PGDATA/postgresql.conf lan miwiti maneh server.

Lan maneh informasi babagan kaca gedhe (mung ing 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

Saiki sampeyan bisa ndeleng manawa sawetara kaca gedhe sing digunakake. Ayo saiki nyoba nambah sawetara data menyang database.

Sawetara operasi database kanggo daur ulang kaca gedhe

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

Ayo ndeleng apa kita nggunakake kaca luwih gedhe saiki tinimbang sadurunge.

Sepisan maneh informasi babagan kaca gedhe (mung ing 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

Saiki sampeyan bisa ndeleng manawa umume kaca gedhe digunakake.

Cathetan: Nilai kira-kira kanggo HugePages sing digunakake ing kene sithik banget, sing dudu nilai normal kanggo mesin sing mbukak lingkungan produk. Mangga kira-kira jumlah kaca sing dibutuhake kanggo sistem sampeyan lan atur miturut muatan lan sumber daya.

vm.swappiness

vm.swappiness — minangka parameter kernel liyané sing bisa mengaruhi kinerja basis data. Parameter iki digunakaké kanggo ngontrol prilaku swapping (swapping kaca menyang lan metu saka memori) ing LinuxNilaine antara 0 nganti 100. Iki nemtokake pira memori sing bakal diganti utawa diganti. Nol tegese ora ana sing diganti, lan 100 tegese ijol-ijolan sing agresif.

Sampeyan bisa entuk kinerja apik kanthi nyetel nilai sing luwih murah.

Nyetel nilai dadi 0 ing kernel sing luwih anyar bisa nyebabake OOM Killer (proses pembersihan memori ing Linux) bakal mateni proses kasebut. Dadi, aman nyetel nilai dadi 1 yen sampeyan pengin nyuda swapping. Nilai standar yaiku Linux - 60. Nilai sing luwih dhuwur nyebabake MMU (unit manajemen memori) nggunakake papan swap luwih akeh tinimbang RAM, dene nilai sing luwih endhek nyimpen luwih akeh data/kode ing memori.

Nilai sing luwih murah minangka taruhan sing apik kanggo ningkatake kinerja ing PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Aplikasi entuk memori lan ngeculake yen ora dibutuhake maneh. Nanging ing sawetara kasus, aplikasi entuk akeh memori lan ora ngeculake. Iki bisa nyebabake pembunuh OOM. Iki minangka nilai parameter sing bisa ditindakake vm.overcommit_memory kanthi katrangan kanggo saben:

  1. Heuristik overcommit (standar); heuristik berbasis kernel
  2. Allow overcommit wae
  3. Aja kakehan, aja ngluwihi rasio overcommit.

Wigati: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio - persentasi saka RAM kasedhiya kanggo kakehan. Nilai 50% ing sistem kanthi 2 GB RAM bisa nyedhiyakake nganti 3 GB RAM.

Nilai 2 kanggo vm.overcommit_memory nyedhiyakake kinerja sing luwih apik kanggo PostgreSQL. Nilai iki nggedhekake panggunaan RAM proses server tanpa ana risiko sing bisa dipateni dening proses pembunuh OOM. Aplikasi kasebut bakal bisa diisi ulang, nanging mung ing watesan overrun, sing nyuda risiko pembunuh OOM sing mateni proses kasebut. Mulane, nilai 2 menehi kinerja sing luwih apik tinimbang nilai standar 0. Nanging, linuwih bisa nambah kanthi mesthekake yen memori metu saka sawetara ora overloaded. Iki ngilangi risiko proses sing dipateni dening pembunuh OOM.

Ing sistem tanpa swapping, masalah karo vm.overcommit_memory witjaksono kanggo 2 bisa kelakon.

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 — Iki persentase memori sing kebak kaca reged sing kudu di-flush menyang disk. Flushing iki kedadeyan ing latar mburi. Nilai parameter iki kisarane saka 0 nganti 100; nanging, nilai ing ngisor 5 bisa uga ora efektif, lan sawetara kernel ora ndhukung. 10 minangka nilai standar ing umume sistem. LinuxSampeyan bisa ningkatake kinerja kanggo operasi intensif tulis kanthi rasio sing luwih cilik, sing tegese Linux bakal mbuwang kaca reged ing latar mburi.

Sampeyan kudu nyetel nilai vm.dirty_background_bytes gumantung saka kacepetan drive sampeyan.

Ora ana nilai "apik" kanggo rong paramèter iki amarga loro-lorone gumantung karo hardware. Nanging, nyetel vm.dirty_background_ratio kanggo 5 lan vm.dirty_background_bytes kanggo 25% saka kacepetan disk nambah kinerja kanggo ~ 25% ing paling kasus.

vm.dirty_ratio/dirty_bytes

Iki padha karo vm.dirty_background_ratio/dirty_background_bytes, kajaba reset ditindakake ing sesi buruh, ngalangi aplikasi kasebut. Mulane vm.dirty_ratio kudu luwih dhuwur tinimbang vm.dirty_background_ratio. Iki mesthekake yen proses latar mburi diwiwiti luwih awal supaya ora ngalangi aplikasi sabisa-bisa. Sampeyan bisa nyetel prabédan antarane loro rasio iki gumantung ing mbukak I / O disk.

Asile

Sampeyan bisa ngapiki setelan liyane kanggo nambah kinerja, nanging dandan bakal minimal lan sampeyan ora bakal entuk manfaat akeh. Kita kudu eling yen ora kabeh opsi ditrapake kanggo kabeh jinis aplikasi. Sawetara app bisa luwih apik nalika kita nyetel sawetara setelan, lan sawetara ora. Sampeyan kudu golek imbangan tengen antarane configuring setelan iki kanggo beban kerja samesthine lan jinis aplikasi, lan sampeyan uga kudu nimbang prilaku OS nalika tuning. Ngonfigurasi paramèter kernel ora segampang ngonfigurasi paramèter database; luwih angel kanggo menehi rekomendasi.

Source: www.habr.com

Tuku hosting sing dipercaya kanggo situs kanthi proteksi DDoS, server VPS VDS 🔥 Tuku hosting situs web sing bisa dipercaya nganggo proteksi DDoS, server VPS VDS | ProHoster