Kuanzisha Killer Nje ya Kumbukumbu katika Linux kwa PostgreSQL

Kuanzisha Killer Nje ya Kumbukumbu katika Linux kwa PostgreSQL

Wakati seva ya hifadhidata inapoacha kazi bila kutarajiwa katika Linux, unahitaji kupata sababu. Kunaweza kuwa na sababu kadhaa. Kwa mfano, SIGSEGV - kutofaulu kwa sababu ya hitilafu kwenye seva ya nyuma. Lakini hii ni nadra. Mara nyingi, unapoteza nafasi ya diski au kumbukumbu. Ikiwa unatumia nafasi ya diski, kuna njia moja tu ya kutoka - fungua nafasi na uanze upya hifadhidata.

Muuaji wa Kumbukumbu Nje ya Kumbukumbu

Seva au mchakato unapoishiwa na kumbukumbu, Linux hutoa suluhu 2: kuharibu mfumo mzima au kusitisha mchakato (programu) ambao unakula kumbukumbu. Ni bora, bila shaka, kusitisha mchakato na kuokoa OS kutokana na ajali. Kwa kifupi, Out-Of-Memory Killer ni mchakato unaoua programu ili kuokoa punje kutokana na kuanguka. Inatoa dhabihu maombi ili kuweka OS iendelee. Hebu kwanza tujadili jinsi OOM inavyofanya kazi na jinsi ya kuidhibiti, na kisha tuone jinsi OOM Killer huamua ni programu gani ya kusitisha.

Moja ya kazi kuu za Linux ni kutenga kumbukumbu kwa michakato wakati wanaiuliza. Kwa kawaida, mchakato au maombi huomba kumbukumbu kutoka kwa OS, lakini haitumii kikamilifu. Ikiwa OS inatoa kumbukumbu kwa kila mtu anayeiuliza lakini hana mpango wa kuitumia, hivi karibuni kumbukumbu itaisha na mfumo utashindwa. Ili kuepuka hili, OS huhifadhi kumbukumbu kwa mchakato, lakini haitoi kwa kweli. Kumbukumbu inatolewa tu wakati mchakato utaitumia. Inatokea kwamba OS haina kumbukumbu ya bure, lakini inapeana kumbukumbu kwa mchakato, na wakati mchakato unahitaji, OS inaigawa ikiwa inaweza. Kikwazo ni kwamba wakati mwingine OS huhifadhi kumbukumbu, lakini kwa wakati unaofaa hakuna kumbukumbu ya bure, na mfumo unaanguka. OOM ina jukumu muhimu katika hali hii na hukatisha michakato ili kuzuia punje kuogopa. Wakati mchakato wa PostgreSQL unalazimishwa kusitisha, ujumbe unaonekana kwenye logi:

Out of Memory: Killed process 12345 (postgres).

Ikiwa mfumo una kumbukumbu ndogo na hauwezi kuachiliwa, kazi inaitwa out_of_memory. Katika hatua hii, ana jambo moja tu la kufanya - kukamilisha mchakato mmoja au zaidi. Je, OOM-muuaji anapaswa kusitisha mchakato huo mara moja au inaweza kusubiri? Kwa wazi, wakati out_of_memory inaitwa, ni kutokana na kusubiri operesheni ya I / O au paging kwenye diski. Kwa hivyo, muuaji wa OOM lazima kwanza afanye ukaguzi na, kwa msingi wao, aamue kuwa mchakato unahitaji kukomeshwa. Ikiwa ukaguzi wote ulio hapa chini ni mzuri, OOM itasitisha mchakato huo.

Uchaguzi wa mchakato

Wakati kumbukumbu inaisha, kazi inaitwa out_of_memory(). Ina kipengele select_bad_process(), ambayo hupokea tathmini kutoka kwa chaguo la kukokotoa badness(). Mchakato "mbaya zaidi" utalengwa. Kazi badness() huchagua mchakato kulingana na sheria fulani.

  1. Kernel inahitaji kumbukumbu ya chini yenyewe.
  2. Unahitaji kufungua kumbukumbu nyingi.
  3. Hakuna haja ya kusitisha michakato inayotumia kumbukumbu kidogo.
  4. Taratibu za chini kabisa zinahitajika kukamilika.
  5. Algoriti changamano zinazoongeza uwezekano wa kukamilika kwa michakato hiyo ambayo mtumiaji mwenyewe anataka kukamilisha.

Baada ya kukamilisha ukaguzi huu wote, OOM inachunguza alama (oom_score) OOM inateua oom_score kila mchakato, na kisha kuzidisha thamani hii kwa kiasi cha kumbukumbu. Michakato yenye thamani kubwa ina uwezekano mkubwa wa kuathiriwa na OOM Killer. Michakato inayohusishwa na mtumiaji wa mizizi ina alama ya chini na ina uwezekano mdogo wa kulazimishwa kukomesha.

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

