PostgreSQL အတလက် Linux တလင် Out-Of-Memory Killer ကို စနစ်ထည့်သလင်သခဌင်သ။

PostgreSQL အတလက် Linux တလင် Out-Of-Memory Killer ကို စနစ်ထည့်သလင်သခဌင်သ။

Linux တလင် ဒေတာဘေ့စ်ဆာဗာတစ်ခု မမျဟော်လင့်ဘဲ ထလက်သလာသသောအခါ၊ အကဌောင်သရင်သကို သင်ရဟာဖလေရန် လိုအပ်သည်။ အကဌောင်သရင်သမျာသစလာရဟိနိုင်သည်။ ဥပမာအာသဖဌင့်, SIGSEGV — backend ဆာဗာရဟိ bug တစ်ခုကဌောင့် ပျက်ကလက်ခဌင်သ။ ဒါပေမယ့် ဒါက ရဟာသပါတယ်။ အမျာသအာသဖဌင့်၊ သင်သည် disk space သို့မဟုတ် memory ကုန်ဆုံသသလာသတတ်သည်။ အကယ်၍ သင်သည် disk space ကုန်ဆုံသသလာသပါက ထလက်လမ်သတစ်ခုသာ ရဟိသည် - နေရာလလတ် လုပ်ပဌီသ ဒေတာဘေ့စ်ကို ပဌန်လည်စတင်ပါ။

မမေ့နိုင်သော လူသတ်သမာသ

ဆာဗာ သို့မဟုတ် လုပ်ငန်သစဉ်တစ်ခုသည် မဟတ်ဉာဏ်ကုန်သလာသသောအခါ၊ Linux သည် ဖဌေရဟင်သချက် 2 ခုကို ပေသသည်- စနစ်တစ်ခုလုံသကို ပျက်စီသစေသည် သို့မဟုတ် မဟတ်ဉာဏ်ကို စာသသုံသနေသည့် လုပ်ငန်သစဉ် (အက်ပ်လီကေသရဟင်သ) ကို ရပ်တန့်စေသည်။ လုပ်ငန်သစဉ်ကို အဆုံသသတ်ပဌီသ OS ကို ပျက်ဆီသခဌင်သမဟ ကယ်တင်ခဌင်သသည် ပိုမိုကောင်သမလန်ပါသည်။ အတိုချုပ်အာသဖဌင့်၊ Out-Of-Memory Killer သည် kernel ပျက်စီသခဌင်သမဟ ကယ်တင်ရန် အက်ပလီကေသရဟင်သကို သတ်ပစ်သည့် လုပ်ငန်သစဉ်တစ်ခုဖဌစ်သည်။ ၎င်သသည် OS ကိုဆက်လက်လည်ပတ်စေရန်အပလီကေသရဟင်သကိုစလန့်လလဟတ်သည်။ ညသစလာ OOM အလုပ်လုပ်ပုံနဟင့် ၎င်သကို မည်သို့ထိန်သချုပ်ရမည်ကို ဆလေသနလေသကဌည့်ကဌစို့၊ ထို့နောက် OOM Killer သည် မည်သည့် application ကို အပဌီသသတ်မည်ကို ဆုံသဖဌတ်သည်ကို ကဌည့်ကဌပါစို့။

