PostgreSQL үшін Linux жүйесінде жадтан тыс жою құралын орнату

PostgreSQL үшін Linux жүйесінде жадтан тыс жою құралын орнату

Linux жүйесінде дерекқор сервері күтпеген жерден өшіп қалса, оның себебін табу керек. Бірнеше себептер болуы мүмкін. Мысалы, SIGSEGV — сервер серверіндегі қатеге байланысты сәтсіздік. Бірақ бұл сирек. Көбінесе сізде дискілік кеңістік немесе жад таусылады. Дискідегі бос орын таусылған жағдайда, шығудың бір ғана жолы бар - орынды босатыңыз және дерекқорды қайта іске қосыңыз.

Жадтан тыс өлтіруші

Серверде немесе процесте жад таусылғанда, Linux 2 шешімді ұсынады: бүкіл жүйені бұзу немесе жадты жеп жатқан процесті (қолданбаны) тоқтату. Әрине, процесті тоқтатып, ОЖ-ны бұзылудан сақтау жақсы. Қысқаша айтқанда, жадтан тыс өлтіргіш - ядроны бұзылудан сақтау үшін қолданбаны өлтіретін процесс. Ол ОЖ жұмыс істеп тұруы үшін қолданбаны құрбан етеді. Алдымен OOM қалай жұмыс істейтінін және оны қалай басқару керектігін талқылайық, содан кейін OOM Killer қай қолданбаны тоқтату керектігін қалай шешетінін көрейік.

Linux-тың негізгі міндеттерінің бірі - процесстер сұраған кезде жадты бөлу. Әдетте, процесс немесе қолданба ОЖ-дан жадты сұрайды, бірақ оны толық пайдаланбайды. Егер ОЖ жадты сұраған, бірақ оны пайдалануды жоспарламағандардың барлығына берсе, көп ұзамай жад таусылады және жүйе істен шығады. Бұған жол бермеу үшін ОЖ процесс үшін жадты сақтайды, бірақ оны іс жүзінде шығармайды. Жад процесс оны нақты пайдаланатын кезде ғана бөлінеді. ОЖ-да бос жады болмайды, бірақ ол жадты процесске тағайындайды және процесс қажет болғанда, ОЖ мүмкін болса, оны бөледі. Кемшілігі - кейде ОЖ жадты сақтайды, бірақ қажетті уақытта бос жад қалмайды және жүйе бұзылады. OOM бұл сценарийде маңызды рөл атқарады және ядроның дүрбелеңіне жол бермеу үшін процестерді тоқтатады. PostgreSQL процесі тоқтатуға мәжбүр болғанда, журналда хабар пайда болады:

Out of Memory: Killed process 12345 (postgres).

Жүйеде жады аз болса және оны босату мүмкін болмаса, функция шақырылады out_of_memory. Бұл кезеңде оған бір ғана нәрсе қалды - бір немесе бірнеше процестерді аяқтау. OOM-киллер процесті дереу тоқтатуы керек пе, әлде күте ала ма? Әлбетте, жадтан_жоқ деп шақырғанда, ол енгізу/шығару операциясын күтуге немесе дискіге пейджинг жасауға байланысты. Сондықтан, OOM өлтіруші алдымен тексерулерді орындауы керек және олардың негізінде процесті тоқтату керек деп шешуі керек. Төмендегі барлық тексерулер оң болса, OOM процесті тоқтатады.

Процесті таңдау

Жад таусылғанда, функция шақырылады out_of_memory(). Оның функциясы бар select_bad_process(), ол функциядан баға алады badness(). «Ең нашар» процесс мақсатты болады. Функция badness() белгілі бір ережелерге сәйкес процесті таңдайды.

  1. Ядро өзі үшін ең аз жадты қажет етеді.
  2. Сізге көп жадты босату керек.
  3. Жадты аз пайдаланатын процестерді тоқтатудың қажеті жоқ.
  4. Ең аз процестер аяқталуы керек.
  5. Пайдаланушының өзі аяқтағысы келетін процестердің аяқталу мүмкіндігін арттыратын күрделі алгоритмдер.

Осы тексерулердің барлығын аяқтағаннан кейін 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 = 1

OOM-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_oom

OOM-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

пікір қалдыру