Ịtọlite ​​​​Mpụ-Ncheta Killer na Linux maka PostgreSQL

Ịtọlite ​​​​Mpụ-Ncheta Killer na Linux maka PostgreSQL

Mgbe ihe nkesa nchekwa data kwụsịrị na Linux na-atụghị anya ya, ịkwesịrị ịchọta ihe kpatara ya. Enwere ike inwe ọtụtụ ihe kpatara ya. Ọmụmaatụ, SIGSEGV - ọdịda n'ihi ahụhụ dị na sava azụ azụ. Mana nke a dị ụkọ. Ọtụtụ mgbe, ohere diski ma ọ bụ ebe nchekwa agwụla gị. Ọ bụrụ na ohere diski agwụla, enwere naanị otu ụzọ ị ga - esi wepụ ohere ma malitegharịa nchekwa data.

Onye na-egbughị ebe nchekwa

Mgbe ihe nkesa ma ọ bụ usoro na-agwụ na ebe nchekwa, Linux na-enye 2 ngwọta: mebie usoro dum ma ọ bụ kwụsị usoro (ngwa) nke na-eri nri ebe nchekwa. Ọ ka mma, n'ezie, ịkwụsị usoro ahụ ma chekwaa OS site na ịdaba. Na nkenke, Out-Of-Memory Killer bụ usoro na-egbu ngwa iji chekwaa kernel ka ọ ghara ịdaba. Ọ na-achụ ngwa ahụ iji mee ka OS na-agba ọsọ. Ka anyị buru ụzọ tụlee ka OOM si arụ ọrụ na otu esi ejikwa ya, wee hụ ka OOM Killer si ekpebi ngwa anyị ga-akwụsị.

Otu n'ime isi ọrụ Linux bụ ikenye ebe nchekwa na usoro mgbe ha rịọrọ maka ya. Dịka, usoro ma ọ bụ ngwa na-arịọ ebe nchekwa site na OS, mana anaghị eji ya nke ọma. Ọ bụrụ na OS na-enye onye ọ bụla na-arịọ maka ya ebe nchekwa ma ọ nweghị atụmatụ iji ya, n'oge na-adịghị anya ebe nchekwa ga-agwụ ma usoro ahụ ga-ada. Iji zere nke a, OS na-edobe ebe nchekwa maka usoro ahụ, mana ọ naghị ahapụ ya n'ezie. A na-ekenye ebe nchekwa naanị mgbe usoro ga-eji ya. Ọ na-eme na OS enweghị ebe nchekwa efu, mana ọ na-ekenye ebe nchekwa na usoro, na mgbe usoro chọrọ ya, OS na-ekenye ya ma ọ bụrụ na ọ nwere ike. Ihe dị ala bụ na mgbe ụfọdụ OS na-edobe ebe nchekwa, mana n'oge kwesịrị ekwesị ọ nweghị ebe nchekwa efu, na sistemụ ahụ na-akụda. OOM na-arụ ọrụ dị mkpa na ọnọdụ a ma kwụsị usoro iji gbochie kernel ka ọ ghara ịma jijiji. Mgbe a manyere usoro PostgreSQL ka ọ kwụsị, ozi na-egosi na ndekọ:

Out of Memory: Killed process 12345 (postgres).

Ọ bụrụ na usoro ahụ dị ala na ebe nchekwa na enweghị ike ịtọhapụ ya, a na-akpọ ọrụ ahụ out_of_memory. N'oge a, ọ nwere naanị otu ihe ọ ga-eme - mezue otu usoro ma ọ bụ karịa. Kwesịrị ka onye na-egbu OOM kwụsị ọrụ ozugbo ma ọ bụ ọ nwere ike ichere? N'ụzọ doro anya, mgbe a na-akpọ out_of_memory, ọ bụ n'ihi ichere ọrụ I/O ma ọ bụ paging na diski. Ya mere, onye na-egbu OOM ga-ebu ụzọ mee nyocha na, dabere na ha, kpebie na a ga-akwụsị usoro ahụ. Ọ bụrụ na nlele niile dị n'okpuru dị mma, OOM ga-akwụsị usoro a.

Nhọrọ usoro

Mgbe ebe nchekwa kwụsịrị, a na-akpọ ọrụ ahụ out_of_memory(). O nwere ọrụ select_bad_process(), nke na-enweta nyocha site na ọrụ ahụ badness(). Usoro "kachasị njọ" ga-ezubere iche. Ọrụ badness() na-ahọrọ usoro dịka iwu ụfọdụ siri dị.

  1. kernel chọrọ ụfọdụ ebe nchekwa kacha nta maka onwe ya.
  2. Ịkwesịrị ịtọhapụ ọtụtụ ebe nchekwa.
  3. Ọ dịghị mkpa ịkwụsị usoro ndị na-eji obere ebe nchekwa.
  4. Ekwesịrị imecha usoro kacha nta.
  5. Algọridim mgbagwoju anya nke na-abawanye ohere nke ịmecha maka usoro ndị ahụ nke onye ọrụ n'onwe ya chọrọ imecha.

N'ịbụ onye dechara nlele ndị a niile, OOM na-enyocha akara ahụ (oom_score). OOM na-ahọpụta oom_score usoro nke ọ bụla, wee mụbaa uru a site na ọnụọgụ nke ebe nchekwa. Usoro nwere ụkpụrụ buru ibu nwere ike ịdaba na onye na-egbu OOM. Usoro ejikọtara na onye ọrụ mgbọrọgwụ nwere akara dị ala ma ọ dị obere ka a ga-amanye ịkwụsị.

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