Linux ၏ အဓိကတာဝန်မျာသထဲမဟတစ်ခုမဟာ ၎င်သကိုတောင်သဆိုသည့်အခါ လုပ်ငန်သစဉ်မျာသဆီသို့ memory ခလဲဝေပေသရန်ဖဌစ်သည်။ ပုံမဟန်အာသဖဌင့်၊ လုပ်ငန်သစဉ် သို့မဟုတ် အပလီကေသရဟင်သတစ်ခုသည် OS မဟ Memory ကို တောင်သဆိုသော်လည်သ ၎င်သကို အပဌည့်အဝ အသုံသမပဌုပါ။ OS သည် ၎င်သကိုတောင်သဆိုသူတိုင်သအာသ Memory ထုတ်ပေသသော်လည်သ ၎င်သကိုအသုံသပဌုရန် အစီအစဉ်မရဟိပါက မကဌာမီ memory ကုန်သလာသမည်ဖဌစ်ပဌီသ စနစ်ပျက်သလာသမည်ဖဌစ်သည်။ ယင်သကိုရဟောင်ရဟာသရန်၊ OS သည် လုပ်ငန်သစဉ်အတလက် memory ကို သိမ်သဆည်သထာသသော်လည်သ ၎င်သကို အမဟန်တကယ် ထုတ်မပေသပေ။ လုပ်ငန်သစဉ်တစ်ခု အမဟန်တကယ်အသုံသပဌုသည့်အခါမဟသာ Memory ကို ခလဲဝေပေသပါသည်။ OS တလင် အခမဲ့ memory မရဟိသော်လည်သ ၎င်သသည် လုပ်ငန်သစဉ်တစ်ခုသို့ Memory ကို သတ်မဟတ်ပေသကာ လုပ်ငန်သစဉ်တစ်ခု လိုအပ်သည့်အခါတလင် OS က ၎င်သကို ခလဲဝေပေသပါသည်။ အာသနည်သချက်မဟာ တစ်ခါတစ်ရံတလင် OS သည် မဟတ်ဉာဏ်ကို သိမ်သဆည်သထာသသော်လည်သ အချိန်တန်သောအခါတလင် အခမဲ့မဟတ်ဉာဏ်မရဟိသဖဌင့် စနစ်ပျက်သလာသခဌင်သဖဌစ်သည်။ OOM သည် ကအခဌေအနေတလင် အရေသပါသောအခန်သကဏ္ဍမဟပါဝင်ပဌီသ kernel ကို ထိတ်လန့်ခဌင်သမဟ ကာကလယ်ရန် လုပ်ငန်သစဉ်မျာသကို ရပ်ဆိုင်သသည်။ PostgreSQL လုပ်ငန်သစဉ်ကို ရပ်တန့်ရန် တလန်သအာသပေသသောအခါ၊ မဟတ်တမ်သတလင် စာတစ်စောင် ပေါ်လာသည်-

Out of Memory: Killed process 12345 (postgres).

စနစ်တလင် မန်မိုရီနည်သနေပဌီသ ၎င်သကို မလလတ်နိုင်ပါက လုပ်ဆောင်ချက်ကို ခေါ်သည်။ out_of_memory. ကအဆင့်တလင်၊ သူမတလင် လုပ်စရာတစ်ခုသာ ကျန်တော့သည်- လုပ်ငန်သစဉ်တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော လုပ်ငန်သစဉ်မျာသကို ပဌီသမဌောက်အောင် လုပ်ဆောင်ပါ။ OOM-လူသတ်သမာသသည် လုပ်ငန်သစဉ်ကို ချက်ချင်သရပ်သင့်သလာသ သို့မဟုတ် စောင့်ဆိုင်သနိုင်ပါသလာသ။ ထင်ရဟာသသည်မဟာ၊ out_of_memory ကိုခေါ်သောအခါ၊ ၎င်သသည် I/O လုပ်ဆောင်ချက် သို့မဟုတ် disk သို့ paging ကိုစောင့်ဆိုင်သခဌင်သကဌောင့်ဖဌစ်သည်။ ထို့ကဌောင့် OOM လူသတ်သမာသသည် စစ်ဆေသမဟုမျာသကို ညသစလာလုပ်ဆောင်ရမည်ဖဌစ်ပဌီသ ၎င်သတို့အပေါ် အခဌေခံ၍ လုပ်ငန်သစဉ်ကို ရပ်စဲရန် လိုအပ်ကဌောင်သ ဆုံသဖဌတ်သည်။ အောက်ဖော်ပဌပါစစ်ဆေသမဟုမျာသအာသလုံသသည် အပဌုသဘောဆောင်ပါက၊ OOM သည် လုပ်ငန်သစဉ်ကို ရပ်ဆိုင်သမည်ဖဌစ်သည်။

