Nyetél Pembunuh Anu Henteu Mémorina Linux pikeun PostgreSQL

Nyetél Pembunuh Anu Henteu Mémorina Linux pikeun PostgreSQL

Nalika di Linux Server database eureun sacara teu disangka-sangka, sareng panyababna kedah ditangtukeun. Tiasa 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

Nalika anjeun sérver atanapi prosésna béak mémori, Linux Out-Of-Memory Killer nawiskeun dua solusi: ngadatkeun sakabéh sistem atanapi mungkas prosés (aplikasi) anu ngahakan mémori. Tangtosna, langkung saé mungkas prosés sareng nyalametkeun OS tina ngadat. Singkatna, Out-Of-Memory Killer nyaéta prosés anu mungkas aplikasi pikeun nyalametkeun kernel tina ngadat. Éta ngorbankeun aplikasi pikeun ngajaga OS tetep jalan. Hayu urang bahas heula kumaha OOM jalan sareng kumaha ngontrolna, teras tingali kumaha OOM Killer mutuskeun aplikasi mana anu kedah ditungtungan.

Salah sahiji tugas utama Linux — Ngalokasikeun mémori ka prosés nalika dipénta. Biasana, prosés atanapi aplikasi nyuhunkeun mémori ti OS tapi henteu nganggona sacara lengkep. Upami OS ngalokasikeun mémori ka sadayana anu nyuhunkeun tapi henteu ngarencanakeun pikeun nganggona, sistem bakal gancang béak mémori, sareng sistem bakal nabrak. Pikeun nyegah ieu, OS nyimpen mémori pikeun prosés tapi henteu sabenerna ngalokasikeunana. Mémori dialokasikeun ngan ukur nalika prosés sabenerna niat nganggona. Kadang-kadang OS henteu gaduh mémori bébas, tapi ngalokasikeun mémori ka prosés, sareng nalika prosés peryogina, OS ngalokasikeunana upami tiasa. Kakuranganna nyaéta kadang-kadang OS nyimpen mémori, tapi nalika diperyogikeun, teu aya mémori bébas, anu nyababkeun sistem nabrak. OOM maénkeun peran konci dina skénario ieu, ngeureunkeun prosés pikeun nyegah kernel panik. Nalika prosés PostgreSQL kapaksa réngsé, pesen ieu 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

В Linux Anjeun tiasa ngaktipkeun atanapi nganonaktipkeun OOM-Killer (sanaos anu terakhir henteu disarankeun). Pikeun ngaktipkeun atanapi nganonaktipkeunana, anggo 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 tiasa dihurungkeun sareng dipareuman, sapertos anu parantos kami sebatkeun. Linux bisa jadi leuwih loba mémori nu disimpen pikeun prosés tibatan nu sayaga, tapi sabenerna teu bisa ngalokasikeunana, sarta paripolah ieu dikontrol ku parameter kernel. LinuxVariabelna tanggung jawab kana ieu. vm.overcommit_memory.

Anjeun tiasa netepkeun nilai-nilai ieu pikeun éta:

0: Kernel sorangan anu mutuskeun naha rék nyimpen teuing loba mémori. Ieu mangrupikeun nilai 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

Mésér hosting anu dipercaya pikeun situs anu gaduh panyalindungan DDoS, server VPS VDS 🔥 Meser hosting situs wéb anu tiasa dipercaya nganggo panyalindungan DDoS, server VPS VDS | ProHoster