Ịhazi nhọrọ Linux Kernel iji kwalite PostgreSQL

Ịhazi nhọrọ Linux Kernel iji kwalite PostgreSQL Arụmọrụ PostgreSQL kacha mma dabere na paramita sistemụ arụmọrụ akọwapụtara nke ọma. Ntọala kernel OS ahaziri nke ọma nwere ike bute arụmọrụ sava nchekwa data adịghị mma. Ya mere, ọ dị mkpa na a na-ahazi ntọala ndị a dịka ihe nkesa nchekwa data na ọrụ ya si dị. Na post a, anyị ga-atụle ụfọdụ paramita kernel Linux dị mkpa nke nwere ike imetụta arụmọrụ nkesa nchekwa data yana otu esi ahazi ha.

SHMMAX / SHMALL

SHMMAX bụ oke kernel eji achọpụta oke oke nke otu akụkụ ebe nchekwa nke usoro Linux nwere ike kenye. Tupu ụdị 9.2, PostgreSQL jiri Sistemụ V (SysV), nke chọrọ ntọala SHMMAX. Mgbe 9.2 gasịrị, PostgreSQL gbanwere na ebe nchekwa POSIX. Ya mere, ugbu a ole na ole bytes nke Sistemu V nkekọrịta ebe nchekwa a chọrọ.

Tupu ụdị 9.3, SHMMAX bụ oke kernel kacha mkpa. A kọwapụtara uru SHMMAX na bytes.

N'otu aka ahụ, SHMALL bụ oke kernel ọzọ eji achọpụta
oke sistemu nke ibe ebe nchekwa ekekọrịtara. Ka ilele ụkpụrụ SHMMAX, SHMALL, ma ọ bụ SHMMIN dị ugbu a, jiri iwu a ipcs.

Nkọwa 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

Nkọwa 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 na-eji Sistemụ V IPC ka ekenye òkè ebe nchekwa. Oke a bụ otu n'ime paramita kernel kacha mkpa. Mgbe ọ bụla ị nwetara ozi njehie ndị a, ọ pụtara na ị nwere ụdị PostgreSQL ochie na uru SHMMAX gị dị ala. A na-atụ anya ka ndị ọrụ gbanwee ma welie uru dịka ebe nchekwa nkekọrịta ha bu n'obi iji.

Njehie nhazi ezighi ezi enwere ike

Ọ bụrụ na ahazighị SHMMAX nke ọma, ị nwere ike ịnweta njehie mgbe ị na-agbalị ibido ụyọkọ PostgreSQL site na iji iwu ahụ. initdb.

initdb ọdịda
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

N'otu aka ahụ, ị ​​nwere ike ịnweta njehie mgbe ịmalitere ihe nkesa PostgreSQL na-eji iwu ahụ pg_ctl.

pg_ctl ọdịda
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.

Ịghọta ọdịiche dị na nkọwa

Ịkọwapụta usoro SHMMAX/SHMALL dịtụ iche na Linux na MacOS X:

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

otu sysctl enwere ike iji gbanwee uru nwa oge. Ka ịtọọ ụkpụrụ mgbe niile, tinye ntinye na /etc/sysctl.conf. Nkọwa dị n'okpuru.

Na-agbanwe ntọala kernel na 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

Ịgbanwe kernel Parameters na 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

Echefukwala: Iji mee mgbanwe na-adịgide adịgide, tinye ụkpụrụ ndị a na /etc/sysctl.conf

Nnukwu ibe

Linux na-eji ibe nchekwa 4 KB na ndabara, BSD na-eji ibe ebe nchekwa XNUMX KB. Ibe akwukwo di eluna Windows - Nnukwu ibe. Ibe bụ mpempe RAM ekenyere na usoro. Usoro nwere ike inwe ọtụtụ ibe dabere na ihe nchekwa chọrọ. Ka usoro nchekwa na-achọkwu, ka a na-ekenyekwu ibe ya. OS na-edobe tebụl nkenye ibe maka usoro. Ka ibe ya dị ntakịrị, ka tebụl na-ebuwanye ibu, ka ọ na-ewe ogologo oge iji chọta ibe na tebụl ibe ahụ. Ya mere, ibe buru ibu na-enye ohere iji nnukwu ebe nchekwa mee ihe na obere ego; nlele ibe pere mpe, mpe mpe mpe mpe mpe mpe akwụkwọ, arụ ọrụ ịgụ/dee ngwa ngwa karịa ihe nchekwa buru ibu. Nsonaazụ na-eme ka arụmọrụ dịkwuo mma.

