
Қашан Linux Дерекқор сервері күтпеген жерден тоқтайды және себебін анықтау қажет. Бірнеше себеп болуы мүмкін. Мысалы, SIGSEGV — сервер серверіндегі қатеге байланысты сәтсіздік. Бірақ бұл сирек. Көбінесе сізде дискілік кеңістік немесе жад таусылады. Дискідегі бос орын таусылған жағдайда, шығудың бір ғана жолы бар - орынды босатыңыз және дерекқорды қайта іске қосыңыз.
Жадтан тыс өлтіруші
Сіз қашан сервер немесе процесс жадыда орын таусылады, Linux Жад жетіспеушілігін жою құралы екі шешім ұсынады: бүкіл жүйені істен шығару немесе жадты жеп жатқан процесті (қосымшаны) тоқтату. Әрине, процесті тоқтатып, ОС-ты істен шығудан сақтаған дұрыс. Қысқасы, Жад жетіспеушілігін жою құралы - ядроны істен шығудан сақтау үшін қолданбаны тоқтататын процесс. Ол ОС жұмыс істеп тұруы үшін қолданбаны құрбан етеді. Алдымен OOM қалай жұмыс істейтінін және оны қалай басқару керектігін талқылайық, содан кейін OOM жою құралы қай қолданбаларды тоқтату керектігін қалай шешетінін қарастырайық.
Негізгі міндеттердің бірі Linux — Процесстер сұраған кезде оларға жад бөлу. Әдетте, процесс немесе қолданба ОС-тан жад сұрайды, бірақ оны толық пайдаланбайды. Егер ОС жадты сұраған, бірақ пайдалануды жоспарламаған әрбір адамға бөлсе, жүйе жады тез таусылып, жүйе істен шығады. Мұның алдын алу үшін ОС процесс үшін жадты сақтайды, бірақ оны іс жүзінде бөлмейді. Жад тек процесс оны іс жүзінде пайдаланғысы келгенде ғана бөлінеді. Кейде ОС-та бос жад болмайды, бірақ ол процеске жад бөледі, ал процеске қажет болған кезде, ОС оны мүмкін болса, бөледі. Кемшілігі - кейде ОС жадты сақтайды, бірақ қажет болған кезде бос жад болмайды, бұл жүйенің істен шығуына әкеледі. OOM бұл сценарийде маңызды рөл атқарады, ядроның үрейленуіне жол бермеу үшін процестерді тоқтатады. PostgreSQL процесі күштеп тоқтатылған кезде, журналда келесі хабарлама пайда болады:
Out of Memory: Killed process 12345 (postgres).Жүйеде жады аз болса және оны босату мүмкін болмаса, функция шақырылады out_of_memory. Бұл кезеңде оған бір ғана нәрсе қалды - бір немесе бірнеше процестерді аяқтау. OOM-киллер процесті дереу тоқтатуы керек пе, әлде күте ала ма? Әлбетте, жадтан_жоқ деп шақырғанда, ол енгізу/шығару операциясын күтуге немесе дискіге пейджинг жасауға байланысты. Сондықтан, OOM өлтіруші алдымен тексерулерді орындауы керек және олардың негізінде процесті тоқтату керек деп шешуі керек. Төмендегі барлық тексерулер оң болса, OOM процесті тоқтатады.
Процесті таңдау
Жад таусылғанда, функция шақырылады out_of_memory(). Оның функциясы бар select_bad_process(), ол функциядан баға алады badness(). «Ең нашар» процесс мақсатты болады. Функция badness() белгілі бір ережелерге сәйкес процесті таңдайды.
- Ядро өзі үшін ең аз жадты қажет етеді.
- Сізге көп жадты босату керек.
- Жадты аз пайдаланатын процестерді тоқтатудың қажеті жоқ.
- Ең аз процестер аяқталуы керек.
- Пайдаланушының өзі аяқтағысы келетін процестердің аяқталу мүмкіндігін арттыратын күрделі алгоритмдер.
Осы тексерулердің барлығын аяқтағаннан кейін OOM ұпайды тексереді (oom_score). OOM тағайындайды oom_score әрбір процесс, содан кейін бұл мәнді жад көлеміне көбейтеді. Үлкен мәндері бар процестер OOM Killer құрбаны болу ықтималдығы жоғары. Түбірлік пайдаланушымен байланысты процестер төменірек ұпайға ие және оларды тоқтатуға мәжбүрлеу ықтималдығы аз.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)Postgres процесінің идентификаторы 3813, сондықтан басқа қабықшада осы ядро параметрін пайдаланып балл алуға болады. oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Егер сіз OOM-Killer процесті мүлде өлтіргіңіз келмесе, ядроның тағы бір нұсқасы бар: oom_score_adj. Өзіңіз бағалайтын процесті аяқтау мүмкіндігін азайту үшін үлкен теріс мән қосыңыз.
sudo echo -100 > /proc/3813/oom_score_adjМәнді орнату үшін oom_score_adj, қызмет блогында OOMScoreAdjust орнатыңыз:
[Service]
OOMScoreAdjust=-1000Немесе пайдаланыңыз oomprotect командада rcctl.
rcctl set <i>servicename</i> oomprotect -1000Процесті мәжбүрлеп тоқтату
Бір немесе бірнеше процесс таңдалған кезде, OOM-Killer функцияны шақырады oom_kill_task(). Бұл функция процеске тоқтату сигналын жібереді. Жады жеткіліксіз болған жағдайда oom_kill() Бұл функцияны процеске SIGKILL сигналын жіберу үшін шақырады. Хабар ядро журналына жазылады.
Out of Memory: Killed process [pid] [name].OOM-Killer-ді қалай басқаруға болады
В Linux OOM-Killer функциясын қосуға немесе өшіруге болады (бірақ соңғысы ұсынылмайды). Оны қосу немесе өшіру үшін параметрді пайдаланыңыз vm.oom-kill. Орындалу уақытында OOM-Killer қосу үшін пәрменді іске қосыңыз sysctl.
sudo -s sysctl -w vm.oom-kill = 1OOM-Killer өшіру үшін сол пәрменде 0 мәнін көрсетіңіз:
sudo -s sysctl -w vm.oom-kill = 0Бұл пәрменнің нәтижесі мәңгі сақталмайды, тек бірінші қайта жүктеуге дейін. Егер сізге көбірек табандылық қажет болса, осы жолды файлға қосыңыз /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confҚосудың және өшірудің тағы бір жолы - айнымалыны жазу panic_on_oom. Мәнді әрқашан тексеруге болады /proc.
$ cat /proc/sys/vm/panic_on_oom
0Егер сіз мәнді 0-ге орнатсаңыз, жад таусылғанда, ядролық дүрбелең болмайды.
$ echo 0 > /proc/sys/vm/panic_on_oomЕгер сіз мәнді 1-ге орнатсаңыз, жад таусылғанда, ядролық дүрбелең пайда болады.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer функциясын, жоғарыда айтылғандай, қосуға және өшіруге болады. Linux процестер үшін қолжетімді жадтан көбірек жад сақтауы мүмкін, бірақ оны іс жүзінде бөлмейді және бұл әрекет ядро параметрімен басқарылады LinuxАйнымалы бұған жауапты. vm.overcommit_memory.
Ол үшін келесі мәндерді көрсетуге болады:
0: Тым көп жадты сақтау керек пе, жоқ па, ядроның өзі шешеді. Бұл көптеген нұсқаларда әдепкі мән. Linux.
1: Ядро әрқашан қосымша жадты сақтайды. Бұл қауіпті, өйткені жад таусылуы мүмкін, себебі, бір күні процестер оны талап етеді.
2: ядро параметрде көрсетілгеннен артық жадты сақтамайды overcommit_ratio.
Бұл параметр арқылы артық резервтеуге рұқсат етілген жад пайызын көрсетесіз. Егер оған орын болмаса, жад бөлінбейді, брондаудан бас тартылады. Бұл PostgreSQL үшін ұсынылған ең қауіпсіз опция. OOM-Killer-ге басқа элемент әсер етеді - айнымалымен басқарылатын ауыстыру мүмкіндігі cat /proc/sys/vm/swappiness. Бұл мәндер ядроға пейджингті қалай өңдеу керектігін айтады. Мән неғұрлым жоғары болса, OOM процесті тоқтату ықтималдығы аз болады, бірақ енгізу/шығару әрекеттеріне байланысты ол дерекқорға теріс әсер етеді. Және керісінше - мән неғұрлым төмен болса, OOM-Killer араласу ықтималдығы соғұрлым жоғары болады, бірақ дерекқор өнімділігі де жоғары. Әдепкі мән - 60, бірақ бүкіл дерекқор жадқа сәйкес келсе, мәнді 1-ге қойған дұрыс.
Нәтижелері
OOM-Killer ішіндегі «өлтіруші» сізді қорқытпасын. Бұл жағдайда өлтіруші сіздің жүйеңіздің құтқарушысы болады. Ол ең нашар процестерді «өлтіреді» және жүйені бұзылудан сақтайды. PostgreSQL-ті тоқтату үшін OOM-Killer қолданбасын қолданбау үшін параметрін орнатыңыз vm.overcommit_memory мән 2. Бұл OOM-Killer-ге араласуға тура келмейтініне кепілдік бермейді, бірақ бұл PostgreSQL процесін тоқтатуға мәжбүрлеу ықтималдығын азайтады.
Ақпарат көзі: www.habr.com