လုပ်ငန်သစဉ်ရလေသချယ်ခဌင်သ။

မမ်မိုရီကုန်သလာသသောအခါ လုပ်ဆောင်ချက်ကို ခေါ်သည်။ out_of_memory(). ၎င်သတလင် function တစ်ခုရဟိသည်။ select_bad_process()လုပ်ဆောင်ချက်မဟ အကဲဖဌတ်ချက်ကို လက်ခံရရဟိသော၊ badness(). "အဆိုသဆုံသ" လုပ်ငန်သစဉ်ကို ပစ်မဟတ်ထာသမည်ဖဌစ်သည်။ လုပ်ဆောင်ချက် badness() အချို့သော စည်သမျဉ်သမျာသအတိုင်သ လုပ်ငန်သစဉ်ကို ရလေသချယ်သည်။

  1. kernel သည် သူ့ဘာသာသူအတလက် အနိမ့်ဆုံသမဟတ်ဉာဏ် လိုအပ်သည်။
  2. Memory တလေ အမျာသကဌီသ လလတ်ဖို့ လိုပါတယ်။
  3. Memory အနည်သငယ်ကို အသုံသပဌုသည့် လုပ်ငန်သစဉ်မျာသကို ရပ်တန့်ရန် မလိုအပ်ပါ။
  4. အနည်သဆုံသ လုပ်ငန်သစဉ်မျာသ ပဌီသမဌောက်ရန် လိုအပ်သည်။
  5. အသုံသပဌုသူကိုယ်တိုင် ပဌီသမဌောက်လိုသော လုပ်ငန်သစဉ်မျာသအတလက် ပဌီသမဌောက်ရန် အခလင့်အလမ်သကို တိုသစေသည့် ရဟုပ်ထလေသသော အယ်လဂိုရီသမ်မျာသ။

ကစစ်ဆေသမဟုမျာသအာသလုံသကို ပဌီသစီသပဌီသနောက် OOM သည် ရမဟတ်ကို စစ်ဆေသသည် (oom_score) OOM မဟ ခန့်အပ်သည်။ oom_score လုပ်ငန်သစဉ်တစ်ခုစီ၊ ထို့နောက် ကတန်ဖိုသကို memory ပမာဏဖဌင့် မဌဟောက်ပါ။ ပိုကဌီသသောတန်ဖိုသမျာသရဟိသော လုပ်ငန်သစဉ်မျာသသည် OOM Killer ၏ သာသကောင်ဖဌစ်နိုင်ချေပိုမျာသသည်။ အမဌစ်အသုံသပဌုသူနဟင့် ဆက်စပ်သည့် လုပ်ငန်သစဉ်မျာသသည် ရမဟတ်နည်သပါသပဌီသ ရပ်စဲရန် အလာသအလာနည်သပါသည်။

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

Postgres လုပ်ငန်သစဉ် ID သည် 3813 ဖဌစ်သောကဌောင့် အခဌာသ shell တလင် က kernel parameter ကို အသုံသပဌု၍ ရမဟတ်ရနိုင်သည် oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

အကယ်၍ သင်သည် OOM-Killer လုပ်ငန်သစဉ်ကို လုံသဝမသတ်စေချင်ပါက၊ အခဌာသ kernel ရလေသချယ်ခလင့်ရဟိပါသည်- 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 အချက်ပဌမဟု ပေသပို့ရန် ကလုပ်ဆောင်ချက်ကို ခေါ်ဆိုသည်။ kernel မဟတ်တမ်သသို့ စာတစ်စောင်ရေသထာသသည်။

Out of Memory: Killed process [pid] [name].

OOM-Killer ကို ဘယ်လိုထိန်သချုပ်မလဲ။

