Nggawe Out-Of-Memory Killer ing Linux kanggo PostgreSQL

Nggawe Out-Of-Memory Killer ing Linux kanggo PostgreSQL

Nalika server database metu kanthi ora sengaja ing Linux, sampeyan kudu nemokake alasane. Ana sawetara alasan. Tuladhane, 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 server utawa proses entek memori, Linux nawakake 2 solusi: nabrak kabeh sistem utawa mungkasi proses (aplikasi) sing mangan memori. Iku luwih apik, mesthi, kanggo mungkasi proses lan nyimpen OS saka nabrak. Cekakipun, Out-Of-Memory Killer minangka proses sing mateni aplikasi kanggo nyimpen kernel saka tabrakan. Iku kurban aplikasi kanggo njaga OS mlaku. Pisanan ayo ngrembug babagan cara kerja OOM lan cara ngontrol, banjur deleng carane OOM Killer mutusake aplikasi sing bakal dihentikan.

Salah sawijining tugas utama Linux yaiku nyedhiyakake memori kanggo proses nalika njaluk. Biasane, proses utawa aplikasi njaluk memori saka OS, nanging ora digunakake kanthi lengkap. Yen OS menehi memori kanggo kabeh wong sing njaluk nanging ora duwe rencana nggunakake, memori bakal entek lan sistem bakal gagal. Kanggo ngindhari iki, OS nyimpen memori kanggo proses kasebut, nanging ora ngeculake. Memori diparengake mung nalika proses bener arep digunakake. Mengkono sing OS ora duwe memori free, nanging nemtokake memori kanggo proses, lan nalika proses perlu, OS allocates yen bisa. Kakurangan iku kadhangkala OS cadangan memori, nanging ing wektu sing tepat ora ana free memori, lan sistem tubrukan. OOM nduweni peran penting ing skenario iki lan mungkasi proses supaya kernel ora panik. Nalika proses PostgreSQL dipeksa kanggo mungkasi, pesen 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.

  1. Kernel mbutuhake sawetara memori minimal kanggo awake dhewe.
  2. Sampeyan kudu mbebasake akeh memori.
  3. Ora perlu kanggo mungkasi pangolahan sing nggunakake memori sethitik.
  4. Proses minimal kudu rampung.
  5. 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
2

Yen 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_adj

Kanggo nyetel nilai oom_score_adj, atur OOMScoreAdjust ing blok layanan:

[Service]
OOMScoreAdjust=-1000

Utawa nggunakake oomprotect ing tim rcctl.

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

Meksa 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

Ing Linux, sampeyan bisa ngaktifake utawa mateni OOM-Killer (sanajan sing terakhir ora dianjurake). Kanggo ngaktifake utawa mateni nggunakake parameter vm.oom-kill. Kanggo ngaktifake OOM-Killer nalika runtime, jalanake perintah kasebut sysctl.

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

Kanggo mateni OOM-Killer, nemtokake nilai 0 ing printah sing padha:

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

Asil 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.conf

Cara liya kanggo ngaktifake lan mateni yaiku nulis variabel panic_on_oom. Nilai bisa tansah dicenthang /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Yen sampeyan nyetel nilai kanggo 0, banjur nalika memori entek, ora bakal ana gupuh kernel.

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

Yen sampeyan nyetel nilai kanggo 1, banjur nalika memori entek, bakal kedaden gupuh kernel.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer ora mung bisa diuripake lan dipateni. Kita wis ngandika sing Linux bisa cadangan memori liyane kanggo pangolahan saka kasedhiya tanpa bener allocating, lan prilaku iki kontrol dening parameter kernel Linux. Variabel tanggung jawab kanggo iki vm.overcommit_memory.

Sampeyan bisa nemtokake nilai ing ngisor iki:

0: Kernel dhewe mutusake manawa bakal nyimpen memori sing akeh banget. Iki minangka 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

Add a comment