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

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

Gava ku serverek databasê di Linux-ê de ji nedîtî ve diçe, hûn hewce ne ku sedemê bibînin. 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 serverek an pêvajoyek ji bîranînê diqede, Linux 2 çareseriyan pêşkêşî dike: hemî pergalê têk bibe an jî pêvajoya (serlêdan) ku bîranînê dixwe biqedîne. Bê guman, çêtir e ku meriv pêvajoyê biqedîne û OS-ê ji têkçûnê xilas bike. Bi kurtasî, Out-Of-Memory Killer pêvajoyek e ku serîlêdanek dikuje da ku kernel ji têkçûnê xilas bike. Ew serîlêdanê dike qurban da ku OS-ê bixebite. Ka em pêşî nîqaş bikin ka OOM çawa dixebite û meriv wê çawa kontrol dike, û dûv re bibînin ka OOM Killer çawa biryar dide ku kîjan serîlêdanê biqede.

Yek ji peywirên sereke yên Linux-ê ev e ku gava ku ew jê dipirsin, bîranînê ji pêvajoyê re veqetîne. Bi gelemperî, pêvajoyek an serîlêdanek bîranînê ji OS-ê daxwaz dike, lê bi tevahî wê bikar nayîne. Ger OS bîranînê bide her kesê ku wê dipirse lê plana karanîna wê tune, di demek nêzîk de bîranîn dê biqede û pergal têk diçe. Ji bo ku ji vê yekê dûr nekevin, OS ji bo pêvajoyê bîranînê vedigire, lê bi rastî wê bernade. Bîr tenê dema ku pêvajoyek bi rastî wê bikar bîne tê veqetandin. Wusa diqewime ku OS-ê ne xwediyê bîranîna belaş e, lê ew bîranînê ji pêvajoyekê re destnîşan dike, û gava ku pêvajoyek pê hewce bike, OS heke bikaribe wê veqetîne. Nerazîbûn ev e ku carinan OS bîranînê vedigire, lê di wextê rast de bîranînek belaş tune, û pergal têk diçe. OOM di vê senaryoyê de rolek girîng dilîze û pêvajoyan diqedîne da ku kernel ji panîkê nebe. Dema ku pêvajoyek PostgreSQL neçar dibe ku biqede, peyamek di têketinê de xuya dike:

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

Li ser 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 pîvanê 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 ne tenê dikare were vemirandin û girtin. Me berê jî got ku Linux dikare bêyî veqetandina wê bêtir bîranîn ji bo pêvajoyan veqetîne, û ev tevger ji hêla pîvanek kernel Linux ve tê kontrol kirin. Guherbar ji vê yekê berpirsiyar e vm.overcommit_memory.

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

0: Kernel bixwe biryarê dide ka meriv pir bîranîn rezerv bike. Ev li ser piraniya guhertoyên Linux-ê xwerû ye.
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

Add a comment