Sazkirina Out-Of-Memory Killer li Linux ji bo PostgreSQL

Sazkirina Out-Of-Memory Killer li Linux ji bo PostgreSQL

Dema ku di Linux Servera databasê bi awayekî ji nişka ve diqede, û divê sedema wê were destnîşankirin. Dibe ku çend sedem hebin. Bo nimûne, SIGSEGV - têkçûn ji ber xeletiyek di servera paşîn de. Lê ev kêm e. Pir caran, hûn tenê cîhê dîskê an bîranînê diqedin. Ger cîhê dîskê we xilas bibe, tenê rêyek heye - cîh azad bikin û databasê ji nû ve bidin destpêkirin.

Killer Out-Of-Memory

Dema ku tu server an jî bîra pêvajoyê diqede, Linux Kujerê Out-Of-Memory du çareseriyan pêşkêş dike: tevahiya pergalê hilweşîne an jî pêvajo (serlêdana) ku bîrê dixwe biqedîne. Bê guman, çêtir e ku pêvajo biqedîne û OS ji têkçûnê xilas bibe. Bi kurtasî, Kujerê Out-Of-Memory pêvajoyek e ku serîlêdanek diqedîne da ku kernel ji têkçûnê xilas bike. Ew serîlêdanê feda dike da ku OS bixebite. Werin em pêşî nîqaş bikin ka OOM çawa dixebite û meriv çawa wê kontrol dike, û dûv re binêrin ka OOM Kujer çawa biryar dide ka kîjan sepanan biqedîne.

Yek ji karên sereke Linux — Dema ku pêvajoyan daxwaz dikin, bîrê ji wan re veqetînin. Bi gelemperî, pêvajoyek an serîlêdanek ji OS-ê bîrê dixwaze lê bi tevahî bikar nayne. Ger OS bîrê ji her kesê ku daxwaz dike lê plan nake ku wê bikar bîne veqetîne, sîstem dê zû ji bîrê xilas bibe û sîstem dê têk biçe. Ji bo pêşîgirtina li vê yekê, OS bîrê ji bo pêvajoyekê vediqetîne lê bi rastî wê veqetîne. Bîr tenê dema ku pêvajoyek bi rastî dixwaze wê bikar bîne tê veqetandin. Carinan OS bîra vala tune ye, lê ew bîrê ji pêvajoyekê re vediqetîne, û dema ku pêvajo hewce bike, OS heke bikaribe wê vediqetîne. Aliyê neyînî ew e ku carinan OS bîrê vediqetîne, lê dema ku hewce bike, bîra vala tune, ku dibe sedema têkçûna pergalê. OOM di vê senaryoyê de rolek sereke dilîze, pêvajoyan diqedîne da ku pêşî li panîka kernel bigire. Dema ku pêvajoya PostgreSQL bi zorê tê bidawîkirin, peyama jêrîn di tomarê de xuya dibe:

Out of Memory: Killed process 12345 (postgres).

Ger bîra pergalê kêm be û ew neyê azad kirin, fonksiyon tê gotin out_of_memory. Di vê qonaxê de, wê tenê tiştek maye ku bike - yek an çend pêvajoyan temam bike. Ma divê OOM-kujer pêvajoyê tavilê biqedîne an dikare li bendê bimîne? Eşkere ye, dema ku out_of_memory tê gotin, ew ji ber ku li benda operasyonek I/O an jî rûpelkirina dîskê ye. Ji ber vê yekê, divê kujerê OOM pêşî kontrol bike û, li ser bingeha wan, biryar bide ku pêdivî ye ku pêvajo were qedandin. Ger hemî kontrolên jêrîn erênî bin, OOM dê pêvajoyê biqedîne.

Hilbijartina pêvajoyê

Dema ku bîranîn xilas dibe, fonksiyonê tê gotin out_of_memory(). Fonksiyonek wê heye select_bad_process(), ku ji fonksiyonê nirxandinek distîne badness(). Pêvajoya "herî xirab" dê bibe hedef. Karkirin badness() li gor hin qaîdeyan pêvajoyekê hildibijêre.

  1. Kernel ji xwe re hin bîranînek hindiktirîn hewce dike.
  2. Pêdivî ye ku hûn gelek bîranîn azad bikin.
  3. Ne hewce ye ku pêvajoyên ku bîranîna piçûk bikar tînin biqedînin.
  4. Pêvajoyên herî kêm divê bêne qedandin.
  5. Algorîtmayên tevlihev ên ku ji bo wan pêvajoyên ku bikarhêner bixwe dixwaze temam bike şansê qedandinê zêde dike.

Piştî ku van hemî kontrolan qedand, OOM pîvanê lêkolîn dike (oom_score). OOM destnîşan dike oom_score her pêvajoyê, û paşê vê nirxê bi hêjeya bîranînê zêde dike. Pêvajoyên bi nirxên mezintir îhtîmal e ku bibin qurbaniya OOM Killer. Pêvajoyên ku bi bikarhênerê root re têkildar in xwedan pûanek kêmtir in û kêm dibe ku neçar bimînin ku biqedin.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

Nasnameya pêvajoya Postgres 3813 e, ji ber vê yekê di şêlek din de gengaz e ku meriv bi karanîna vê pîvana kernelê jimareyê bigire. oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Ger hûn nexwazin OOM-Killer bi tevahî pêvajoyê bikuje, vebijarkek din a kernel heye: oom_score_adj. Nirxek neyînî ya mezin lê zêde bikin da ku şansên qedandina pêvajoyek ku hûn nirx dikin kêm bikin.

