
کله چې دننه Linux د ډیټابیس سرور په ناڅاپي ډول پای ته رسیږي، او لامل یې باید وټاکل شي. ډیری دلیلونه کیدی شي. د مثال په توګه، SIGSEGV - په بیکینډ سرور کې د بګ له امله ناکامي. مګر دا نادره ده. ډیری وختونه ، تاسو په ساده ډول د ډیسک ځای یا حافظه له لاسه ورکوئ. که تاسو د ډیسک ځای پای ته ورسوئ ، نو یوازې یوه لاره شتون لري - ځای خالي کړئ او ډیټابیس بیا پیل کړئ.
د حافظې څخه بهر وژونکی
کله چې ته سرور یا پروسه له حافظې څخه خلاصه شي، Linux د حافظې څخه بهر قاتل دوه حلونه وړاندې کوي: ټول سیسټم خراب کړئ یا هغه پروسه (اپلیکیشن) ختم کړئ چې حافظه خوري. البته، دا غوره ده چې پروسه ختمه کړئ او OS د خرابیدو څخه وژغورئ. په لنډه توګه، د حافظې څخه بهر قاتل هغه پروسه ده چې یو اپلیکیشن ختموي ترڅو کرنل د خرابیدو څخه وژغوري. دا د OS د چلولو لپاره اپلیکیشن قرباني کوي. راځئ چې لومړی په دې بحث وکړو چې OOM څنګه کار کوي او څنګه یې کنټرول کړي، او بیا وګورو چې OOM قاتل څنګه پریکړه کوي چې کوم اپلیکیشنونه ختم کړي.
یو له اصلي دندو څخه Linux — کله چې پروسې غوښتنه کوي نو حافظه ورته ځانګړې کړئ. معمولا، یوه پروسه یا غوښتنلیک له OS څخه حافظه غواړي مګر په بشپړه توګه یې نه کاروي. که چیرې OS هر هغه چا ته حافظه ځانګړې کړي چې غوښتنه یې کوي مګر د کارولو پلان نلري، نو سیسټم به په چټکۍ سره له حافظې څخه خلاص شي، او سیسټم به خراب شي. د دې مخنیوي لپاره، OS د پروسې لپاره حافظه خوندي کوي مګر په حقیقت کې یې نه تخصیص کوي. حافظه یوازې هغه وخت تخصیص کیږي کله چې یوه پروسه په حقیقت کې د هغې د کارولو اراده لري. ځینې وختونه OS وړیا حافظه نلري، مګر دا یوې پروسې ته حافظه تخصیص کوي، او کله چې پروسه ورته اړتیا ولري، OS دا تخصیص کوي که چیرې دا کولی شي. منفي اړخ دا دی چې ځینې وختونه OS حافظه خوندي کوي، مګر کله چې اړتیا وي، وړیا حافظه شتون نلري، چې د سیسټم د خرابیدو لامل کیږي. OOM پدې سناریو کې کلیدي رول لوبوي، پروسې پای ته رسوي ترڅو د کرنل د ویرې مخه ونیسي. کله چې د PostgreSQL پروسه په زور سره پای ته ورسیږي، لاندې پیغام په لاګ کې څرګندیږي:
Out of Memory: Killed process 12345 (postgres).که چیرې سیسټم په حافظه کې کم وي او خلاص نشي ، نو فنکشن ویل کیږي out_of_memory. په دې مرحله کې، هغې یوازې یو شی پاتې دی چې ترسره یې کړي - یو یا څو پروسې بشپړ کړئ. ایا OOM-وژونکی باید پروسه سمدستي پای ته ورسوي یا دا انتظار کولی شي؟ په ښکاره ډول، کله چې out_of_memory ویل کیږي، دا د I/O عملیاتو یا ډیسک ته د پاڼې کولو انتظار کولو له امله دی. نو ځکه، د OOM قاتل باید لومړی چکونه ترسره کړي او د دوی پر بنسټ پریکړه وکړي چې پروسه باید پای ته ورسیږي. که لاندې ټول چکونه مثبت وي، OOM به پروسه پای ته ورسوي.
د پروسې انتخاب
کله چې حافظه پای ته ورسیږي، فنکشن ویل کیږي out_of_memory(). دا یو فعالیت لري select_bad_process()، کوم چې د فعالیت څخه ارزونه ترلاسه کوي badness(). "تر ټولو بد" پروسه به په نښه شي. فعالیت badness() د ځانګړو مقرراتو سره سم پروسه غوره کوي.
- دانه د ځان لپاره لږ تر لږه حافظې ته اړتیا لري.
- تاسو اړتیا لرئ ډیری حافظه خالي کړئ.
- اړتیا نشته چې هغه پروسې ختمې کړئ چې لږ حافظه کاروي.
- لږترلږه پروسې باید بشپړې شي.
- پیچلي الګوریتمونه چې د هغه پروسو لپاره د بشپړیدو چانس زیاتوي چې کاروونکي پخپله غواړي بشپړ کړي.
د دې ټولو چکونو بشپړولو سره، OOM نمرې معاینه کوي (oom_score). OOM ګمارل کیږي oom_score هره پروسه، او بیا دا ارزښت د حافظې مقدار سره ضرب کوي. د لویو ارزښتونو سره پروسې ډیر احتمال لري چې د OOM وژونکي قرباني شي. د روټ کارونکي سره تړلې پروسې ټیټې نمرې لري او لږ احتمال لري چې جبري ختم شي.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)د پوسټګریس پروسې ID 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 قاتل څنګه کنټرول کړئ
В 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- قاتل د بل عنصر لخوا اغیزمن کیږي - د بدلولو وړتیا، کوم چې د متغیر لخوا کنټرول کیږي cat /proc/sys/vm/swappiness. دا ارزښتونه کرنل ته وايي چې څنګه د پاڼې کولو اداره کول. څومره چې ارزښت لوړ وي، په هماغه اندازه د دې احتمال کم دی چې OOM به پروسه پای ته ورسوي، مګر د I/O عملیاتو له امله دا په ډیټابیس منفي اغیزه لري. او برعکس - د ارزښت ټیټ، د OOM- قاتل مداخلې احتمال لوړ دی، مګر د ډیټابیس فعالیت هم لوړ دی. ډیفالټ ارزښت 60 دی، مګر که ټول ډیټابیس په حافظه کې فټ شي، نو دا به غوره وي چې ارزښت 1 ته وټاکئ.
پایلې
په OOM- قاتل کې "وژونکي" ته اجازه مه ورکوئ چې تاسو ویره کړي. په دې حالت کې، قاتل به ستاسو د سیسټم ژغورونکی وي. دا بدترین پروسې "وژني" او سیسټم له غورځیدو څخه ساتي. د PostgreSQL ختمولو لپاره د OOM-Killer کارولو څخه مخنیوي لپاره، ترتیب کړئ vm.overcommit_memory ارزښت 2. دا تضمین نه کوي چې OOM-Killer به مداخله ونه کړي، مګر دا به د PostgreSQL پروسې پای ته رسولو احتمال کم کړي.
سرچینه: www.habr.com
