PostgreSQL үчүн Linux'та эстутумдан чыгуучу өлтүргүчтү орнотуу

PostgreSQL үчүн Linux'та эстутумдан чыгуучу өлтүргүчтү орнотуу

Linux'та маалымат базасы сервери күтүлбөгөн жерден иштен чыкканда, анын себебин табышыңыз керек. Мунун бир нече себептери болушу мүмкүн. Мисалы, СИГСЕГВ — сервердин сервериндеги мүчүлүштүктөн улам. Бирок бул сейрек кездешет. Көпчүлүк учурда, сиз жөн гана диск мейкиндиги же эстутум түгөнөт. Эгерде сизде диск мейкиндиги бүтсө, андан чыгуунун бир гана жолу бар - мейкиндикти бошотуп, маалымат базасын кайра иштетиңиз.

Эсте калган өлтүргүч

Сервердин же процесстин эстутуму түгөнүп калганда, Linux эки чечимди сунуштайт: бүт системаны кыйратыңыз же эстутумду жеп жаткан процессти (тиркемени) токтотуу. Албетте, процессти токтотуп, ОСту кыйроодон сактап калуу жакшы. Кыскача айтканда, Out-Of-Memory Killer бул ядрону кыйроодон сактап калуу үчүн тиркемени жок кылуучу процесс. Ал ОСтун иштеши үчүн тиркемени курман кылат. Келгиле, алгач OOM кантип иштээрин жана аны кантип башкарууну талкуулайлы, андан кийин OOM Killer кайсы колдонмону токтотууну кантип чечээрин карап көрөлү.

Linuxтун негизги милдеттеринин бири процесстерге эстутум сураганда бөлүштүрүү. Адатта, процесс же тиркеме ОСтен эстутумду талап кылат, бирок аны толук колдонбойт. Эгерде ОС эстутумду сурагандардын баарына, бирок аны колдонууну пландабаса, тез арада эс тутум түгөнүп, система иштебей калат. Мунун алдын алуу үчүн, ОС процесс үчүн эстутумду сактайт, бирок иш жүзүндө аны чыгарбайт. Эстутум процесс аны колдоно турганда гана бөлүнөт. OS бош эстутумга ээ эмес, бирок ал процесске эстутумду дайындайт жана процесске муктаж болгондо, ОС мүмкүн болсо, аны бөлүп берет. Кемчилиги - кээде ОС эстутумду сактайт, бирок керектүү учурда бош эстутум жок жана система бузулат. OOM бул сценарийде маанилүү ролду ойнойт жана ядронун дүрбөлөңгө түшүшүнө жол бербөө үчүн процесстерди токтотот. PostgreSQL процесси токтотууга аргасыз болгондо, журналда билдирүү пайда болот:

Out of Memory: Killed process 12345 (postgres).

Эгерде системанын эс тутуму аз болсо жана аны бошотуу мүмкүн болбосо, функция чакырылат out_of_memory. Бул этапта анын бир гана иши калды - бир же бир нече процессти бүтүрүү. OOM-киллер процессти дароо токтотушу керекпи же күтө алабы? Албетте, out_of_memory деп аталганда, бул киргизүү/чыгаруу операциясын күтүүгө же дискке пейджингге байланыштуу. Ошондуктан, 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 процессти токтотуу ыктымалдуулугу ошончолук аз болот, бирок I/O операцияларынан улам ал маалымат базасына терс таасирин тийгизет. Жана тескерисинче - маани канчалык төмөн болсо, OOM-Killer кийлигишүү ыктымалдыгы ошончолук жогору болот, бирок маалымат базасынын иштеши да жогору. Демейки маани - 60, бирок эгерде бардык маалымат базасы эстутумга туура келсе, маанини 1ге койгон жакшы.

натыйжалары

ООМ-Киллердеги "киллер" сени коркутпасын. Бул учурда, өлтүргүч системаңыздын куткаруучусу болот. Ал эң начар процесстерди "өлтүрөт" жана системаны кыйроодон сактап калат. PostgreSQLди токтотуу үчүн OOM-Killerди колдонбоңуз vm.overcommit_memory маани 2. Бул OOM-Killer кийлигишүүсүнүн кереги жок экенине кепилдик бербейт, бирок PostgreSQL процессин токтотууга мажбурлоо ыктымалдыгын азайтат.

Source: www.habr.com

Комментарий кошуу