
Качан Linux Маалымат базасынын сервери күтүүсүздөн ишин токтотот жана анын себебин аныктоо керек. Мунун бир нече себеби болушу мүмкүн. Мисалы, СИГСЕГВ — сервердин сервериндеги мүчүлүштүктөн улам. Бирок бул сейрек кездешет. Көпчүлүк учурда, сиз жөн гана диск мейкиндиги же эстутум түгөнөт. Эгерде сизде диск мейкиндиги бүтсө, андан чыгуунун бир гана жолу бар - мейкиндикти бошотуп, маалымат базасын кайра иштетиңиз.
Эсте калган өлтүргүч
Качан сиз сервер же процесстин эс тутуму түгөнүп калса, Linux Эстутумсуздуктан арылтуучу эки чечимди сунуштайт: бүтүндөй системаны иштен чыгаруу же эстутумду жеп жаткан процессти (тиркемени) токтотуу. Албетте, процессти токтотуп, ОСти иштен чыгаруудан сактап калган жакшы. Кыскасы, Эстутумсуздуктан арылтуучу - бул ядрону иштен чыгаруудан сактап калуу үчүн тиркемени токтоткон процесс. Ал ОСти иштетүү үчүн тиркемени курмандыкка чалат. Келгиле, алгач OOM кантип иштээрин жана аны кантип башкарууну талкуулайлы, андан кийин OOM өлтүргүчү кайсы тиркемелерди токтотууну кантип чечерин карап көрөлү.
Негизги милдеттердин бири Linux — Процесстер сураганда, аларга эстутумду бөлүп бериңиз. Адатта, процесс же тиркеме ОСтен эстутумду сурайт, бирок аны толугу менен колдонбойт. Эгерде ОС сураган, бирок колдонууну пландабаган ар бир адамга эстутумду бөлүп берсе, система тез эле эстутум түгөнүп калат жана система иштебей калат. Мунун алдын алуу үчүн, ОС процесс үчүн эстутумду сактап коёт, бирок аны чындыгында бөлүштүрбөйт. Эстутум процесс чындыгында аны колдонууну көздөгөндө гана бөлүштүрүлөт. Кээде ОСте бош эстутум жок, бирок ал процесске эстутумду бөлөт жана процесске керек болгондо, ОС аны мүмкүн болсо бөлүштүрөт. Кемчилиги, кээде ОС эстутумду сактап коёт, бирок керек болгондо бош эстутум жок болуп, системанын иштебей калышына алып келет. 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() белгилүү бир эрежелерге ылайык процессти тандайт.
- Ядро өзү үчүн минималдуу эстутумга муктаж.
- Сиз көп эстутум бошотуу керек.
- Эстутум аз колдонгон процесстерди токтотуунун кереги жок.
- Минималдуу процесстерди бүтүрүү керек.
- Колдонуучу өзү бүтүргүсү келген процесстердин бүтүрүү мүмкүнчүлүгүн жогорулаткан татаал алгоритмдер.
Бардык текшерүүлөрдү аяктагандан кийин, 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_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
