A’ rèiteachadh roghainnean Linux Kernel gus PostgreSQL a bharrachadh

A’ rèiteachadh roghainnean Linux Kernel gus PostgreSQL a bharrachadh Tha coileanadh PostgreSQL as fheàrr an urra ri paramadairean siostam obrachaidh a tha air am mìneachadh gu ceart. Faodaidh suidheachadh kernel OS a tha air a dhroch rèiteachadh leantainn gu droch choileanadh frithealaiche stòr-dàta. Mar sin, tha e deatamach gum bi na roghainnean sin air an rèiteachadh a rèir frithealaiche an stòr-dàta agus an eallach obrach aige. Anns an dreuchd seo, bruidhnidh sinn mu chuid de pharaimearan kernel Linux cudromach a bheir buaidh air coileanadh frithealaiche stòr-dàta agus mar a rèiteachadh iad.

SHMMAX / SHMALL

SHMMAX na paramadair kernel a thathar a’ cleachdadh gus faighinn a-mach am meud as motha de aon roinn cuimhne co-roinnte a dh’ fhaodas pròiseas Linux a riarachadh. Ro dhreach 9.2, chleachd PostgreSQL System V (SysV), a dh’ fheumas suidheachadh SHMMAX. Às deidh 9.2, thionndaidh PostgreSQL gu cuimhne co-roinnte POSIX. Mar sin a-nis tha feum air nas lugha de bytes de chuimhne co-roinnte System V.

Ro dhreach 9.3, b’ e SHMMAX am paramadair kernel as cudromaiche. Tha an luach SHMMAX air a shònrachadh ann am bytes.

San aon dòigh, SHAMALL tha paramadair kernel eile air a chleachdadh airson dearbhadh
meud air feadh an t-siostaim de dhuilleagan cuimhne co-roinnte. Gus na luachan SHMMAX, SHMALL, no SHMMIN fhaicinn, cleachd an àithne ipcs.

SHM * Mion-fhiosrachadh - 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* Mion-fhiosrachadh - 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)

Cleachdaidhean PostgreSQL Siostam V IPC gus cuimhne co-roinnte a riarachadh. Is e am paramadair seo aon de na paramadairean kernel as cudromaiche. Nuair a gheibh thu na teachdaireachdan mearachd a leanas, tha e a’ ciallachadh gu bheil dreach nas sine agad de PostgreSQL agus gu bheil an luach SHMMAX agad gu math ìosal. Thathas an dùil gun atharraich luchd-cleachdaidh agus gun àrdaich iad an luach a rèir na cuimhne co-roinnte a tha iad an dùil a chleachdadh.

Mearachdan mì-rèiteachaidh a dh’ fhaodadh a bhith ann

Mura h-eil SHMMAX air a rèiteachadh gu ceart, is dòcha gum faigh thu mearachd nuair a tha thu a’ feuchainn ri cruinneachadh PostgreSQL a thòiseachadh a’ cleachdadh an àithne initdb.

initdb Fàillinn
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

Mar an ceudna, is dòcha gum faigh thu mearachd nuair a thòisicheas tu air frithealaiche PostgreSQL a’ cleachdadh an àithne pg_ctl.

pg_ctl Fàilligeadh
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.

A 'tuigsinn nan eadar-dhealachaidhean ann am mìneachaidhean

Tha mìneachadh nam paramadairean SHMMAX/SHMALL beagan eadar-dhealaichte air Linux agus MacOS X:

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

sgioba sysctl faodar a chleachdadh gus an luach atharrachadh airson ùine. Gus luachan seasmhach a shuidheachadh, cuir a-steach gu /etc/sysctl.conf. Tha mion-fhiosrachadh gu h-ìosal.

Ag atharrachadh roghainnean Kernel air 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

Ag atharrachadh Kernel Parameters air 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

Na dìochuimhnich: Gus atharrachaidhean a dhèanamh maireannach, cuir na luachan sin gu /etc/sysctl.conf

Duilleagan Mòra

Bidh Linux a’ cleachdadh duilleagan cuimhne 4 KB gu bunaiteach, bidh BSD a’ cleachdadh duilleagan cuimhne XNUMX KB. Duilleagan sàr-mhath, agus air Windows - Duilleagan Mòra. Is e duilleag a th’ ann am pìos RAM a chaidh a shònrachadh do phròiseas. Faodaidh grunn dhuilleagan a bhith aig pròiseas a rèir riatanasan cuimhne. Mar as motha de chuimhne a dh’ fheumas pròiseas, is ann as motha de dhuilleagan a thèid a riarachadh. Bidh an OS a’ cumail clàr riarachaidh duilleag airson pròiseasan. Mar as lugha meud na duilleige, is ann as motha a bhios am bòrd, is ann as fhaide a bheir e gus duilleag a lorg anns a’ chlàr duilleag sin. Mar sin bidh duilleagan mòra a’ leigeil le mòran cuimhne a bhith air a chleachdadh le cosgais nas lugha; nas lugha de sheallaidhean duilleag, nas lugha de sgàinidhean air duilleagan, gnìomhachd leughaidh / sgrìobhaidh nas luaithe thairis air bufairean nas motha. Is e an toradh coileanadh nas fheàrr.