PostgreSQL na-akwado naanị nnukwu ibe na Linux. Site na ndabara, Linux na-eji ibe nchekwa 4 KB, yabụ n'ọnọdụ ebe enwere ọtụtụ ọrụ ebe nchekwa, ọ dị mkpa ịtọ ibe buru ibu. A na-ahụ uru arụmọrụ mgbe ị na-eji nnukwu ibe 2 MB na ruo 1 GB. Enwere ike ịtọ nha ihu akwụkwọ buru ibu n'oge buut. Ị nwere ike ịlele nnukwu peeji nke na ojiji ha na igwe Linux gị site na iji iwu ahụ pusi /proc/meminfo | grep - i buru ibu.

Inweta ozi gbasara ibe ndị buru ibu (naanị 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

N'ihe atụ a, ọ bụ ezie na a na-edozi nnukwu ibe akwụkwọ na 2048 (2 MB), ọnụ ọgụgụ nke nnukwu ibe ka 0. Nke a pụtara na nnukwu ibe nwere nkwarụ.

Edemede maka ịchọpụta ọnụọgụ nke ibe buru ibu

Edemede a dị mfe na-eweghachite nọmba achọrọ nke nnukwu ibe. Gbaa ederede na sava Linux gị ka PostgreSQL na-agba ọsọ. Gbaa mbọ hụ na maka mgbanwe gburugburu ebe obibi $PGDATA A kọwapụtara ndekọ ndekọ data PostgreSQL.

Inweta ọnụọgụgụ nnukwu ibe achọrọ

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

Nsonaazụ script dị ka nke a:

Mbupute script

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

Uru akwadoro maka ibe buru ibu bụ 88, yabụ ịkwesịrị ịtọ ya na 88.

Ịwụnye nnukwu ibe

sysctl -w vm.nr_hugepages=88

Lelee nnukwu ibe ugbu a, ị ga-ahụ na anaghị eji nnukwu ibe (HugePages_Free = HugePages_Total).

Akwagharịgharịrị nnukwu ibe (naanị 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

Ugbu a tọọ oke_pages ka ọ bụrụ "na" na $PGDATA/postgresql.conf wee malitegharịa ihe nkesa ahụ.

Ọzọkwa, ozi gbasara nnukwu ibe (naanị 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

Ugbu a, ị ga-ahụ na a na-eji nnukwu peeji ole na ole. Ka anyị gbalịa ugbu a itinye ụfọdụ data na nchekwa data.

Ụfọdụ ọrụ nchekwa data iji megharịa nnukwu ibe

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

Ka anyị hụ ma anyị na-eji ibe ndị buru ibu ugbu a karịa ka ọ dị na mbụ.

Ozi ndị ọzọ na nnukwu ibe (naanị 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

Ugbu a ị ga-ahụ na a na-eji ọtụtụ n'ime ibe ndị buru ibu.

Mara: Uru atụmatụ maka HugePages eji ebe a dị obere, nke na-abụghị uru nkịtị maka igwe na-arụ gburugburu ngwaahịa. Biko tụọ ọnụ ọgụgụ ibe akwụkwọ achọrọ maka sistemụ gị wee tọọ ya nke ọma dabere na ibu na akụrụngwa.

vm.swappiness

vm.swappiness bụ ihe ọzọ kernel paramita nwere ike imetụta arụmọrụ nchekwa data. A na-eji nhọrọ a iji chịkwaa omume nke swappiness (ịgbanwe ibe na ebe nchekwa) na Linux. Uru ya sitere na 0 ruo 100. Ọ na-ekpebi ole ebe nchekwa a ga-edepụta ma ọ bụ wepụ ya. Zero pụtara enweghị mgbanwe na 100 pụtara mgbanwe ike ike.

Ị nwere ike nweta arụmọrụ dị mma site na ịtọ ụkpụrụ dị ala.

Ịtọbe nke a na 0 na kernel ọhụrụ nwere ike ime ka OOM Killer (Usoro nhicha ebe nchekwa Linux) gbuo usoro ahụ. Yabụ na ọ dị mma ịtọ ya na 1 ma ọ bụrụ na ịchọrọ ibelata mgbanwe. Uru ndabara na Linux bụ 60. Uru dị elu na-eme ka MMU (nchịkọta njikwa ebe nchekwa) jiri ohere swap karịa RAM, ebe ọnụ ala dị ala na-edobe data / koodu na ebe nchekwa.

Ọnụ ala dị ala bụ nzọ dị mma maka arụmọrụ emelitere na PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Ngwa na-enweta ebe nchekwa wee hapụ ya mgbe ọ dịghịzi mkpa. Mana n'ọnọdụ ụfọdụ, ngwa ahụ na-enweta oke nchekwa ma ọ naghị ahapụ ya. Nke a nwere ike bute onye na-egbu OOM. Nke a bụ ụkpụrụ oke nwere ike vm.overcommit_memory na nkọwa maka nke ọ bụla:

  1. Heuristic overcommit (nke ndabara); heuristic dabere na kernel
  2. Kwe ka imebiga ihe ókè
  3. Unu emela ya, agabigala oke oke oke.

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

vm.overcommit_ratio - pasent RAM dị maka ibu ibu. Uru nke 50% na sistemụ nwere 2 GB nke RAM nwere ike ịkenye ihe ruru 3 GB nke RAM.

Uru nke 2 maka vm.overcommit_memory na-enye arụmọrụ ka mma maka PostgreSQL. Uru a na-ebuli ojiji RAM nke usoro ihe nkesa na-enweghị ihe egwu ọ bụla dị mkpa nke usoro igbu egbu OOM ga-egbu. Ngwa a ga-enwe ike ibugharị, mana ọ bụ naanị n'ime oke nke oke, nke na-ebelata ihe ize ndụ nke onye na-egbu OOM na-egbu usoro ahụ. Ya mere, uru nke 2 na-enye arụmọrụ ka mma karịa uru ndabara nke 0. Otú ọ dị, enwere ike imeziwanye ntụkwasị obi site n'ịhụ na ebe nchekwa na-adịghị na-ebufe ibu. Nke a na-ewepụ ihe ize ndụ nke usoro ahụ nke onye na-egbu OOM gburu.

Na sistemụ na-enweghị swapping, nsogbu na vm.overcommit_memory hà 2 nwere ike ime.

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 bụ pasent nke ebe nchekwa juputara na ibe ruru unyi nke kwesiri ka edere ya na diski. Ntughari na diski na-apụta n'azụ. Uru nke oke a sitere na 0 ruo 100; Otú ọ dị, uru dị n'okpuru 5 nwere ike ghara ịdị irè ma ụfọdụ kernels anaghị akwado ya. 10 bụ ndabara na ọtụtụ sistemụ Linux. Ị nwere ike imeziwanye arụmọrụ maka ịrụ ọrụ ide ihe site na obere ihe, nke ga-apụta na Linux ga-ehichapụ ibe ruru unyi n'azụ.

Ịkwesịrị ịtọ uru vm. dirty_background_bytes dabere na ọsọ nke mbanye gị.

Enweghị ụkpụrụ "dị mma" maka parampat abụọ a n'ihi na ha abụọ dabere na ngwaike. Otú ọ dị, ịtọ vm.dirty_background_ratio na 5 na vm.dirty_background_bytes na 25% nke ọsọ diski na-eme ka arụmọrụ dịkwuo ~ 25% n'ọtụtụ oge.

vm.dirty_ratio/dirty_bytes

Nke a bụ otu ihe ahụ vm.dirty_background_ratio/dirty_background_bytes, ma e wezụga na a na-eme nrụgharị ahụ na nnọkọ ndị ọrụ, na-egbochi ngwa ahụ. Ya mere vm.dirty_ratio kwesịrị ịdị elu karịa vm.dirty_background_ratio. Nke a na-eme ka usoro ndabere na-amalite na mbụ iji zere igbochi ngwa ahụ dịka o kwere mee. Ị nwere ike gbanwee ọdịiche dị n'etiti ọnụọgụ abụọ a dabere na ibu I / O diski.

Nsonaazụ

Ị nwere ike tweak ntọala ndị ọzọ iji melite arụmọrụ, mana mmelite ga-adị ntakịrị ma ị gaghị ahụ nnukwu uru. Anyị ga-echeta na ọ bụghị nhọrọ niile na-emetụta ụdị ngwa niile. Ụfọdụ ngwa na-arụ ọrụ nke ọma mgbe anyị na-ahazi ụfọdụ ntọala, ma ụfọdụ anaghị eme ya. Ị ga-achọta nguzozi ziri ezi n'etiti ịhazi ntọala ndị a maka ọrụ ị na-atụ anya ya na ụdị ngwa, na ị ga-atụlekwa omume OS mgbe ị na-emegharị ya. Ịhazi paramita kernel adịghị mfe dị ka ịhazi paramita nchekwa data; ọ na-esiri ike ịkwado ndụmọdụ.

isi: www.habr.com

Tinye a comment