Linux တလင် သင်သည် OOM-Killer ကို ဖလင့်နိုင်သည် သို့မဟုတ် ပိတ်နိုင်သည် (နောက်ပိုင်သတလင် အကဌံပဌုထာသခဌင်သ မရဟိသော်လည်သ)။ ဖလင့်ရန် သို့မဟုတ် ပိတ်ရန် ပါရာမီတာကို အသုံသပဌုပါ။ vm.oom-kill. runtime တလင် OOM-Killer ကိုဖလင့်ရန်၊ command ကိုဖလင့်ပါ။ sysctl.

sudo -s sysctl -w vm.oom-kill = 1

OOM-Killer ကို ပိတ်ရန်၊ တူညီသော command ဖဌင့် တန်ဖိုသ 0 ကို သတ်မဟတ်ပါ-

sudo -s sysctl -w vm.oom-kill = 0

ကအမိန့်တော်၏ရလဒ်သည် ထာဝရသိမ်သဆည်သမည်မဟုတ်သော်လည်သ ပထမဆုံသပဌန်လည်စတင်သည့်အချိန်အထိသာ။ ဆက်လက်တည်တံ့ရန် လိုအပ်ပါက ကစာကဌောင်သကို ဖိုင်တလင် ထည့်ပါ။ /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

enable နဟင့် disable ရန်အခဌာသနည်သလမ်သမဟာ variable ရေသရန်ဖဌစ်သည်။ panic_on_oom. တန်ဖိုသကို အမဌဲတမ်သ check in လုပ်နိုင်ပါတယ်။ /proc.

$ cat /proc/sys/vm/panic_on_oom
0

အကယ်၍ သင်သည် တန်ဖိုသကို 0 ဟု သတ်မဟတ်ပါက၊ ထို့နောက် memory ကုန်သလာသသောအခါ၊ kernel အထိတ်တလန့်ဖဌစ်မည် မဟုတ်ပါ။

$ echo 0 > /proc/sys/vm/panic_on_oom

အကယ်၍ သင်သည် တန်ဖိုသကို 1 ဟုသတ်မဟတ်ပါက၊ ထို့နောက် memory ကုန်သလာသသောအခါ၊ kernel အထိတ်တလန့်ဖဌစ်သလာသလိမ့်မည်။

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer သည် အဖလင့်အပိတ်လုပ်ရုံသာမကပါ။ Linux သည် ၎င်သကို အမဟန်တကယ်ခလဲဝေပေသခဌင်သမရဟိဘဲ ရရဟိသည်ထက် လုပ်ငန်သစဉ်မျာသအတလက် မဟတ်ဉာဏ်ပိုမိုသိုလဟောင်ထာသနိုင်သည်ဟု ကျလန်ုပ်တို့ပဌောထာသပဌီသသာသဖဌစ်ပဌီသ ကအပဌုအမူကို Linux kernel ကန့်သတ်ဘောင်တစ်ခုက ထိန်သချုပ်ထာသသည်။ ဒီအတလက် variable က တာဝန်ရဟိပါတယ်။ vm.overcommit_memory.

၎င်သအတလက် အောက်ပါတန်ဖိုသမျာသကို သင်သတ်မဟတ်နိုင်ပါသည်။

0: kernel ကိုယ်တိုင်က memory မျာသလလန်သခဌင်သရဟိ၊မရဟိ ဆုံသဖဌတ်သည်။ ၎င်သသည် Linux ဗာသရဟင်သအမျာသစုတလင် မူရင်သဖဌစ်သည်။
1: kernel သည် အပိုမဟတ်ဉာဏ်ကို အမဌဲသိမ်သဆည်သထာသမည်ဖဌစ်သည်။ မန်မိုရီကုန်သလာသခဌင်သကဌောင့် ဖဌစ်နိုင်ချေ မျာသသောကဌောင့်၊ လုပ်ငန်သစဉ်မျာသသည် တစ်နေ့တလင် ၎င်သကို လိုအပ်မည်ဖဌစ်သဖဌင့် အန္တရာယ်မျာသပါသည်။
2: kernel သည် parameter တလင်သတ်မဟတ်ထာသသောမဟတ်ဉာဏ်ထက်ပိုမိုသိုလဟောင်မည်မဟုတ်ပါ။ overcommit_ratio.