Kitambulisho cha mchakato wa Postgres ni 3813, kwa hivyo kwenye ganda lingine inawezekana kupata alama kwa kutumia paramu hii ya kernel. oom_score:

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

Ikiwa hutaki OOM-Killer kuua mchakato kabisa, kuna chaguo jingine la kernel: oom_score_adj. Ongeza thamani kubwa hasi ili kupunguza uwezekano wa kukamilisha mchakato unaouthamini.

sudo echo -100 > /proc/3813/oom_score_adj

Ili kuweka thamani oom_score_adj, weka OOMScoreAdjust kwenye kizuizi cha huduma:

[Service]
OOMScoreAdjust=-1000

Au tumia oomprotect katika timu rcctl.

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

Lazimisha kusitisha mchakato

Wakati mchakato mmoja au zaidi tayari umechaguliwa, OOM-Killer huita kitendakazi oom_kill_task(). Chaguo hili la kukokotoa hutuma ishara ya kusitisha mchakato. Katika kesi ya upungufu wa kumbukumbu oom_kill() Huita chaguo hili la kukokotoa kutuma ishara ya SIGKILL kwa mchakato. Ujumbe umeandikwa kwa logi ya kernel.

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

Jinsi ya kudhibiti OOM-Killer

Kwenye Linux, unaweza kuwezesha au kuzima OOM-Killer (ingawa ya mwisho haifai). Ili kuwezesha au kuzima tumia kigezo vm.oom-kill. Ili kuwezesha OOM-Killer wakati wa kukimbia, endesha amri sysctl.

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

Ili kuzima OOM-Killer, taja thamani 0 kwa amri sawa:

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

Matokeo ya amri hii hayatahifadhiwa milele, lakini tu hadi reboot ya kwanza. Ikiwa unahitaji kuendelea zaidi, ongeza mstari huu kwenye faili /etc/sysctl.conf:

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

Njia nyingine ya kuwezesha na kulemaza ni kuandika kutofautisha panic_on_oom. Thamani inaweza kuangaliwa kila wakati /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Ikiwa utaweka thamani kwa 0, basi kumbukumbu inapoisha, hakutakuwa na hofu ya kernel.

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

Ikiwa utaweka thamani kwa 1, basi wakati kumbukumbu itaisha, hofu ya kernel itatokea.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer haiwezi tu kuwashwa na kuzima. Tayari tumesema kwamba Linux inaweza kuhifadhi kumbukumbu zaidi kwa michakato kuliko inapatikana bila kuigawa, na tabia hii inadhibitiwa na kigezo cha kinu cha Linux. Tofauti inawajibika kwa hili vm.overcommit_memory.

Unaweza kutaja maadili yafuatayo kwa ajili yake:

0: Kernel yenyewe huamua ikiwa itahifadhi kumbukumbu nyingi. Hili ndilo chaguomsingi kwenye matoleo mengi ya Linux.
1: Kernel itahifadhi kumbukumbu ya ziada kila wakati. Hii ni hatari, kwa sababu kumbukumbu inaweza kukimbia, kwa sababu, uwezekano mkubwa, siku moja taratibu zitahitajika.
2: kernel haitahifadhi kumbukumbu zaidi kuliko ilivyoainishwa kwenye parameta overcommit_ratio.

Kwa kigezo hiki, unabainisha asilimia ya kumbukumbu ambayo inaruhusiwa kuhifadhiwa kupita kiasi. Ikiwa hakuna nafasi yake, hakuna kumbukumbu iliyotengwa, na uhifadhi utakataliwa. Hili ndilo chaguo salama zaidi linalopendekezwa kwa PostgreSQL. OOM-Killer huathiriwa na kipengele kingine - uwezo wa kubadilishana, ambao unadhibitiwa na kutofautiana cat /proc/sys/vm/swappiness. Maadili haya huambia kernel jinsi ya kushughulikia paging. Kadiri thamani inavyokuwa juu, ndivyo uwezekano mdogo wa OOM utakavyositisha mchakato huo, lakini kwa sababu ya shughuli za I/O huwa na athari hasi kwenye hifadhidata. Na kinyume chake - chini ya thamani, juu ya uwezekano wa kuingilia kwa OOM-Killer, lakini utendaji wa database pia ni wa juu. Thamani chaguo-msingi ni 60, lakini ikiwa hifadhidata nzima inafaa kwenye kumbukumbu, ni bora kuweka thamani kwa 1.

Matokeo ya

Usiruhusu "muuaji" katika OOM-Killer akuogopeshe. Katika kesi hii, muuaji atakuwa mwokozi wa mfumo wako. "Inaua" taratibu mbaya zaidi na huokoa mfumo kutoka kwa kuanguka. Ili kuzuia kutumia OOM-Killer kusitisha PostgreSQL, weka vm.overcommit_memory thamani 2. Hii haihakikishi kuwa OOM-Killer haitalazimika kuingilia kati, lakini itapunguza uwezekano wa kulazimisha mchakato wa PostgreSQL kukomesha.

Chanzo: mapenzi.com

Kuongeza maoni