Fametrahana ny Out-Of-Memory Killer ao amin'ny Linux ho an'ny PostgreSQL

Fametrahana ny Out-Of-Memory Killer ao amin'ny Linux ho an'ny PostgreSQL

Rehefa in Linux Mifarana tampoka ny mpizara angon-drakitra, ary mila fantarina ny antony. Mety hisy antony maromaro. Ohatra, SIGSEGV - tsy fahombiazana noho ny bibikely ao amin'ny server backend. Tsy fahita firy anefa izany. Matetika, lany fotsiny ny habaka kapila na fahatsiarovana. Raha lany ny habaka kapila dia tsy misy afa-tsy ny lalana hivoahana - manafaka toerana ary avereno indray ny angon-drakitra.

Famonoana tsy misy fitadidiana

Rehefa ianao mpizara na lany ny fitadidiana ny dingana, Linux Manolotra vahaolana roa ny Out-Of-Memory Killer: ny fanajanonana ny rafitra manontolo na ny fanajanonana ny dingana (fampiharana) izay mandany ny fahatsiarovana. Mazava ho azy fa tsara kokoa ny manajanona ny dingana ary miaro ny OS tsy hianjera. Raha fintinina, ny Out-Of-Memory Killer dia dingana iray izay manajanona ny fampiharana mba hiarovana ny kernel tsy hianjera. Mamoaka ny fampiharana izy io mba hampandeha tsara ny OS. Andeha hojerentsika aloha ny fomba fiasan'ny OOM sy ny fomba hifehezana azy, ary avy eo dia hojerentsika ny fomba hanapahan'ny OOM Killer hoe iza amin'ireo fampiharana no tokony hofaranana.

Ny iray amin'ireo asa lehibe Linux — Manendry fahatsiarovana ho an'ny dingana rehefa angatahiny izany. Matetika, ny dingana na fampiharana dia mangataka fahatsiarovana avy amin'ny OS saingy tsy mampiasa izany tanteraka. Raha manome fahatsiarovana ho an'izay rehetra mangataka izany ny OS nefa tsy mikasa ny hampiasa izany, dia ho lany haingana ny fahatsiarovana ny rafitra, ary hianjera ny rafitra. Mba hisorohana izany, ny OS dia mitahiry fahatsiarovana ho an'ny dingana iray saingy tsy tena manome izany. Ny fahatsiarovana dia omena rehefa tena mikasa ny hampiasa azy ny dingana iray. Indraindray ny OS dia tsy manana fahatsiarovana malalaka, fa manome fahatsiarovana ho an'ny dingana iray, ary rehefa mila izany ny dingana, dia manome izany ny OS raha afaka manao izany. Ny lafy ratsiny dia indraindray ny OS dia mitahiry fahatsiarovana, fa rehefa ilaina izany, dia tsy misy fahatsiarovana malalaka, ka miteraka fianjeran'ny rafitra. Ny OOM dia mitana anjara toerana lehibe amin'ity tranga ity, mamarana ny dingana mba hisorohana ny kernel tsy ho sahirana. Rehefa ajanona an-keriny ny dingana PostgreSQL, dia miseho ao amin'ny log ity hafatra manaraka ity:

Out of Memory: Killed process 12345 (postgres).

Raha kely ny fitadidiana ny rafitra ary tsy azo afahana dia antsoina ny asa out_of_memory. Amin'ity dingana ity dia zavatra tokana sisa no ataony - mamita dingana iray na maromaro. Tokony hamarana ny dingana avy hatrany ve ny OOM-killer sa afaka miandry? Mazava ho azy fa rehefa antsoina hoe out_of_memory dia noho ny fiandrasana ny fandidiana I/O na ny paging amin'ny kapila. Noho izany, ny mpamono OOM dia tsy maintsy manao fisavana aloha ary, mifototra amin'izy ireo, dia manapa-kevitra fa mila atsahatra ny dingana. Raha tsara daholo ny fisavana etsy ambany dia hampitsahatra ny dingana ny OOM.

Fifantenana dingana

Rehefa lany ny fitadidiana dia antsoina ny asa out_of_memory(). Manana fiasa izany select_bad_process(), izay mahazo fanombanana avy amin'ny asa badness(). Ny dingana "ratsy indrindra" dia ho lasibatra. asa badness() mifidy dingana iray araka ny fitsipika sasany.

  1. Mila fitadidiana kely indrindra ho azy ny kernel.
  2. Mila manafaka fahatsiarovana be dia be ianao.
  3. Tsy ilaina ny manajanona ny dingana izay mampiasa fahatsiarovana kely.
  4. Mila vita ny dingana faran'izay kely indrindra.
  5. Algorithm saro-pady izay mampitombo ny mety ho vita ho an'ireo dingana izay tian'ny mpampiasa ho vita.

Rehefa vita ireo fanamarinana rehetra ireo, dia mandinika ny isa ny OOM (oom_score). Om assign oom_score dingana tsirairay, ary avy eo dia ampitomboina amin'ny habetsahan'ny fitadidiana io sanda io. Ny dingana misy sanda lehibe kokoa dia mety ho tratran'ny OOM Killer. Ny dingana mifandray amin'ny mpampiasa faka dia manana naoty ambany kokoa ary tsy dia voatery ho voatery hijanona.

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

Ny ID process Postgres dia 3813, noho izany amin'ny akora hafa dia azo atao ny maka ny isa amin'ny fampiasana an'io parameter kernel io oom_score:

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

