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ị.
- kernel chọrọ ụfọdụ ebe nchekwa kacha nta maka onwe ya.
- Ịkwesịrị ịtọhapụ ọtụtụ ebe nchekwa.
- Ọ dịghị mkpa ịkwụsị usoro ndị na-eji obere ebe nchekwa.
- Ekwesịrị imecha usoro kacha nta.
- 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