د PostgreSQL لپاره په لینکس کې د حافظې څخه بهر وژونکي تنظیم کول

د PostgreSQL لپاره په لینکس کې د حافظې څخه بهر وژونکي تنظیم کول

کله چې د ډیټابیس سرور په غیر متوقع ډول په لینکس کې پریږدي ، تاسو اړتیا لرئ دلیل ومومئ. ښايي څو لاملونه وي. د مثال په ډول، SIGSEGV - په بیکینډ سرور کې د بګ له امله ناکامي. مګر دا نادره ده. ډیری وختونه ، تاسو په ساده ډول د ډیسک ځای یا حافظه له لاسه ورکوئ. که تاسو د ډیسک ځای پای ته ورسوئ ، نو یوازې یوه لاره شتون لري - ځای خالي کړئ او ډیټابیس بیا پیل کړئ.

د حافظې څخه بهر وژونکی

کله چې یو سرور یا پروسه له حافظې څخه تیریږي ، لینکس 2 حلونه وړاندې کوي: ټول سیسټم خراب کړئ یا هغه پروسه (اپلیکیشن) ختم کړئ چې حافظه یې خوري. البته دا غوره ده چې پروسه پای ته ورسوئ او OS له غورځیدو څخه وژغورئ. په لنډه توګه، د حافظې څخه بهر وژونکی یوه پروسه ده چې یو غوښتنلیک وژني ترڅو کرنل له غورځیدو څخه وژغوري. دا د OS چلولو ساتلو لپاره غوښتنلیک قرباني کوي. راځئ لومړی بحث وکړو چې OOM څنګه کار کوي او دا څنګه کنټرولوي، او بیا وګورئ چې څنګه د OOM قاتل پریکړه کوي چې کوم غوښتنلیک پای ته ورسوي.

د لینکس یو له اصلي کارونو څخه دا دی چې پروسو ته حافظه تخصیص کړي کله چې دوی یې غوښتنه کوي. عموما، یوه پروسه یا غوښتنلیک د 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 هره پروسه، او بیا دا ارزښت د حافظې مقدار سره ضرب کوي. د لویو ارزښتونو سره پروسې ډیر احتمال لري چې د 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 قاتل څنګه کنټرول کړئ

په لینکس کې، تاسو کولی شئ 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- قاتل نه یوازې فعال او بند کیدی شي. موږ دمخه ویلي چې لینکس کولی شي د پروسو لپاره ډیر حافظه خوندي کړي پرته له دې چې واقعیا یې تخصیص کړي ، او دا چلند د لینکس کرنل پیرامیټر لخوا کنټرول کیږي. متغیر د دې لپاره مسؤل دی vm.overcommit_memory.

تاسو کولی شئ د دې لپاره لاندې ارزښتونه مشخص کړئ:

0: دانه پخپله پریکړه کوي چې ایا ډیر حافظه خوندي کړي. دا د لینکس په ډیری نسخو کې ډیفالټ دی.
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

Add a comment