Ke haʻalele ʻole kahi kikowaena waihona ma Linux, pono ʻoe e ʻimi i ke kumu. Nui paha nā kumu. ʻo kahi laʻana, SIGSEGV — hāʻule ʻole ma muli o ka hewa i loko o ke kikowaena hope. Akā kakaikahi kēia. ʻO ka pinepine, pau ʻoe i waho o kahi disk a i ʻole ka hoʻomanaʻo. Inā pau ʻoe i waho o ka hakahaka diski, hoʻokahi wale nō ala i waho - hoʻokuʻu i ka hakahaka a hoʻomaka hou i ka waihona.
Killer-O-Memory
Ke pau ka hoʻomanaʻo ʻana o kahi kikowaena a i ʻole kaʻina hana, hāʻawi ʻo Linux i nā hoʻonā 2: hoʻopau i ka ʻōnaehana holoʻokoʻa a hoʻopau paha i ke kaʻina hana (noi) e ʻai ana i ka hoʻomanaʻo. ʻOi aku ka maikaʻi, ʻoiaʻiʻo, e hoʻopau i ke kaʻina hana a mālama i ka OS mai ka hāʻule ʻana. Ma kahi pōkole, ʻo Out-Of-Memory Killer kahi hana e pepehi ai i kahi noi e hoʻopakele i ka kernel mai ka hāʻule ʻana. Hāʻawi ia i ka noi e mālama i ka holo ʻana o ka OS. E kūkākūkā mua kākou i ka hana ʻana o OOM a pehea e hoʻomalu ai, a laila e ʻike pehea e hoʻoholo ai ʻo OOM Killer i ka noi e hoʻopau ai.
ʻO kekahi o nā hana nui o Linux ʻo ka hoʻokaʻawale ʻana i ka hoʻomanaʻo i nā kaʻina hana ke noi lākou. ʻO ka mea maʻamau, noi ke kaʻina hana a noi paha i ka hoʻomanaʻo mai ka OS, akā ʻaʻole hoʻohana piha ia. Inā hāʻawi ka OS i ka hoʻomanaʻo i ka poʻe a pau e noi ana iā ia akā ʻaʻohe manaʻo e hoʻohana iā ia, e pau koke ka hoʻomanaʻo a pau ka ʻōnaehana. No ka pale ʻana i kēia, mālama ka OS i ka hoʻomanaʻo no ke kaʻina hana, akā ʻaʻole ia e hoʻokuʻu maoli. Hoʻokaʻawale ʻia ka hoʻomanaʻo i ka wā e hoʻohana maoli ai kahi kaʻina hana. ʻAʻole loaʻa ka hoʻomanaʻo manuahi o ka OS, akā hāʻawi ia i ka hoʻomanaʻo i kahi kaʻina hana, a i ka wā e pono ai ke kaʻina hana, hāʻawi ka OS iā ia inā hiki. ʻO ka haʻahaʻa ʻo ia i kekahi manawa mālama ka OS i ka hoʻomanaʻo, akā i ka manawa kūpono ʻaʻohe hoʻomanaʻo manuahi, a hāʻule ka ʻōnaehana. He kuleana koʻikoʻi ka OOM i kēia hiʻohiʻona a hoʻopau i nā kaʻina hana e pale ai i ka kernel mai ka hopohopo. Ke koi ʻia kahi kaʻina hana PostgreSQL e hoʻopau, ʻike ʻia kahi leka ma ka log:
Out of Memory: Killed process 12345 (postgres).
Inā haʻahaʻa ka ʻōnaehana ma ka hoʻomanaʻo a ʻaʻole hiki ke hoʻokuʻu ʻia, kāhea ʻia ka hana out_of_memory
. I kēia pae, hoʻokahi wale nō mea āna e hana ai - hoʻopau i hoʻokahi a ʻoi aku paha kaʻina hana. Pono anei ʻo OOM-killer e hoʻopau koke i ke kaʻina hana a hiki paha ke kali? ʻIke ʻia, ke kāhea ʻia ʻo out_of_memory, ma muli o ke kali ʻana i kahi hana I/O a i ʻole ka ʻaoʻao i ka disk. No laila, pono e hana mua ka mea pepehi kanaka OOM a, ma muli o ia mau mea, e hoʻoholo e hoʻopau ke kaʻina hana. Inā maikaʻi nā loiloi a pau ma lalo nei, e hoʻopau ʻo OOM i ke kaʻina hana.
Kaʻina hana koho
Ke pau ka hoʻomanaʻo, kāhea ʻia ka hana out_of_memory()
. He hana kona select_bad_process()
, loaʻa ka loiloi mai ka hana badness()
. E kuhikuhi ʻia ke kaʻina hana "ʻoi loa". Hana badness()
koho i ka hana e like me kekahi mau rula.
- Pono ka kernel i kahi hoʻomanaʻo liʻiliʻi nona iho.
- Pono ʻoe e hoʻokuʻu i ka nui o ka hoʻomanaʻo.
- ʻAʻohe pono e hoʻopau i nā kaʻina hana e hoʻohana ana i ka hoʻomanaʻo liʻiliʻi.
- Pono e hoʻopau i nā kaʻina hana liʻiliʻi.
- ʻO nā algorithms paʻakikī e hoʻonui i ka manawa o ka hoʻopau ʻana no kēlā mau kaʻina hana a ka mea hoʻohana ponoʻī e makemake e hoʻopau.
Ma hope o ka hoʻopau ʻana i kēia mau loiloi, nānā ʻo OOM i ka helu (oom_score
). Hāʻawi ʻo OOM oom_score
kēlā me kēia kaʻina hana, a laila hoʻonui i kēia waiwai me ka nui o ka hoʻomanaʻo. ʻO nā kaʻina hana me nā waiwai nui e hāʻule paha i ka OOM Killer. ʻO nā kaʻina hana e pili ana i ka mea hoʻohana kumu he helu haʻahaʻa a ʻaʻole hiki ke koi ʻia e hoʻopau.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)
ʻO 3813 ka ID kaʻina hana Postgres, no laila ma kahi pūpū ʻē aʻe hiki ke kiʻi i ka helu me ka hoʻohana ʻana i kēia ʻāpana kernel oom_score
:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2
Inā ʻaʻole ʻoe makemake iā OOM-Killer e pepehi i ke kaʻina hana, aia kekahi koho kernel: oom_score_adj
. Hoʻohui i kahi waiwai maikaʻi ʻole e hōʻemi i ka manawa o ka hoʻopau ʻana i kahi kaʻina hana āu e manaʻo ai.
sudo echo -100 > /proc/3813/oom_score_adj
E hoʻonoho i kahi waiwai oom_score_adj
, hoʻonoho iā OOMScoreAdjust i ka poloka lawelawe:
[Service]
OOMScoreAdjust=-1000
A i ʻole hoʻohana oomprotect
ma kahi hui rcctl
.
rcctl set <i>servicename</i> oomprotect -1000
Hoʻopau ikaika i kahi kaʻina hana
Ke koho mua ʻia kahi kaʻina hana a ʻoi aku paha, kāhea ʻo OOM-Killer i ka hana oom_kill_task()
. Hoʻouna kēia hana i kahi hōʻailona hoʻopau i ke kaʻina hana. Inā pilikia ka hoʻomanaʻo oom_kill()
Kāhea i kēia hana e hoʻouna i kahi hōʻailona SIGKILL i ke kaʻina hana. Ua kākau ʻia kahi memo i ka log kernel.
Out of Memory: Killed process [pid] [name].
Pehea e hoʻomalu ai iā OOM-Killer
Ma Linux, hiki iā ʻoe ke hoʻā a hoʻopau iā OOM-Killer (ʻoiai ʻaʻole ʻōlelo ʻia ka hope). E hoʻohana a hoʻopau paha i ka ʻāpana vm.oom-kill
. No ka hiki iā OOM-Killer i ka wā holo, e holo i ke kauoha sysctl
.
sudo -s sysctl -w vm.oom-kill = 1
No ka hoʻopau ʻana iā OOM-Killer, e kuhikuhi i ka waiwai 0 ma ke kauoha like:
sudo -s sysctl -w vm.oom-kill = 0
ʻAʻole e mālama mau ʻia ka hopena o kēia kauoha, akā a hiki i ka reboot mua. Inā makemake ʻoe i ka hoʻomau hou aku, e hoʻohui i kēia laina i ka faila /etc/sysctl.conf
:
echo vm.oom-kill = 1 >>/etc/sysctl.conf
ʻO kekahi ala e hiki ai a hoʻopau ʻia ʻo ke kākau ʻana i kahi loli panic_on_oom
. Hiki ke hoʻopaʻa ʻia ka waiwai i nā manawa a pau /proc
.
$ cat /proc/sys/vm/panic_on_oom
0
Inā hoʻonoho ʻoe i ka waiwai i ka 0, a laila i ka pau ʻana o ka hoʻomanaʻo, ʻaʻohe pilikia kernel.
$ echo 0 > /proc/sys/vm/panic_on_oom
Inā hoʻonoho ʻoe i ka waiwai i ka 1, a laila i ka pau ʻana o ka hoʻomanaʻo, e kū mai kahi kernel panic.
echo 1 > /proc/sys/vm/panic_on_oom
ʻAʻole hiki ke hoʻohuli a hoʻopau wale ʻia ʻo OOM-Killer. Ua ʻōlelo mua mākou hiki iā Linux ke mālama i nā hoʻomanaʻo hou aʻe no nā kaʻina hana ma mua o ka loaʻa ʻole me ka ʻole o ka hoʻokaʻawale ʻana iā ia, a mālama ʻia kēia ʻano e kahi ʻāpana kernel Linux. ʻO ka loli ke kuleana no kēia vm.overcommit_memory
.
Hiki iā ʻoe ke kuhikuhi i kēia mau waiwai no ia:
0: ʻO ka kernel ponoʻī e hoʻoholo inā e mālama i ka nui o ka hoʻomanaʻo. ʻO kēia ka paʻamau ma ka hapa nui o nā mana o Linux.
1: E mālama mau ka kernel i ka hoʻomanaʻo hou. He pilikia kēia, no ka mea, pau ka hoʻomanaʻo, no ka mea, ʻoi aku paha, i kekahi lā e koi ʻia nā kaʻina hana.
2: ʻAʻole mālama ka kernel i ka hoʻomanaʻo ʻoi aku ma mua o ka mea i kuhikuhi ʻia ma ka ʻāpana overcommit_ratio
.
Me kēia ʻāpana, kuhikuhi ʻoe i ka pākēneka o ka hoʻomanaʻo i ʻae ʻia e mālama ʻia. Inā ʻaʻohe wahi no ia, ʻaʻohe hoʻomanaʻo i hoʻokaʻawale ʻia, a e hōʻole ʻia ka mālama ʻana. ʻO kēia ka koho palekana i manaʻo ʻia no PostgreSQL. Hoʻopili ʻia ʻo OOM-Killer e kekahi mea ʻē aʻe - ka hiki ke hoʻololi, i hoʻomalu ʻia e ka mea hoʻololi cat /proc/sys/vm/swappiness
. Hōʻike kēia mau waiwai i ka kernel pehea e mālama ai i ka paging. ʻO ke kiʻekiʻe o ka waiwai, ʻoi aku ka liʻiliʻi o ka OOM e hoʻopau i ke kaʻina hana, akā ma muli o nā hana I/O he hopena maikaʻi ʻole ia ma ka waihona. A ʻo ka hope - ʻo ka haʻahaʻa o ka waiwai, ʻoi aku ka kiʻekiʻe o ka hoʻopili ʻana o OOM-Killer, akā ʻoi aku ka kiʻekiʻe o ka hana ʻikepili. ʻO 60 ka waiwai paʻamau, akā inā kūpono ka waihona waihona i ka hoʻomanaʻo, ʻoi aku ka maikaʻi o ka hoʻonohonoho ʻana i ka waiwai i 1.
Nā hopena
Mai ʻae i ka "killer" ma OOM-Killer e hoʻoweliweli iā ʻoe. I kēia hihia, ʻo ka mea pepehi ka mea hoʻopakele o kāu ʻōnaehana. "Pepehi" ia i nā kaʻina hana ʻino loa a mālama i ka ʻōnaehana mai ka hāʻule ʻana. I mea e pale aku ai i ka hoʻohana ʻana iā OOM-Killer e hoʻopau i ka PostgreSQL, hoʻonohonoho i vm.overcommit_memory
waiwai 2. ʻAʻole kēia e hōʻoiaʻiʻo ʻaʻole pono ʻo OOM-Killer e hoʻopili, akā e hōʻemi ia i ka hiki ke koi i ke kaʻina PostgreSQL e hoʻopau.
Source: www.habr.com