sudo echo -100 > /proc/3813/oom_score_adj

Ji bo danîna nirxek oom_score_adj, OOMScoreAdjust di bloka karûbarê de bicîh bikin:

[Service]
OOMScoreAdjust=-1000

An jî bikar bînin oomprotect di tîmekê de rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Bi zorê bidawîkirina pêvajoyekê

Dema ku yek an bêtir pêvajoyên berê hatine hilbijartin, OOM-Killer fonksiyonê bang dike oom_kill_task(). Ev fonksiyon sînyalek bidawîbûnê ji pêvajoyê re dişîne. Di doza kêmbûna bîra oom_kill() Vê fonksiyonê bang dike ku ji pêvajoyê re sînyalek SIGKILL bişîne. Peyamek ji têketina kernelê re tê nivîsandin.

Out of Memory: Killed process [pid] [name].

Meriv çawa OOM-Killer kontrol dike

В Linux Hûn dikarin OOM-Killer çalak bikin an neçalak bikin (her çend ya paşîn nayê pêşniyar kirin). Ji bo çalakkirin an neçalakkirina wê, parametreyê bikar bînin vm.oom-kill. Ji bo çalakkirina OOM-Killer di dema xebitandinê de, fermanê bimeşînin sysctl.

sudo -s sysctl -w vm.oom-kill = 1

Ji bo neçalakkirina OOM-Killer, di heman fermanê de nirxa 0 diyar bikin:

sudo -s sysctl -w vm.oom-kill = 0

Encama vê fermanê dê her û her neyê tomarkirin, lê tenê heya nûvekirina yekem. Heke ji we re bêtir israr hewce ye, vê rêzê li pelê zêde bikin /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

Rêyek din a çalakkirin û neçalakkirinê nivîsandina guhêrbar e panic_on_oom. Nirx her gav dikare were kontrol kirin /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Ger hûn nirxê bidin 0, wê hingê gava ku bîranîn biqede, dê panika kernel tune be.

$ echo 0 > /proc/sys/vm/panic_on_oom

Heke hûn nirxa 1-ê destnîşan bikin, wê hingê gava ku bîranîn biqede, dê panîkek kernel çêbibe.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer dikare were vekirin û girtin, wekî ku me berê jî behs kir. Linux dibe ku ji ya berdest bêtir bîrê ji bo pêvajoyan veqetîne, lê bi rastî wê veneqetîne, û ev tevger ji hêla parametreyek kernel ve tê kontrol kirin. LinuxGuherbar berpirsiyarê vê yekê ye. vm.overcommit_memory.

Hûn dikarin ji bo wê nirxên jêrîn diyar bikin:

0: Kernel bixwe biryar dide ka pir zêde bîrê veqetîne an na. Ev nirxa xwerû ye di piraniya guhertoyan de. Linux.
1: Kernel dê her gav bîranîna zêde biparêze. Ev xeternak e, ji ber ku bîr dibe ku biqede, ji ber ku, bi îhtîmalek mezin, rojek dê pêvajo hewce bike.
2: kernel dê ji ya ku di parametreyê de hatî destnîşan kirin bêtir bîranîn veqetîne overcommit_ratio.

Bi vê pîvanê, hûn rêjeya bîranînê ya ku destûr tê dayîn ku zêde were veqetandin diyar dikin. Ger cîh jê re tune be, bîranîn nayê veqetandin, û veqetandin dê were red kirin. Ev vebijarka herî ewledar e ku ji bo PostgreSQL tê pêşniyar kirin. OOM-Killer ji hêla hêmanek din ve tê bandor kirin - kapasîteya guheztinê, ku ji hêla guhêrbar ve tê kontrol kirin. cat /proc/sys/vm/swappiness. Van nirxan ji kernelê re vedibêjin ka meriv çawa pelgeyê bi rê ve dibe. Nirx çiqas bilind be, îhtîmala wê kêm e ku OOM pêvajoyê biqedîne, lê ji ber operasyonên I/O ew bandorek neyînî li ser databasê dike. Û berevajî - nirxa hindiktir, îhtîmala destwerdana OOM-Killer bilindtir e, lê performansa databasê jî bilindtir e. Nirxa xwerû 60 e, lê heke tevahiya databasê di bîranînê de cih bigire, çêtir e ku meriv nirxê li 1-ê destnîşan bike.

Encam

Nehêlin ku "kujer" di OOM-Killer de we bitirsîne. Di vê rewşê de, kujer dê bibe rizgariya pergala we. Ew pêvajoyên herî xirab "dikuje" û pergalê ji têkçûnê rizgar dike. Ji bo ku hûn nekarin OOM-Killer bikar bînin da ku PostgreSQL biqedînin, bicîh bikin vm.overcommit_memory nirx 2. Ev garantî nake ku OOM-Killer ne hewce ye ku destwerdanê bike, lê ew ê îhtîmala ku bi darê zorê bidawîkirina pêvajoya PostgreSQL kêm bike.

Source: www.habr.com

Ji bo malperên bi parastina DDoS, serverên VPS VDS mêvandariya pêbawer bikirin 🔥 Hostinga malperê ya pêbawer bi parastina DDoS, serverên VPS VDS bikirin | ProHoster