Ngonpigurasikeun Pilihan Kernel Linux pikeun Optimalkeun PostgreSQL

Ngonpigurasikeun Pilihan Kernel Linux pikeun Optimalkeun PostgreSQL Kinerja PostgreSQL optimal gumantung kana parameter sistem operasi anu didefinisikeun leres. Setélan kernel OS anu henteu dikonpigurasi tiasa nyababkeun kinerja server database anu goréng. Ku sabab éta, penting pisan yén setélan ieu dikonpigurasi dumasar kana pangladén database sareng beban kerjana. Dina postingan ieu, urang bakal ngabahas sababaraha parameter kernel Linux penting anu tiasa mangaruhan kinerja server database sareng kumaha ngonpigurasikeunana.

SHMMAX / SHMALL

SHMMAX mangrupakeun parameter kernel dipaké pikeun nangtukeun ukuran maksimum hiji bagean memori dibagikeun tunggal nu hiji prosés Linux Ubuntu bisa allocate. Saacanna versi 9.2, PostgreSQL dipaké System V (SysV), nu merlukeun setelan SHMMAX. Saatos 9.2, PostgreSQL ngalih ka mémori anu dibagi POSIX. Janten ayeuna langkung seueur bait tina mémori dibagikeun System V diperyogikeun.

Sateuacan versi 9.3, SHMMAX mangrupikeun parameter kernel anu paling penting. Nilai SHMMAX dieusian dina bait.

Kitu oge SAMBAL nyaeta parameter kernel sejen dipaké pikeun nangtukeun
volume sistem-lega kaca memori dibagikeun. Pikeun ningali nilai SHMMAX, SHMALL, atanapi SHMMIN ayeuna, paké paréntahna ipcs.

SHM* Rincian - 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 ngagunakeun Sistem V IPC pikeun allocate memori dibagikeun. Parameter ieu mangrupikeun salah sahiji parameter kernel anu paling penting. Iraha waé anjeun nampi pesen kasalahan di handap ieu, éta hartosna anjeun gaduh versi PostgreSQL anu langkung lami sareng nilai SHMMAX anjeun rendah pisan. Pamaké diharepkeun nyaluyukeun jeung ningkatkeun nilai nurutkeun memori dibagikeun aranjeunna maksudna ngagunakeun.

Kasalahan salah konfigurasi kamungkinan

Upami SHMMAX henteu dikonpigurasi leres, anjeun tiasa nampi kasalahan nalika nyobian ngamimitian klaster PostgreSQL nganggo paréntah. initdb.

initdb Gagal
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

Kitu ogé, anjeun tiasa nampi kasalahan nalika ngamimitian server PostgreSQL nganggo paréntah pg_ctl.

pg_ctl Gagalna
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.

Ngartos bédana definisi

Nangtukeun parameter SHMMAX/SHMALL rada béda dina Linux jeung MacOS X:

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

regu sysctl bisa dipaké pikeun ngarobah samentara nilai. Pikeun nyetel nilai konstan, tambahkeun entri ka /etc/sysctl.conf. Rincian aya di handap.

Ngarobih Setélan Kernel dina 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

Ngarobah Parameter Kernel dina 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

Entong hilap: Pikeun nyieun parobahan permanén, tambahkeun nilai ieu /etc/sysctl.conf

Kaca badag

Linux nganggo 4 halaman mémori KB sacara standar, BSD nganggo halaman mémori XNUMX KB. Kaca Super, sareng dina Windows - Kaca badag. Kaca mangrupa sapotong RAM disadiakeun pikeun prosés. Hiji prosés tiasa gaduh sababaraha halaman gumantung kana sarat mémori. Beuki memori hiji prosés merlukeun, beuki kaca eta disadiakeun. OS ngajaga tabel alokasi halaman pikeun prosés. Nu leuwih leutik ukuran kaca, nu leuwih badag tabel, nu lila waktu nu diperlukeun pikeun manggihan hiji kaca dina tabel kaca eta. Kaca badag sahingga ngidinan jumlah badag memori bisa dipaké kalawan ngurangan overhead; pangsaeutikna pintonan kaca, pangsaeutikna kaca faults, gancang maca / nulis operasi leuwih panyangga badag. Hasilna ningkat kinerja.