Raha tsy tianao hamono ny dingana mihitsy ny OOM-Killer dia misy safidy kernel hafa: oom_score_adj. Manampia sanda ratsy lehibe mba hampihenana ny mety hahavitana dingana iray izay sarobidy aminao.

sudo echo -100 > /proc/3813/oom_score_adj

Hametraka sanda oom_score_adj, mametraka OOMScoreAdjust ao amin'ny sakana serivisy:

[Service]
OOMScoreAdjust=-1000

Na mampiasa oomprotect ao anaty ekipa rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Manery fampitsaharana dingana iray

Rehefa efa voafantina ny dingana iray na maromaro dia miantso ny fiasa ny OOM-Killer oom_kill_task(). Ity fiasa ity dia mandefa famantarana fampitsaharana amin'ny dingana. Raha sendra tsy fahampian'ny fitadidiana oom_kill() Miantso ity asa ity handefa famantarana SIGKILL amin'ny dingana. Misy hafatra voasoratra ao amin'ny log kernel.

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

Ahoana ny fifehezana ny OOM-Killer

В Linux Azonao atao ny mampandeha na manafoana ny OOM-Killer (na dia tsy soso-kevitra aza ity farany). Mba hampandeha na hanafoana azy, ampiasao ny masontsivana vm.oom-kill. Mba hahafahan'ny OOM-Killer amin'ny fotoana fandehanana dia araho ny baiko sysctl.

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

Mba hanesorana ny OOM-Killer, mariho ny sanda 0 amin'io baiko io ihany:

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

Ny vokatr'io baiko io dia tsy ho voavonjy mandrakizay, fa mandra-pahatongan'ny reboot voalohany. Raha mila fikirizana bebe kokoa ianao dia ampio ity andalana ity amin'ny rakitra /etc/sysctl.conf:

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

Ny fomba iray hafa ahafahana mamela sy manafoana dia ny fanoratana faribolana panic_on_oom. Azo jerena foana ny sandany /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Raha mametraka ny sanda ho 0 ianao, dia rehefa lany ny fitadidiana dia tsy hisy ny tahotra ny kernel.

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

Raha mametraka ny sanda ho 1 ianao, dia rehefa lany ny fitadidiana dia hisy korontana kernel.

echo 1 > /proc/sys/vm/panic_on_oom

Azo alefa sy vonoina ny OOM-Killer, araka ny efa voalaza. Linux mety hitahiry fahatsiarovana bebe kokoa ho an'ny dingana noho izay misy, saingy tsy tena manome izany, ary io fihetsika io dia fehezin'ny paramètre kernel LinuxNy variable no tompon'andraikitra amin'izany. vm.overcommit_memory.

Azonao atao ny mamaritra ireto sanda manaraka ireto ho azy:

0: Ny kernel mihitsy no manapa-kevitra raha hitahiry fahatsiarovana be loatra. Io no sanda mahazatra amin'ny ankamaroan'ny dikan-teny. Linux.
1: Ny kernel dia mitahiry fahatsiarovana fanampiny foana. Mampidi-doza izany, satria mety ho lany ny fitadidiana, satria, azo inoana, indray andro any dia mitaky izany ny fizotrany.
2: ny kernel dia tsy hitahiry fitadidiana mihoatra ny voalaza ao amin'ny parameter overcommit_ratio.

Amin'ny alalan'ity mari-pamantarana ity dia mamaritra ny isan-jaton'ny fitadidiana avela ho voatokana be loatra ianao. Raha tsy misy toerana ho azy dia tsy misy fahatsiarovana omena, ary ho lavina ny famandrihana. Ity no safidy azo antoka indrindra atolotra ho an'ny PostgreSQL. Ny OOM-Killer dia misy fiantraikany amin'ny singa iray hafa - ny fahafaha-mifamadika, izay fehezin'ny fari-piainana cat /proc/sys/vm/swappiness. Ireo soatoavina ireo dia milaza amin'ny kernel ny fomba fitantanana ny paging. Arakaraky ny ambony ny sandany, ny tsy dia azo inoana fa hampitsahatra ny dingana ny OOM, saingy noho ny fiasan'ny I/O dia misy fiantraikany ratsy amin'ny angon-drakitra izany. Ary ny mifamadika amin'izany - ny ambany ny sandany, ny avo kokoa ny mety hisian'ny fidirana an-tsehatra OOM-Killer, fa ny fahombiazan'ny angon-drakitra dia avo kokoa. Ny sandan'ny default dia 60, fa raha mifanaraka amin'ny fitadidiana ny angona manontolo dia tsara kokoa ny mametraka ny sanda ho 1.

vokatra

Aza avela hampatahotra anao ny "mpamono" ao amin'ny OOM-Killer. Amin'ity tranga ity, ny mpamono olona no ho mpamonjy ny rafitrao. "Mamono" ny dingana ratsy indrindra izy io ary mamonjy ny rafitra amin'ny fianjerana. Mba hialana amin'ny fampiasana OOM-Killer hamarana ny PostgreSQL, apetraho amin'ny vm.overcommit_memory sanda 2. Tsy miantoka izany fa tsy mila miditra an-tsehatra ny OOM-Killer, fa hampihena ny mety hanery ny fizotran'ny PostgreSQL hampitsahatra.

Source: www.habr.com

Mividiana fampiantranoana azo antoka ho an'ny tranokala misy fiarovana DDoS, mpizara VPS VDS 🔥 Mividiana fampiantranoana tranonkala azo antoka miaraka amin'ny fiarovana DDoS, mpizara VPS VDS | ProHoster