Nyetél Out-Of-Memory Killer di Linux pikeun PostgreSQL

Nyetél Out-Of-Memory Killer di Linux pikeun PostgreSQL

Nalika pangladén databés kaluar teu disangka-sangka dina Linux, anjeun kedah milarian alesanana. Meureun aya sababaraha alesan. Salaku conto, SIGSEGV - gagalna kusabab bug dina server backend. Tapi ieu jarang. Seringna, anjeun ngan saukur kehabisan rohangan disk atanapi mémori. Upami anjeun kaluar tina rohangan disk, ngan ukur aya hiji jalan kaluar - ngosongkeun rohangan sareng balikan deui pangkalan data.

Kaluar-Memori Killer

Lamun server atawa prosés béak memori, Linux Ubuntu nawarkeun 2 solusi: ngadat sakabéh sistem atawa nungtungan prosés (aplikasi) nu dahar nepi memori. Éta langkung saé, tangtosna, pikeun ngeureunkeun prosés sareng ngahémat OS tina nabrak. Singkatna, Out-Of-Memory Killer mangrupikeun prosés anu maéhan aplikasi pikeun nyalametkeun kernel tina kacilakaan. Éta ngorbankeun aplikasi pikeun ngajaga OS jalan. Hayu urang bahas heula kumaha OOM jalanna sareng kumaha carana ngontrolana, teras tingali kumaha OOM Killer mutuskeun aplikasi mana anu bakal ditungtungan.

Salah sahiji tugas utama Linux nyaéta alokasi mémori kana prosés nalika aranjeunna naroskeunana. Ilaharna, prosés atawa aplikasi requests memori ti OS, tapi teu pinuh ngagunakeun eta. Upami OS masihan mémori ka saha waé anu naroskeun éta tapi henteu gaduh rencana pikeun ngagunakeun éta, pas mémori bakal béak sareng sistem bakal gagal. Pikeun ngahindarkeun ieu, OS cadangan mémori pikeun prosésna, tapi henteu ngaluarkeunana. Mémori dialokasikeun ngan nalika prosés anu leres-leres badé dianggo. Éta kajadian yén OS henteu gaduh mémori gratis, tapi éta masihan mémori kana prosés, sareng nalika prosés peryogina, OS ngabagi upami tiasa. downside nyaeta kadang OS cadangan memori, tapi dina waktu katuhu euweuh memori bébas, sarta sistem ngadat. OOM maénkeun peran penting dina skenario ieu sareng ngeureunkeun prosés pikeun nyegah kernel panik. Nalika prosés PostgreSQL dipaksa pikeun ngeureunkeun, pesen muncul dina log:

Out of Memory: Killed process 12345 (postgres).

Lamun sistem low on memori teu bisa dibébaskeun, fungsi disebut out_of_memory. Dina tahap ieu, manehna ngan boga hiji hal ditinggalkeun - ngalengkepan hiji atawa leuwih prosés. Kedah OOM-killer ngeureunkeun prosés langsung atanapi tiasa ngantosan? Jelas, nalika out_of_memory disebut, éta alatan ngantosan hiji I / O operasi atawa paging kana disk. Ku alatan éta, pembunuh OOM mimitina kedah ngalakukeun cék sareng, dumasar kana éta, mutuskeun yén prosésna kedah ditungtungan. Upami sadaya cék di handap ieu positip, OOM bakal ngeureunkeun prosésna.

Pilihan prosés

Nalika mémori béak, fungsina disebut out_of_memory(). Cai mibanda fungsi select_bad_process(), nu narima evaluasi tina fungsi badness(). Prosés "awon" bakal sasaran. Fungsi badness() milih prosés nurutkeun aturan nu tangtu.

  1. Kernel butuh sababaraha mémori minimum pikeun dirina.
  2. Anjeun kudu ngosongkeun loba memori.
  3. Henteu kedah ngeureunkeun prosés anu nganggo sakedik mémori.
  4. Prosés minimal kedah réngsé.
  5. Algoritma kompléks anu ningkatkeun kasempetan parantosan pikeun prosés-prosés anu ku pangguna nyalira hoyong réngsé.

Sanggeus réngsé sakabéh cék ieu, OOM nalungtik skor (oom_score). OOM napelkeun oom_score unggal prosés, lajeng multiplies nilai ieu ku jumlah memori. Prosés kalayan nilai anu langkung ageung langkung dipikaresep janten korban OOM Killer. Prosés anu aya hubunganana sareng pangguna akar gaduh skor anu langkung handap sareng kamungkinan henteu dipaksa pikeun ngeureunkeun.

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

ID prosés Postgres nyaéta 3813, ku kituna dina cangkang anu sanés tiasa waé kéngingkeun skor nganggo parameter kernel ieu oom_score:

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

