
Wakati ndani Linux Seva ya hifadhidata huisha bila kutarajia, na chanzo kinahitaji kubainishwa. 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
Wakati wewe seva au mchakato unaishiwa na kumbukumbu, Linux Killer ya Nje ya Kumbukumbu hutoa suluhisho mbili: kuzima mfumo mzima au kukomesha mchakato (programu) unaokula kumbukumbu. Ni bora, bila shaka, kukomesha mchakato na kuokoa OS kutokana na kukatika. Kwa kifupi, Killer ya Nje ya Kumbukumbu ni mchakato unaokomesha programu ili kuokoa kiini kutokana na kukatika. Hutoa sadaka programu ili kuweka OS ikifanya kazi. Hebu kwanza tujadili jinsi OOM inavyofanya kazi na jinsi ya kuidhibiti, na kisha tuangalie jinsi Killer ya OOM inavyoamua programu zipi za kukomesha.
Mojawapo ya kazi kuu Linux — Gawanya kumbukumbu kwa michakato wanapoiomba. Kwa kawaida, mchakato au programu huomba kumbukumbu kutoka kwa OS lakini haitumii kabisa. Ikiwa OS itagawanya kumbukumbu kwa kila mtu anayeiomba lakini haina mpango wa kuitumia, mfumo utaishiwa na kumbukumbu haraka, na mfumo utaanguka. Ili kuzuia hili, OS huhifadhi kumbukumbu kwa mchakato lakini haigawanyi. Kumbukumbu hutengwa tu wakati mchakato unakusudia kuitumia. Wakati mwingine OS haina kumbukumbu ya bure, lakini hugawa kumbukumbu kwa mchakato, na wakati mchakato unahitaji, OS hugawa ikiwa inaweza. Ubaya ni kwamba wakati mwingine OS huhifadhi kumbukumbu, lakini inapohitajika, hakuna kumbukumbu ya bure, na kusababisha ajali ya mfumo. OOM ina jukumu muhimu katika hali hii, kukomesha michakato ili kuzuia kiini kutokana na hofu. Wakati mchakato wa PostgreSQL unapokomeshwa kwa nguvu, ujumbe ufuatao unaonekana kwenye kumbukumbu:
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.
- Kernel inahitaji kumbukumbu ya chini yenyewe.
- Unahitaji kufungua kumbukumbu nyingi.
- Hakuna haja ya kusitisha michakato inayotumia kumbukumbu kidogo.
- Taratibu za chini kabisa zinahitajika kukamilika.
- 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
2Ikiwa 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_adjIli kuweka thamani oom_score_adj, weka OOMScoreAdjust kwenye kizuizi cha huduma:
[Service]
OOMScoreAdjust=-1000Au tumia oomprotect katika timu rcctl.
rcctl set <i>servicename</i> oomprotect -1000Lazimisha 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
В Linux Unaweza kuwezesha au kuzima OOM-Killer (ingawa ya mwisho haipendekezwi). Ili kuiwezesha au kuizima, tumia kigezo vm.oom-kill. Ili kuwezesha OOM-Killer wakati wa kukimbia, endesha amri sysctl.
sudo -s sysctl -w vm.oom-kill = 1Ili kuzima OOM-Killer, taja thamani 0 kwa amri sawa:
sudo -s sysctl -w vm.oom-kill = 0Matokeo 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.confNjia nyingine ya kuwezesha na kulemaza ni kuandika kutofautisha panic_on_oom. Thamani inaweza kuangaliwa kila wakati /proc.
$ cat /proc/sys/vm/panic_on_oom
0Ikiwa utaweka thamani kwa 0, basi kumbukumbu inapoisha, hakutakuwa na hofu ya kernel.
$ echo 0 > /proc/sys/vm/panic_on_oomIkiwa utaweka thamani kwa 1, basi wakati kumbukumbu itaisha, hofu ya kernel itatokea.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer inaweza kuwashwa na kuzimwa, kama tulivyokwisha sema. Linux inaweza kuhifadhi kumbukumbu zaidi kwa michakato kuliko inayopatikana, lakini isiigawanye, na tabia hii inadhibitiwa na kigezo cha kernel LinuxKigezo kinawajibika kwa hili. vm.overcommit_memory.
Unaweza kutaja maadili yafuatayo kwa ajili yake:
0: Kiini chenyewe huamua kama kuhifadhi kumbukumbu nyingi sana. Hii ndiyo thamani chaguo-msingi katika matoleo mengi. 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