Chan eil PostgreSQL a’ toirt taic ach do dhuilleagan mòra air Linux. Gu gnàthach, bidh Linux a’ cleachdadh duilleagan cuimhne 4 KB, mar sin ann an cùisean far a bheil cus obrachaidhean cuimhne ann, feumar duilleagan nas motha a shuidheachadh. Thathas a’ cumail ri buannachdan coileanaidh nuair a thathar a’ cleachdadh dhuilleagan mòra de 2 MB agus suas ri 1 GB. Faodar meud na duilleige mòr a shuidheachadh aig àm tòiseachaidh. Is urrainn dhut gu furasta sgrùdadh a dhèanamh air paramadairean duilleag mòr agus an cleachdadh air an inneal Linux agad a’ cleachdadh an àithne cat / proc/meminfo | grep - tha mi uabhasach.

A’ faighinn fiosrachadh mu dhuilleagan mòra (Linux a-mhàin)

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

San eisimpleir seo, ged a tha meud na duilleige mòr air a shuidheachadh gu 2048 (2 MB), tha an àireamh iomlan de dhuilleagan mòra air a shuidheachadh gu 0. Tha seo a' ciallachadh gu bheil duilleagan mòra ciorramach.

Sgriobt airson a bhith a 'dearbhadh an àireamh de dhuilleagan mòra

Bidh an sgriobt sìmplidh seo a’ tilleadh an àireamh riatanach de dhuilleagan mòra. Ruith an sgriobt air an fhrithealaiche Linux agad fhad ‘s a tha PostgreSQL a’ ruith. Dèan cinnteach sin airson caochladair na h-àrainneachd $PGDATA Tha eòlaire dàta PostgreSQL air a shònrachadh.

A 'faighinn an àireamh de dhuilleagan mòra a tha a dhìth

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

Tha toradh an sgriobt a’ coimhead mar seo:

Toradh sgriobt

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

Is e 88 an luach a thathar a’ moladh airson duilleagan mòra, mar sin bu chòir dhut a shuidheachadh gu 88.

Stàladh duilleagan mòra

sysctl -w vm.nr_hugepages=88

Thoir sùil air duilleagan mòra an-dràsta, chì thu nach eil duilleagan mòra gan cleachdadh (HugePages_Free = HugePages_Total).

Ath-thilleadh air duilleagan mòra (Linux a-mhàin)

$ 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

A-nis suidhich am paramadair huge_pages gu “air adhart” ann an $PGDATA/postgresql.conf agus ath-thòisich am frithealaiche.

A-rithist, fiosrachadh mu dhuilleagan mòra (Linux a-mhàin)

$ 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

A-nis chì thu nach eil ach glè bheag de dhuilleagan mòra gan cleachdadh. Feuchaidh sinn a-nis ri beagan dàta a chur ris an stòr-dàta.

Cuid de ghnìomhachd stòr-dàta gus duilleagan mòra ath-chuairteachadh

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

Feuch am faic sinn a bheil sinn a’ cleachdadh barrachd dhuilleagan mòra a-nis na bha sinn roimhe.

Barrachd fiosrachaidh air duilleagan mòra (Linux a-mhàin)

$ 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

A-nis chì thu gu bheil a 'mhòr-chuid de na duilleagan mòra gan cleachdadh.

Nota: Tha an luach measta airson HugePages a thathar a’ cleachdadh an seo glè ìosal, nach e luach àbhaisteach a th’ ann airson inneal a tha a’ ruith àrainneachd toraidh. Feuch an toir thu tuairmse air an àireamh de dhuilleagan a tha a dhìth airson an t-siostam agad agus suidhich iad a rèir sin stèidhichte air luchd agus goireasan.

vm.swappiness

vm.swappiness na paramadair kernel eile a bheir buaidh air coileanadh stòr-dàta. Tha an roghainn seo air a chleachdadh gus smachd a chumail air giùlan swappiness (ag iomlaid dhuilleagan a-steach agus a-mach à cuimhne) ann an Linux. Tha an luach eadar 0 agus 100. Bidh e a' dearbhadh dè an ìre de chuimhne a thèid a dhuilleag no a dhuilleag. Chan eil neoni a’ ciallachadh iomlaid sam bith agus tha 100 a’ ciallachadh iomlaid ionnsaigheach.

Gheibh thu deagh choileanadh le bhith a 'suidheachadh luachan nas ìsle.

Ma chuireas tu seo gu 0 air kernels nas ùire dh’ fhaodadh sin toirt air OOM Killer (pròiseas glanadh cuimhne Linux) am pròiseas a mharbhadh. Mar sin tha e sàbhailte a shuidheachadh gu 1 ma tha thu airson suaipeadh a lùghdachadh. 'S e 60 an luach bunaiteach ann an Linux. Tha luach nas àirde a' ciallachadh gu bheil an MMU (aonad stiùireadh cuimhne) a' cleachdadh barrachd rùm suaip na RAM, agus tha luach nas ìsle a' cumail barrachd dàta/còd mar chuimhneachan.