Upami anjeun henteu hoyong OOM-Killer maéhan prosésna, aya pilihan kernel anu sanés: oom_score_adj. Nambahkeun hiji nilai négatip badag pikeun ngurangan Chances pikeun ngarengsekeun hiji prosés nu hargana.

sudo echo -100 > /proc/3813/oom_score_adj

Pikeun nyetel nilai oom_score_adj, setel OOMScoreAdjust dina blok jasa:

[Service]
OOMScoreAdjust=-1000

Atawa ngagunakeun oomprotect dina hiji tim rcctl.

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

Maksakeun ngeureunkeun prosés

Lamun hiji atawa leuwih prosés geus dipilih, OOM-Killer nelepon fungsi oom_kill_task(). Pungsi ieu ngirimkeun sinyal terminasi ka prosés. Bisi kakurangan memori oom_kill() Nyauran fungsi ieu pikeun ngirim sinyal SIGKILL kana prosés. Pesen ditulis kana log kernel.

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

Kumaha ngadalikeun OOM-Killer

Dina Linux, anjeun tiasa ngaktipkeun atanapi nganonaktipkeun OOM-Killer (sanaos anu terakhir henteu disarankeun). Pikeun ngaktipkeun atawa nganonaktipkeun make parameter vm.oom-kill. Pikeun ngaktipkeun OOM-Killer dina runtime, ngajalankeun paréntah sysctl.

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

Pikeun nganonaktipkeun OOM-Killer, tangtukeun nilai 0 dina paréntah anu sami:

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

Hasil paréntah ieu moal disimpen salamina, tapi ngan dugi ka reboot munggaran. Upami anjeun peryogi langkung kegigihan, tambahkeun garis ieu kana file /etc/sysctl.conf:

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

Cara séjén pikeun ngaktipkeun sareng nganonaktipkeun nyaéta nyerat variabel panic_on_oom. Nilaina tiasa salawasna dipariksa /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Upami anjeun nyetél nilai ka 0, teras nalika mémori béak, moal aya panik kernel.

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

Upami anjeun nyetél nilai ka 1, teras nalika mémori béak, panik kernel bakal lumangsung.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer henteu ngan ukur tiasa dihurungkeun sareng mareuman. Kami parantos nyarios yén Linux tiasa nyéépkeun langkung seueur mémori pikeun prosés tibatan anu sayogi tanpa leres-leres alokasina, sareng kabiasaan ieu dikawasa ku parameter kernel Linux. Variabel tanggung jawab ieu vm.overcommit_memory.

Anjeun tiasa netepkeun nilai-nilai ieu pikeun éta:

0: Kernel sorangan mutuskeun pikeun cagar teuing memori. Ieu mangrupikeun standar dina kalolobaan vérsi Linux.
1: Kernel bakal salawasna cagar mémori tambahan. Ieu picilakaeun, sabab mémori tiasa kaluar, sabab, paling dipikaresep, hiji poé prosés bakal merlukeun eta.
2: kernel moal cagar leuwih memori ti dieusian dina parameter overcommit_ratio.

Kalawan parameter ieu, anjeun nangtukeun persentase memori nu diwenangkeun pikeun jadi leuwih-ditangtayungan. Upami teu aya rohangan pikeun éta, henteu aya mémori anu dialokasikeun, sareng reservasi bakal ditolak. Ieu mangrupikeun pilihan anu paling aman anu disarankeun pikeun PostgreSQL. OOM-Killer kapangaruhan ku unsur séjén - kamampuhan swapping, nu dikawasa ku variabel cat /proc/sys/vm/swappiness. Nilai-nilai ieu nyarioskeun ka kernel kumaha carana ngadamel paging. Nu leuwih luhur nilai, nu kurang kamungkinan yén OOM bakal nungtungan prosés, tapi alatan operasi I / O eta teu boga dampak negatif kana database. Sabalikna - nu handap nilai, nu leuwih luhur likelihood tina campur OOM-Killer, tapi kinerja database oge luhur. Nilai standar nyaéta 60, tapi upami sadaya databés pas dina mémori, éta langkung saé pikeun nyetél nilai ka 1.

hasil

Ulah ngantep "killer" dina OOM-Killer nyingsieunan anjeun. Dina hal ieu, pembunuh bakal janten Jurusalamet sistem anjeun. Éta "maéhan" prosés anu paling awon sareng ngahémat sistem tina nabrak. Pikeun ngahindarkeun kedah nganggo OOM-Killer pikeun ngeureunkeun PostgreSQL, setel ka vm.overcommit_memory nilai 2. Ieu teu ngajamin yén OOM-Killer moal kudu ngahalangan, tapi bakal ngurangan likelihood maksa prosés PostgreSQL mun nungtungan.

sumber: www.habr.com

Tambahkeun komentar