
Nalika ing Linux Server basis data mandheg tanpa diduga, lan panyebabe kudu ditemtokake. Bisa uga ana sawetara alesan. Contone, SIGSEGV - Gagal amarga bug ing server backend. Nanging iki langka. Paling asring, sampeyan mung kehabisan ruang disk utawa memori. Yen sampeyan kehabisan ruang disk, mung ana siji cara metu - mbebasake spasi lan miwiti maneh database.
Out-Of-Memori Killer
Nalika sampeyan server utawa proses kasebut kehabisan memori, Linux Out-Of-Memory Killer nawakake rong solusi: ngrusak kabeh sistem utawa mungkasi proses (aplikasi) sing ngentekake memori. Mesthi wae, luwih becik mungkasi proses kasebut lan nylametake OS saka crash. Cekakipun, Out-Of-Memory Killer minangka proses sing mungkasi aplikasi kanggo nylametake kernel saka crash. Iki ngorbanake aplikasi supaya OS tetep mlaku. Ayo dirembug dhisik kepiye OOM kerjane lan kepiye ngontrol, banjur deleng kepiye OOM Killer nemtokake aplikasi endi sing kudu dihentikake.
Salah sawijining tugas utama Linux — Ngalokasikan memori menyang proses nalika dijaluk. Biasane, proses utawa aplikasi njaluk memori saka OS nanging ora nggunakake kanthi lengkap. Yen OS ngalokasikan memori kanggo saben wong sing njaluk nanging ora duwe rencana nggunakake, sistem bakal cepet entek memori, lan sistem bakal nabrak. Kanggo nyegah iki, OS nyimpen memori kanggo proses nanging ora bener-bener ngalokasikan. Memori dialokasikan mung nalika proses pancen pengin nggunakake. Kadhangkala OS ora duwe memori kosong, nanging ngalokasikan memori menyang proses, lan nalika proses mbutuhake, OS ngalokasikan yen bisa. Kekurangane yaiku kadhangkala OS nyimpen memori, nanging nalika dibutuhake, ora ana memori kosong, sing nyebabake sistem nabrak. OOM nduweni peran penting ing skenario iki, mungkasi proses kanggo nyegah kernel panik. Nalika proses PostgreSQL dihentikan kanthi paksa, pesen ing ngisor iki katon ing log:
Out of Memory: Killed process 12345 (postgres).Yen sistem kurang memori lan ora bisa dibebasake, fungsi kasebut diarani out_of_memory. Ing tahap iki, dheweke mung duwe siji sing kudu ditindakake - ngrampungake siji utawa luwih proses. Apa OOM-pembunuh kudu mungkasi proses langsung utawa bisa ngenteni? Temenan, nalika out_of_memory diarani, amarga nunggu operasi I / O utawa paging menyang disk. Mula, pembunuh OOM kudu mriksa dhisik lan, adhedhasar, mutusake manawa proses kasebut kudu diakhiri. Yen kabeh pamriksa ing ngisor iki positif, OOM bakal mungkasi proses kasebut.
Pilihan proses
Nalika memori entek, fungsi kasebut diarani out_of_memory(). Wis fungsi select_bad_process(), sing nampa evaluasi saka fungsi kasebut badness(). Proses "paling awon" bakal ditargetake. Fungsi badness() milih proses miturut aturan tartamtu.
- Kernel mbutuhake sawetara memori minimal kanggo awake dhewe.
- Sampeyan kudu mbebasake akeh memori.
- Ora perlu kanggo mungkasi pangolahan sing nggunakake memori sethitik.
- Proses minimal kudu rampung.
- Algoritma Komplek sing nambah kemungkinan rampung kanggo proses sing pangguna dhewe pengin ngrampungake.
Sawise rampung kabeh pamriksan kasebut, OOM mriksa skor kasebut (oom_score). OOM nugasi oom_score saben proses, lan banjur multiplies Nilai iki dening jumlah memori. Proses kanthi nilai sing luwih gedhe luwih cenderung dadi korban Pembunuh OOM. Proses sing digandhengake karo pangguna root duwe skor sing luwih murah lan ora bisa dipeksa kanggo mungkasi.
postgres=# SELECT pg_backend_pid();
pg_backend_pid
----------------
3813
(1 row)ID proses Postgres yaiku 3813, saengga ing cangkang liyane bisa entuk skor nggunakake parameter kernel iki oom_score:
vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2Yen sampeyan ora pengin OOM-Killer mateni proses kasebut, ana pilihan kernel liyane: oom_score_adj. Tambah nilai negatif gedhe kanggo nyuda kemungkinan kanggo ngrampungake proses sing sampeyan nilai.
sudo echo -100 > /proc/3813/oom_score_adjKanggo nyetel nilai oom_score_adj, atur OOMScoreAdjust ing blok layanan:
[Service]
OOMScoreAdjust=-1000Utawa nggunakake oomprotect ing tim rcctl.
rcctl set <i>servicename</i> oomprotect -1000Meksa mandap saka proses
Nalika siji utawa luwih proses wis dipilih, OOM-Killer nelpon fungsi kasebut oom_kill_task(). Fungsi iki ngirim sinyal mandap menyang proses. Ing kasus kekurangan memori oom_kill() Telpon fungsi iki kanggo ngirim sinyal SIGKILL kanggo proses. Pesen ditulis menyang log kernel.
Out of Memory: Killed process [pid] [name].Carane ngontrol OOM-Killer
В Linux Sampeyan bisa ngaktifake utawa mateni OOM-Killer (sanajan sing terakhir ora disaranake). Kanggo ngaktifake utawa mateni, gunakake parameter vm.oom-kill. Kanggo ngaktifake OOM-Killer nalika runtime, jalanake perintah kasebut sysctl.
sudo -s sysctl -w vm.oom-kill = 1Kanggo mateni OOM-Killer, nemtokake nilai 0 ing printah sing padha:
sudo -s sysctl -w vm.oom-kill = 0Asil saka printah iki ora bakal disimpen ing salawas-lawase, nanging mung nganti urip maneh pisanan. Yen sampeyan mbutuhake luwih ketekunan, tambahake baris iki menyang file kasebut /etc/sysctl.conf:
echo vm.oom-kill = 1 >>/etc/sysctl.confCara liya kanggo ngaktifake lan mateni yaiku nulis variabel panic_on_oom. Nilai bisa tansah dicenthang /proc.
$ cat /proc/sys/vm/panic_on_oom
0Yen sampeyan nyetel nilai kanggo 0, banjur nalika memori entek, ora bakal ana gupuh kernel.
$ echo 0 > /proc/sys/vm/panic_on_oomYen sampeyan nyetel nilai kanggo 1, banjur nalika memori entek, bakal kedaden gupuh kernel.
echo 1 > /proc/sys/vm/panic_on_oomOOM-Killer bisa diuripake lan dipateni, kaya sing wis kasebut sadurunge. Linux bisa uga nyimpen memori luwih akeh kanggo proses tinimbang sing kasedhiya, nanging sejatine ora ngalokasikake, lan prilaku iki dikontrol dening parameter kernel LinuxVariabel iki tanggung jawab kanggo iki. vm.overcommit_memory.
Sampeyan bisa nemtokake nilai ing ngisor iki:
0: Kernel dhewe sing nemtokake apa arep nyimpen memori sing akeh banget. Iki minangka nilai standar ing umume versi. Linux.
1: Kernel bakal tansah nyimpen memori ekstra. Iki beboyo, amarga memori bisa entek, amarga, paling kamungkinan, siji dina pangolahan bakal mbutuhake.
2: kernel ora bakal cadangan memori luwih saka kasebut ing parameter overcommit_ratio.
Kanthi parameter iki, sampeyan nemtokake persentasi memori sing diijini over-reserved. Yen ora ana papan, ora ana memori sing diparengake, lan leladen bakal ditolak. Iki minangka pilihan paling aman sing dianjurake kanggo PostgreSQL. OOM-Killer kena pengaruh unsur liyane - kemampuan swapping, sing dikontrol dening variabel cat /proc/sys/vm/swappiness. Nilai kasebut ngandhani kernel carane nangani paging. Nilai sing luwih dhuwur, kemungkinan OOM bakal mungkasi proses kasebut, nanging amarga operasi I / O, mula ana pengaruh negatif ing database. Lan kosok balene - sing luwih murah regane, sing luwih dhuwur kemungkinan campur tangan OOM-Killer, nanging kinerja database uga luwih dhuwur. Nilai standar yaiku 60, nanging yen kabeh database pas karo memori, luwih becik nyetel nilai kasebut dadi 1.
Hasil
Aja "pembunuh" ing OOM-Killer medeni sampeyan. Ing kasus iki, pembunuh bakal dadi penyelamat sistem sampeyan. Iku "mateni" pangolahan paling awon lan nyimpen sistem saka nabrak. Supaya ora kudu nggunakake OOM-Killer kanggo mungkasi PostgreSQL, atur menyang vm.overcommit_memory nilai 2. Iki ora njamin sing OOM-Killer ora kudu ngintervensi, nanging bakal nyuda kamungkinan meksa proses PostgreSQL kanggo siksa.
Source: www.habr.com
