Ke hoʻonohonoho nei i waho-Of-Memory Killer ma Linux no PostgreSQL

Ke hoʻonohonoho nei i waho-Of-Memory Killer ma Linux no PostgreSQL

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.

  1. Pono ka kernel i kahi hoʻomanaʻo liʻiliʻi nona iho.
  2. Pono ʻoe e hoʻokuʻu i ka nui o ka hoʻomanaʻo.
  3. ʻAʻohe pono e hoʻopau i nā kaʻina hana e hoʻohana ana i ka hoʻomanaʻo liʻiliʻi.
  4. Pono e hoʻopau i nā kaʻina hana liʻiliʻi.
  5. ʻ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

Pākuʻi i ka manaʻo hoʻopuka