PostgreSQL ngan ukur ngadukung halaman ageung dina Linux. Sacara standar, Linux nganggo 4 halaman mémori KB, ku kituna dina kasus dimana seueur teuing operasi mémori, peryogi nyetél halaman anu langkung ageung. gains kinerja dititénan lamun ngagunakeun kaca badag 2 MB sarta nepi ka 1 GB. Ukuran halaman ageung tiasa disetél dina waktos boot. Anjeun tiasa sacara gampil pariksa parameter halaman ageung sareng panggunaanana dina mesin Linux anjeun nganggo paréntah ucing /proc/meminfo | grep -i badag.

Kéngingkeun inpormasi ngeunaan halaman ageung (Linux hungkul)

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

Dina conto ieu, sanajan ukuran kaca badag disetel ka 2048 (2 MB), jumlah total kaca badag disetel ka 0. Ieu ngandung harti yén kaca badag ditumpurkeun.

Aksara pikeun nangtukeun jumlah kaca badag

Skrip saderhana ieu ngabalikeun jumlah halaman ageung anu diperyogikeun. Jalankeun skrip dina server Linux anjeun nalika PostgreSQL dijalankeun. Pastikeun yén pikeun variabel lingkungan $PGDATA Diréktori data PostgreSQL dieusian.

Kéngingkeun jumlah halaman ageung anu diperyogikeun

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

Kaluaran skrip sapertos kieu:

Kaluaran naskah

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

Nilai anu disarankeun pikeun halaman ageung nyaéta 88, janten anjeun kedah nyetél ka 88.

Masang Kaca ageung

sysctl -w vm.nr_hugepages=88

Pariksa kaca badag ayeuna, anjeun bakal nempo yén kaca badag teu dipaké (HugePages_Free = HugePages_Total).

Kaca ageung Didatangan deui (Linux Ngan)

$ 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

Ayeuna atur parameter huge_pages ka "on" dina $PGDATA/postgresql.conf sareng balikan deui server.

Sakali deui, inpormasi ngeunaan halaman ageung (Linux hungkul)

$ 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

Ayeuna anjeun tiasa ningali yén sakedik pisan halaman ageung anu dianggo. Hayu urang ayeuna coba pikeun nambahkeun sababaraha data kana database.

Sababaraha operasi database pikeun ngadaur mulangkeunana kaca badag

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

Hayu urang tingali naha urang nganggo halaman anu langkung ageung ayeuna tibatan sateuacanna.

Langkung seueur inpormasi ngeunaan halaman ageung (Linux hungkul)

$ 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

Ayeuna anjeun tiasa ningali yén kalolobaan halaman ageung dianggo.

Catetan: Estimasi nilai pikeun HugePages dipaké di dieu pisan low, nu lain nilai normal pikeun mesin ngajalankeun lingkungan produk. Punten estimasi jumlah halaman anu diperyogikeun pikeun sistem anjeun sareng setel sasuai dumasar kana beban sareng sumber.

vm.swappiness

vm.swappiness nyaeta parameter kernel sejen nu bisa mangaruhan kinerja database. Pilihan ieu dipaké pikeun ngadalikeun paripolah swappiness (swapping kaca asup jeung kaluar memori) dina Linux Ubuntu. Nilaina dibasajankeun 0 nepi ka 100. Ieu nangtukeun sabaraha memori bakal paged atanapi paged kaluar. Nol hartina euweuh bursa jeung 100 hartina bursa agrésif.

Anjeun tiasa kéngingkeun kinerja anu saé ku netepkeun nilai anu langkung handap.

Nyetél ieu ka 0 dina kernel anu langkung énggal tiasa nyababkeun OOM Killer (prosés beberesih mémori Linux) maéhan prosésna. Janten aman pikeun nyetél ka 1 upami anjeun hoyong ngaleutikan swapping. Nilai standar dina Linux Ubuntu nyaeta 60. A nilai luhur ngabalukarkeun MMU (unit manajemén memori) ngagunakeun spasi swap leuwih ti RAM, bari nilai handap ngajaga leuwih data / kode dina mémori.

