PostgreSQL لاءِ لينڪس تي آئوٽ آف ميموري قاتل کي ترتيب ڏيڻ

PostgreSQL لاءِ لينڪس تي آئوٽ آف ميموري قاتل کي ترتيب ڏيڻ

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

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

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

لينڪس جي مکيه ڪمن مان هڪ آهي ميموري کي پروسيس لاءِ مختص ڪرڻ جڏهن اهي ان لاءِ پڇن. عام طور تي، هڪ عمل يا ايپليڪيشن 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 کي ڪيئن ڪنٽرول ڪجي

لينڪس تي، توهان 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 کي نه رڳو آن ۽ آف ڪري سگھجي ٿو. اسان اڳ ۾ ئي چئي چڪا آهيون ته لينڪس پروسيسز لاءِ وڌيڪ ميموري محفوظ ڪري سگهي ٿو اصل ۾ ان کي مختص ڪرڻ کان سواءِ دستياب آهي، ۽ اهو رويو لينڪس ڪنييل پيٽرولر طرفان ڪنٽرول ڪيو ويندو آهي. variable هن لاء ذميوار آهي vm.overcommit_memory.

توھان ان لاء ھيٺ ڏنل قدر بيان ڪري سگھو ٿا:

0: ڪنيل پاڻ فيصلو ڪري ٿو ته ڇا تمام گهڻو ياداشت محفوظ ڪرڻ. اهو لينڪس جي اڪثر ورزن تي ڊفالٽ آهي.
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

تبصرو شامل ڪريو