Tha luach nas ìsle na ghealladh math airson coileanadh nas fheàrr ann am PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Bidh tagraidhean a’ togail cuimhne agus ga leigeil ma sgaoil nuair nach eil feum air tuilleadh. Ach ann an cuid de chùisean, bidh an tagradh a 'faighinn cus cuimhne agus chan eil e ga leigeil ma sgaoil. Dh’ fhaodadh seo marbhadh OOM adhbhrachadh. Seo na luachan paramadair a dh’ fhaodadh a bhith ann vm.overcommit_memory le tuairisgeul airson gach fear:

  1. Overcommit heuristic (bunaiteach); heuristic stèidhichte air kernel
  2. Leig seachad co-dhiù
  3. Na dèan cus dheth, na gabh thairis air a’ cho-mheas overcommit.

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

vm.overcommit_coimheas - ceudad de RAM ri fhaighinn airson cus luchdachadh. Faodaidh luach 50% air siostam le 2 GB de RAM suas ri 3 GB de RAM a riarachadh.

Tha luach 2 airson vm.overcommit_memory a’ toirt seachad coileanadh nas fheàrr airson PostgreSQL. Tha an luach seo a’ meudachadh cleachdadh RAM pròiseas an fhrithealaiche gun chunnart mòr a bhith air a mharbhadh leis a’ phròiseas marbhadh OOM. Bidh e comasach don tagradh ath-luchdachadh, ach dìreach taobh a-staigh crìochan cus ruith, a lughdaicheas an cunnart gun marbhadh marbhadh OOM am pròiseas. Mar sin, tha luach 2 a 'toirt seachad coileanadh nas fheàrr na luach bunaiteach 0. Ach, faodar earbsa a leasachadh le bhith a' dèanamh cinnteach nach eil cus cuimhne air taobh a-muigh an raon. Tha seo a’ cur às don chunnart gun tèid am pròiseas a mharbhadh le marbhadh OOM.

Air siostaman gun iomlaid, faodaidh duilgheadas le vm.overcommit_memory co-ionann ri 2 tachairt.

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

vm.dirty_background_ratio / vm.dirty_background_bytes

vm.dirty_background_coimheas an àireamh sa cheud de chuimhne air a lìonadh le duilleagan salach a dh’ fheumar a sgrìobhadh gu diosc. Tha an sruth gu diosc a’ nochdadh air a’ chùl. Tha luach am paramadair seo eadar 0 agus 100; ge-tà, dh'fhaodadh luach fo 5 a bhith neo-èifeachdach agus chan eil cuid de chraobhan a' toirt taic dha. 10 mar an àbhaist air a’ mhòr-chuid de shiostaman Linux. Faodaidh tu coileanadh airson gnìomhachd dian-sgrìobhaidh a leasachadh le feart nas lugha, a tha a’ ciallachadh gum bi Linux a’ sruthadh duilleagan salach air a’ chùl.

Feumaidh tu an luach a shuidheachadh vm.dirty_background_bytes a rèir astar an dràibhidh agad.

Chan eil luachan “math” ann airson an dà pharamadair seo leis gu bheil an dà chuid an urra ri bathar-cruaidh. Ach, le bhith a’ suidheachadh vm.dirty_background_ratio gu 5 agus vm.dirty_background_bytes gu 25% de astar diosc a’ leasachadh coileanadh gu ~ 25% sa mhòr-chuid de chùisean.

vm.dirty_ratio/dirty_bytes

Tha seo an aon rud ri vm.dirty_background_ratio/dirty_background_bytes, ach a-mhàin gu bheil an ath-shuidheachadh air a dhèanamh ann an seisean neach-obrach, a 'bacadh an tagraidh. Mar sin bu chòir vm.dirty_ratio a bhith nas àirde na vm.dirty_background_coimheas. Bidh seo a’ dèanamh cinnteach gun tòisich pròiseasan cùl-fhiosrachaidh nas tràithe gus nach cuir thu bacadh air an tagradh cho mòr ‘s as urrainn. Faodaidh tu an eadar-dhealachadh eadar an dà cho-mheas seo atharrachadh a rèir an luchd I / O diosc.

An toradh

Faodaidh tu suidheachaidhean eile tweak gus coileanadh a leasachadh, ach cha bhi na leasachaidhean ach glè bheag agus chan fhaic thu mòran buannachd. Feumaidh sinn cuimhneachadh nach eil a h-uile roghainn a’ buntainn ri gach seòrsa tagradh. Bidh cuid de na h-aplacaidean ag obair nas fheàrr nuair a dh’ atharraicheas sinn cuid de shuidheachaidhean, agus cuid nach eil. Feumaidh tu an cothromachadh ceart a lorg eadar a bhith a’ rèiteachadh nan roghainnean sin airson an eallach obrach ris am biodh dùil agad agus an seòrsa tagraidh, agus feumaidh tu cuideachd beachdachadh air giùlan OS nuair a bhios tu a’ gleusadh. Chan eil e cho furasta paramadairean kernel a rèiteachadh ri paramadairean stòr-dàta a rèiteachadh; tha e nas duilghe molaidhean a dhèanamh.

Source: www.habr.com

Cuir beachd ann