ياداشت کان ٻاهر قاتل کي سيٽ ڪرڻ Linux پوسٽگري ايس ڪيو ايل لاءِ

ياداشت کان ٻاهر قاتل کي سيٽ ڪرڻ Linux پوسٽگري ايس ڪيو ايل لاءِ

جڏهن اندر Linux ڊيٽابيس سرور اوچتو ختم ٿي ويندو آهي، ۽ سبب طئي ڪرڻ جي ضرورت آهي. ان جا ڪيترائي سبب ٿي سگهن ٿا. مثال طور، SIGSEGV - پس منظر سرور ۾ هڪ بگ جي ڪري ناڪامي. پر هي نادر آهي. گهڻو ڪري، توهان صرف ڊسڪ اسپيس يا ياداشت کان ٻاهر هلندا آهيو. جيڪڏهن توهان ڊسڪ اسپيس مان نڪرندا آهيو، اتي صرف هڪ طريقو آهي - جاء خالي ڪريو ۽ ڊيٽابيس کي ٻيهر شروع ڪريو.

ميموري کان ٻاهر قاتل

جڏهن توهان سرور يا عمل جي ياداشت ختم ٿي ويندي، Linux آئوٽ آف ميموري ڪلر ٻه حل پيش ڪري ٿو: پوري سسٽم کي ڪريش ڪريو يا ان عمل (ايپليڪيشن) کي ختم ڪريو جيڪو ميموري کائي رهيو آهي. يقيناً، اهو بهتر آهي ته پروسيس کي ختم ڪيو وڃي ۽ او ايس کي ڪريش ٿيڻ کان بچايو وڃي. مختصر ۾، آئوٽ آف ميموري ڪلر هڪ اهڙو عمل آهي جيڪو ڪرنل کي ڪريش ٿيڻ کان بچائڻ لاءِ ايپليڪيشن کي ختم ڪري ٿو. اهو او ايس کي هلائڻ لاءِ ايپليڪيشن کي قربان ڪري ٿو. اچو ته پهريان بحث ڪريون ته او او ايم ڪيئن ڪم ڪري ٿو ۽ ان کي ڪيئن ڪنٽرول ڪجي، ۽ پوءِ ڏسو ته او او ايم ڪلر ڪيئن فيصلو ڪري ٿو ته ڪهڙيون ايپليڪيشنون ختم ڪيون وڃن.

مکيه ڪمن مان هڪ 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() ڪجهه ضابطن جي مطابق عمل کي چونڊيو.

  1. ڪرنل کي پنهنجي لاءِ ڪجهه گهٽ ۾ گهٽ ياداشت جي ضرورت آهي.
  2. توهان کي تمام گهڻي ياداشت کي آزاد ڪرڻ جي ضرورت آهي.
  3. عملن کي ختم ڪرڻ جي ڪا ضرورت ناهي جيڪي ٿوري ميموري استعمال ڪري رهيا آهن.
  4. گھٽ ۾ گھٽ عملن کي مڪمل ڪرڻ جي ضرورت آھي.
  5. پيچيده الگورتھم جيڪي انهن عملن جي مڪمل ٿيڻ جا موقعا وڌائين ٿا جيڪي صارف پاڻ مڪمل ڪرڻ گھري ٿو.

انهن سڀني چيڪن کي مڪمل ڪرڻ کان پوءِ، OOM سکور جي جانچ ڪري ٿو (oom_score). OOM مقرر ڪري ٿو oom_score هر عمل، ۽ پوء هن قيمت کي ميموري جي مقدار سان ضرب ڪري ٿو. وڏين قدرن سان گڏ عمل او او او ايم قاتل جو شڪار ٿيڻ جو وڌيڪ امڪان آهي. روٽ استعمال ڪندڙ سان لاڳاپيل عملن ۾ گھٽ نمبر آھي ۽ ان کي ختم ڪرڻ تي مجبور ٿيڻ جو امڪان گھٽ آھي.

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-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-قاتل هڪ ٻئي عنصر کان متاثر ٿئي ٿو - ادل بدلڻ جي صلاحيت، جيڪا متغير طرفان ڪنٽرول ڪئي وئي آهي cat /proc/sys/vm/swappiness. اهي قيمتون ڪنيل کي ٻڌائين ٿيون ته پيجنگ ڪيئن سنڀالجي. جيتري قدر وڌيڪ هوندي، اوترو ئي گهٽ اهو هوندو آهي ته OOM عمل کي ختم ڪري ڇڏيندو، پر I/O عملن جي ڪري ان جو ڊيٽابيس تي منفي اثر پوندو. ۽ ان جي برعڪس - قيمت گھٽ، او او ايم-قاتل مداخلت جو وڌيڪ امڪان، پر ڊيٽابيس جي ڪارڪردگي پڻ وڌيڪ آهي. ڊفالٽ ويليو 60 آهي، پر جيڪڏهن سڄو ڊيٽابيس ميموري ۾ فٽ ٿئي، ته بهتر آهي ته قيمت 1 تي مقرر ڪجي.

نتيجو

OOM-Killer ۾ "قاتل" کي توهان کي خوفزده ڪرڻ نه ڏيو. انهي صورت ۾، قاتل توهان جي سسٽم جو نجات ڏيندڙ هوندو. اهو بدترين عمل کي "ماري ٿو" ۽ سسٽم کي تباهه ٿيڻ کان بچائيندو آهي. PostgreSQL کي ختم ڪرڻ لاءِ OOM-Killer استعمال ڪرڻ کان بچڻ لاءِ، سيٽ ڪريو vm.overcommit_memory قدر 2. هي گارنٽي نٿو ڏئي ته OOM-Killer کي مداخلت نه ڪرڻي پوندي، پر اهو PostgreSQL عمل کي ختم ڪرڻ تي مجبور ڪرڻ جو امڪان گهٽائيندو.

جو ذريعو: www.habr.com

DDoS تحفظ سان سائيٽن لاءِ قابل اعتماد هوسٽنگ خريد ڪريو، VPS VDS سرور 🔥 DDoS تحفظ سان قابل اعتماد ويب سائيٽ هوسٽنگ خريد ڪريو، VPS VDS سرورز | ProHoster