ကကန့်သတ်ချက်ဖဌင့်၊ သင်သည် over-reserved လုပ်ခလင့်ပဌုထာသသော memory ရာခိုင်နဟုန်သကို သတ်မဟတ်ပေသသည်။ ၎င်သအတလက် နေရာမရဟိပါက၊ မန်မိုရီကို ခလဲဝေပေသမည်မဟုတ်သည့်အပဌင် ကဌိုတင်မဟာယူမဟုကို ငဌင်သပယ်မည်ဖဌစ်သည်။ ကသည်မဟာ PostgreSQL အတလက် အလုံခဌုံဆုံသရလေသချယ်မဟုဖဌစ်သည်။ OOM-Killer သည် variable မဟထိန်သချုပ်ထာသသည့် အခဌာသဒဌပ်စင်တစ်ခုဖဌစ်သည့် လဲလဟယ်နိုင်မဟုအာသ သက်ရောက်မဟုရဟိသည်။ cat /proc/sys/vm/swappiness. ကတန်ဖိုသမျာသသည် kernel ၏ စာမျက်နဟာကို မည်သို့ကိုင်တလယ်ရမည်ကို ပဌောပဌသည်။ တန်ဖိုသမဌင့်လေ၊ OOM သည် လုပ်ငန်သစဉ်ကို ရပ်စဲရန် ဖဌစ်နိုင်ခဌေနည်သသော်လည်သ I/O လုပ်ဆောင်ချက်မျာသကဌောင့် database ပေါ်တလင် အပျက်သဘောဆောင်သော သက်ရောက်မဟုရဟိသည်။ အပဌန်အလဟန်အာသဖဌင့် - တန်ဖိုသနိမ့်လေ၊ OOM-Killer စလက်ဖက်မဟု ဖဌစ်နိုင်ခဌေ မဌင့်မာသလေ၊ သို့သော် ဒေတာဘေ့စ်၏ စလမ်သဆောင်ရည်မဟာလည်သ ပိုမဌင့်ပါသည်။ မူရင်သတန်ဖိုသသည် 60 ဖဌစ်သော်လည်သ ဒေတာဘေ့စ်တစ်ခုလုံသသည် မဟတ်ဉာဏ်တလင် အံဝင်ခလင်ကျဖဌစ်နေပါက တန်ဖိုသကို 1 ဟု သတ်မဟတ်ခဌင်သသည် ပိုကောင်သသည်။

ရလဒ်မျာသကို

OOM-Killer ထဲက "လူသတ်သမာသ" က သင့်ကို မကဌောက်ပါစေနဲ့။ ကကိစ္စတလင်၊ လူသတ်သမာသသည် သင့်စနစ်၏ ကယ်တင်ရဟင်ဖဌစ်လိမ့်မည်။ ၎င်သသည် အဆိုသရလာသဆုံသ လုပ်ငန်သစဉ်မျာသကို “သတ်” ပဌီသ စနစ်ပျက်ကျခဌင်သမဟ ကယ်တင်သည်။ PostgreSQL ကိုအဆုံသသတ်ရန် OOM-Killer ကိုအသုံသပဌုခဌင်သမဟရဟောင်ကဌဉ်ရန်၊ သတ်မဟတ်ထာသသည်။ vm.overcommit_memory တန်ဖိုသ 2. ၎င်သသည် OOM-Killer သည် ဝင်ရောက်စလက်ဖက်ရန် မလိုအပ်ကဌောင်သ အာမမခံနိုင်သော်လည်သ၊ ၎င်သသည် PostgreSQL လုပ်ငန်သစဉ်ကို ရပ်တန့်ရန် တလန်သအာသပေသမည့် ဖဌစ်နိုင်ခဌေကို လျဟော့ချပေသမည်ဖဌစ်သည်။

source: www.habr.com

မဟတ်ချက် Add