NJ usoro Postgres bụ 3813, yabụ na shei ọzọ, enwere ike nweta akara ahụ site na iji paramita kernel a. oom_score:

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

Ọ bụrụ na ịchọghị OOM-Killer igbu usoro a ma ọlị, enwere nhọrọ kernel ọzọ: oom_score_adj. Tinye nnukwu uru na-adịghị mma iji belata ohere ịmecha usoro ị ji kpọrọ ihe.

sudo echo -100 > /proc/3813/oom_score_adj

Iji tọọ uru oom_score_adj, tọọ OOMScoreAdjust na ngọngọ ọrụ:

[Service]
OOMScoreAdjust=-1000

Ma ọ bụ jiri oomprotect na otu rcctl.

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

Mmanye nkwụsị nke usoro

Mgbe ahọpụtara otu ma ọ bụ karịa usoro, OOM-Killer na-akpọ ọrụ ahụ oom_kill_task(). Ọrụ a na-eziga mgbaama nkwụsị na usoro. N'ihe gbasara ụkọ ebe nchekwa oom_kill() Na-akpọ ọrụ a ka izipu mgbaama SIGKILL na usoro a. A na-edere ozi na ndekọ kernel.

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

Otu esi ejikwa OOM-Killer

Na Linux, ị nwere ike mee ma ọ bụ gbanyụọ OOM-Killer (ọ bụ ezie na akwadoghị nke ikpeazụ). Iji mee ka ma ọ bụ gbanyụọ jiri oke vm.oom-kill. Iji mee ka OOM-Killer rụọ ọrụ n'oge a na-agba ọsọ, gbaa iwu ahụ sysctl.

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

Iji gbanyụọ OOM-Killer, ezipụta uru 0 n'otu iwu ahụ:

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

A gaghị echekwa nsonaazụ nke iwu a ruo mgbe ebighị ebi, mana ọ bụ naanị ruo mgbe mbido mbụ. Ọ bụrụ na ịchọrọ nkwụsi ike karịa, tinye ahịrị a na faịlụ ahụ /etc/sysctl.conf:

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

Ụzọ ọzọ iji mee ka ma gbanyụọ bụ ide mgbanwe panic_on_oom. Enwere ike ịlele uru ahụ mgbe niile /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Ọ bụrụ na ịtọọ uru na 0, mgbe ebe nchekwa gwụchara, ụjọ agaghị enwe kernel.

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

Ọ bụrụ na ịtọọ uru na 1, mgbe ebe nchekwa ahụ kwụsịrị, ụjọ ga-eme kernel.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer enweghị ike ịgbanwuo ma gbanyụọ naanị. Anyị ekwuola na Linux nwere ike idowe ọtụtụ ebe nchekwa maka usoro karịa ka ọ dị na-ekenyeghị ya n'ezie, yana usoro kernel Linux na-achịkwa omume a. Onye na-agbanwe agbanwe bụ maka nke a vm.overcommit_memory.

Ị nwere ike ịkọwapụta ụkpụrụ ndị a maka ya:

0: Mkpụrụ n'onwe ya na-ekpebi ma ọ ga-edobe oke ebe nchekwa. Nke a bụ ndabara na ọtụtụ ụdị Linux.
1: Mkpụrụ ndụ ga-edobe ebe nchekwa ọzọ. Nke a dị ize ndụ, n'ihi na ebe nchekwa nwere ike ịpụ, n'ihi na, o yikarịrị, otu ụbọchị usoro ga-achọ ya.
2: kernel agaghị edobe ebe nchekwa karịa ka akọwapụtara na oke overcommit_ratio.

Site na oke a, ị na-akọwapụta pasentị ebe nchekwa ekwenyere ka edobere karịa. Ọ bụrụ na enweghị ohere maka ya, ọ nweghị ebe nchekwa ekenyela, a ga-ajụkwa ndoputa ahụ. Nke a bụ nhọrọ kacha dịrị nchebe maka PostgreSQL. OOM-Killer na-emetụta ihe ọzọ - ike mgbanwe, nke mgbanwe na-achịkwa cat /proc/sys/vm/swappiness. Ụkpụrụ ndị a na-agwa kernel ka esi edozi ibe akwụkwọ. Ọnụ ahịa dị elu karị, ọ ga-abụ na OOM ga-akwụsị usoro ahụ, ma n'ihi ọrụ I / O ọ na-enwe mmetụta ọjọọ na nchekwa data. Na nke ọzọ - ọnụ ahịa dị ala, nke dị elu nke ohere OOM-Killer ntinye aka, mana arụmọrụ nchekwa data dịkwa elu. Uru ndabara bụ 60, mana ọ bụrụ na nchekwa data niile dabara na ebe nchekwa, ọ ka mma ịtọ uru na 1.

Nsonaazụ

Ekwela ka "onye na-egbu" na OOM-Killer mee gị ụjọ. N'okwu a, onye na-egbu egbu ga-abụ onye nzọpụta nke usoro gị. Ọ "na-egbu" usoro kachasị njọ ma na-azọpụta usoro ahụ site na ịdaba. Iji zere inwe iji OOM-Killer kwụsị PostgreSQL, tọọ ka vm.overcommit_memory uru 2. Nke a anaghị ekwe nkwa na OOM-Killer agaghị etinye aka, ma ọ ga-ebelata ohere nke ịmanye usoro PostgreSQL ka ọ kwụsị.

isi: www.habr.com

Tinye a comment