Nilai anu langkung handap mangrupikeun alungan anu saé pikeun ningkat prestasi dina PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Aplikasi meunangkeun mémori sareng ngaleupaskeun nalika henteu diperyogikeun deui. Tapi dina sababaraha kasus, aplikasi meunang teuing memori sareng henteu ngaleupaskeun. Ieu tiasa nyababkeun pembunuh OOM. Ieu mungkin nilai parameter vm.overcommit_memory kalawan déskripsi pikeun tiap:

  1. Overcommit heuristik (standar); heuristik dumasar kernel
  2. Ngidinan overcommit atoh
  3. Ulah overdo eta, ulah ngaleuwihan rasio overcommit.

Ссылка: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio - perséntase RAM sadia pikeun overload. A nilai 50% dina sistem kalawan 2 GB RAM bisa allocate nepi ka 3 GB RAM.

A nilai 2 pikeun vm.overcommit_memory nyadiakeun kinerja hadé pikeun PostgreSQL. Nilai ieu ngamaksimalkeun pamakean RAM dina prosés server tanpa aya résiko anu signifikan pikeun dibunuh ku prosés pembunuh OOM. Aplikasi bakal tiasa ngamuat deui, tapi ngan ukur dina wates overrun, anu ngirangan résiko pembunuh OOM maéhan prosésna. Ku alatan éta, nilai 2 méré kinerja hadé ti nilai standar 0. Sanajan kitu, reliabiliti bisa ningkat ku mastikeun yén mémori kaluar-of-rentang teu overloaded. Ieu ngaleungitkeun résiko prosés anu dibunuh ku pembunuh OOM.

Dina sistem tanpa swapping, masalah sareng vm.overcommit_memory sarua jeung 2 bisa lumangsung.

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 nyaeta persentase memori ngeusi kaca kotor nu kudu ditulis kana disk. Siram ka disk lumangsung dina latar tukang. Nilai parameter ieu dibasajankeun 0 nepi ka 100; kumaha oge, nilai handap 5 bisa jadi teu epektip tur sababaraha kernels teu ngarojong eta. 10 mangrupikeun standar dina kalolobaan sistem Linux. Anjeun tiasa ningkatkeun kinerja pikeun operasi nulis-intensif ku faktor nu leuwih leutik, nu hartina Linux Ubuntu bakal siram kaca kotor dina latar tukang.

Anjeun kedah nyetél nilai vm.dirty_background_bytes gumantung kana laju drive Anjeun.

Henteu aya nilai "alus" pikeun dua parameter ieu sabab duanana gumantung kana hardware. Sanajan kitu, setelan vm.dirty_background_ratio ka 5 sarta vm.dirty_background_bytes ka 25% tina speed disk ngaronjatkeun kinerja ka ~ 25% di hal nu ilahar.

vm.dirty_ratio/dirty_bytes

Ieu sami sareng vm.dirty_background_ratio/dirty_background_bytes, iwal reset dipigawé dina sési worker, blocking aplikasi. Kituna vm.dirty_ratio kudu leuwih luhur ti vm.dirty_background_ratio. Ieu mastikeun yén prosés latar tukang ngamimitian langkung awal pikeun nyegah ngablokir aplikasi saloba mungkin. Anjeun tiasa nyaluyukeun bédana antara dua babandingan ieu gumantung kana beban I / O disk.

hasil

Anjeun tiasa ngarobih setélan sanés pikeun ningkatkeun kinerja, tapi perbaikan bakal minimal sareng anjeun moal ningali seueur kauntungan. Urang kedah émut yén henteu sadayana pilihan dilarapkeun ka sadaya jinis aplikasi. Sababaraha aplikasi tiasa dianggo langkung saé nalika urang nyaluyukeun sababaraha setélan, sareng sababaraha henteu. Anjeun kedah milarian kasaimbangan anu pas antara ngonpigurasikeun setélan ieu pikeun beban kerja sareng jinis aplikasi anu dipiharep anjeun, sareng anjeun ogé kedah mertimbangkeun kabiasaan OS nalika nyetél. Ngonpigurasikeun parameter kernel teu sagampang ngonpigurasikeun parameter database; leuwih hese nyieun saran.

sumber: www.habr.com

Tambahkeun komentar