Kafa Mai Kashe Memory a cikin Linux don PostgreSQL

Kafa Mai Kashe Memory a cikin Linux don PostgreSQL

Lokacin shiga Linux сервер базы данных непредвиденно завершает работу, нужно найти причину. Причин может быть несколько. Например, SIGSEGV - gazawar saboda bug a cikin uwar garken baya. Amma wannan ba kasafai ba ne. Mafi yawan lokuta, kawai kuna ƙarewa daga sarari ko ƙwaƙwalwar ajiya. Idan sararin diski ya ƙare, akwai hanya ɗaya kawai - fitar da sarari kuma sake kunna bayanan.

Kisan Wajen Tunawa

Lokacin da ku uwar garke или процесса заканчивается память, Linux предлагает 2 пути решения: обрушить всю систему или завершить процесс (приложение), который съедает память. Лучше, конечно, завершить процесс и спасти ОС от аварийного завершения. В двух словах, Out-Of-Memory Killer — это процесс, который завершает приложение, чтобы спасти ядро от сбоя. Он жертвует приложением, чтобы сохранить работу ОС. Давайте сначала обсудим, как работает OOM и как его контролировать, а потом посмотрим, как OOM Killer решает, какое приложение завершить.

Одна из главных задач Linux — выделять память процессам, когда они ее просят. Обычно процесс или приложение запрашивают у ОС память, а сами используют ее не полностью. Если ОС будет выдавать память всем, кто ее просит, но не планирует использовать, очень скоро память закончится, и система откажет. Чтобы этого избежать, ОС резервирует память за процессом, но фактически не выдает ее. Память выделяется, только когда процесс действительно собирается ее использовать. Случается, что у ОС нет свободной памяти, но она закрепляет память за процессом, и когда процессу она нужна, ОС выделяет ее, если может. Минус в том, что иногда ОС резервирует память, но в нужный момент свободной памяти нет, и происходит сбой системы. OOM играет важную роль в этом сценарии и завершает процессы, чтобы уберечь ядро от паники. Когда принудительно завершается процесс PostgreSQL, в логе появляется сообщение:

Out of Memory: Killed process 12345 (postgres).

Idan tsarin yana da ƙananan ƙwaƙwalwar ajiya kuma ba za a iya 'yantar da shi ba, ana kiran aikin out_of_memory. A wannan mataki, abu ɗaya kawai ya rage ta yi - kammala tsari ɗaya ko fiye. Shin ya kamata OOM-killer ya ƙare aikin nan da nan ko zai iya jira? A bayyane yake, lokacin da aka kira out_of_memory, yana faruwa ne saboda jiran aikin I/O ko yin amfani da faifai. Don haka, mai kashe OOM dole ne ya fara yin cak kuma, bisa ga su, yanke shawarar cewa ana buƙatar dakatar da tsarin. Idan duk binciken da ke ƙasa yana da inganci, OOM zai ƙare aikin.

Zaɓin tsari

Lokacin da ƙwaƙwalwar ajiya ta ƙare, ana kiran aikin out_of_memory(). Yana da aiki select_bad_process(), wanda ke karɓar kimantawa daga aikin badness(). Hanyar "mafi muni" za a yi niyya. Aiki badness() yana zaɓar tsari bisa ga wasu dokoki.

  1. Kwayar tana buƙatar ɗan ƙaramin ƙwaƙwalwar ajiya don kanta.
  2. Kuna buƙatar yantar da ƙwaƙwalwar ajiya mai yawa.
  3. Babu buƙatar ƙare hanyoyin da ke amfani da ƙananan ƙwaƙwalwar ajiya.
  4. Ana buƙatar kammala mafi ƙarancin matakai.
  5. Hadaddiyar algorithms waɗanda ke haɓaka damar kammalawa ga waɗannan hanyoyin da mai amfani da kansa ke son kammalawa.

Bayan kammala duk waɗannan cak, OOM yayi nazarin maki (oom_score). OOM ya sanya oom_score kowane tsari, sannan ya ninka wannan darajar ta adadin ƙwaƙwalwar ajiya. Tsari tare da ƙima mafi girma suna da yuwuwar faɗawa ga mai kashe OOM. Hanyoyin da ke da alaƙa da tushen mai amfani suna da ƙarancin ƙima kuma ba su da yuwuwar tilastawa su ƙare.

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

ID ɗin tsari na Postgres shine 3813, don haka a cikin wani harsashi yana yiwuwa a sami maki ta amfani da wannan sigar kwaya. oom_score:

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

Idan ba kwa son OOM-Killer ya kashe tsarin kwata-kwata, akwai wani zaɓi na kwaya: oom_score_adj. Ƙara babbar ƙima mara kyau don rage damar kammala aikin da kuke ƙima.

sudo echo -100 > /proc/3813/oom_score_adj

Don saita ƙima oom_score_adj, saita OOMScoreAdaidaita a cikin toshe sabis:

[Service]
OOMScoreAdjust=-1000

Ko amfani oomprotect a cikin tawaga rcctl.

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

Ƙaddamar da aiki

Lokacin da aka riga aka zaɓi ɗaya ko fiye matakai, OOM-Killer yana kiran aikin oom_kill_task(). Wannan aikin yana aika siginar ƙarewa zuwa tsari. Idan akwai karancin ƙwaƙwalwar ajiya oom_kill() Ya kira wannan aikin don aika siginar SIGKILL zuwa aikin. Ana rubuta saƙo zuwa gunkin kwaya.

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

Yadda ake sarrafa OOM-Killer

В Linux можно включать и отключать OOM-Killer (хотя последнее не рекомендуется). Для включения и отключения используйте параметр vm.oom-kill. Don kunna OOM-Killer a lokacin aiki, gudanar da umarni sysctl.

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

Don kashe OOM-Killer, saka ƙimar 0 a cikin wannan umarni:

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

Sakamakon wannan umarni ba zai sami ceto har abada ba, amma sai an sake yi na farko. Idan kuna buƙatar ƙarin dagewa, ƙara wannan layin a cikin fayil ɗin /etc/sysctl.conf:

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

Wata hanya don kunnawa da kashewa ita ce rubuta m panic_on_oom. Ana iya bincika ƙimar koyaushe a ciki /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Idan ka saita ƙimar zuwa 0, to lokacin da ƙwaƙwalwar ajiya ta ƙare, ba za a sami firgita kernel ba.

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

Idan ka saita ƙimar zuwa 1, to lokacin da ƙwaƙwalwar ajiya ta ƙare, tsoro na kernel zai faru.

echo 1 > /proc/sys/vm/panic_on_oom

OOM-Killer можно не только включать и выключать. Мы уже говорили, что Linux может зарезервировать для процессов больше памяти, чем есть, но не выделять ее по факту, и этим поведением управляет параметр ядра Linux. За это отвечает переменная vm.overcommit_memory.

Kuna iya ƙididdige ƙididdiga masu zuwa gare shi:

0: ядро само решает, стоит ли резервировать слишком много памяти. Это значение по умолчанию в большинстве версий Linux.
1: Kwaya koyaushe zai tanadi ƙarin ƙwaƙwalwar ajiya. Wannan yana da haɗari, saboda ƙwaƙwalwar ajiya na iya ƙare, saboda, mafi mahimmanci, wata rana hanyoyin zasu buƙaci shi.
2: kwaya ba zai tanadi ƙarin ƙwaƙwalwar ajiya fiye da ƙayyadaddun bayanai a cikin siga ba overcommit_ratio.

Tare da wannan siga, kuna ƙididdige yawan adadin ƙwaƙwalwar ajiya da aka ba da izinin yin tanadi fiye da kima. Idan babu wani wuri don shi, ba a ware ƙwaƙwalwar ajiya ba, kuma za a hana ajiyar ajiyar. Wannan shine mafi aminci zaɓi da aka ba da shawarar don PostgreSQL. OOM-Killer yana shafar wani abu - ikon musanyawa, wanda mai canzawa ke sarrafa shi cat /proc/sys/vm/swappiness. Waɗannan dabi'u suna gaya wa kernel yadda ake sarrafa rubutun. Mafi girman ƙimar, ƙananan yuwuwar shine OOM zai ƙare aikin, amma saboda ayyukan I/O yana da mummunan tasiri akan bayanan. Kuma akasin haka - ƙananan ƙimar, mafi girman yiwuwar shiga tsakani OOM-Killer, amma aikin bayanai kuma ya fi girma. Tsohuwar ƙimar ita ce 60, amma idan duk bayanan bayanan sun dace da ƙwaƙwalwar ajiya, yana da kyau a saita ƙimar zuwa 1.

Sakamakon

Kada ka bari "kisan" a OOM-Killer ya tsoratar da kai. A wannan yanayin, mai kisan zai zama mai ceton tsarin ku. Yana "kashe" mafi munin matakai kuma ya ceci tsarin daga faduwa. Don guje wa amfani da OOM-Killer don ƙare PostgreSQL, saita zuwa vm.overcommit_memory darajar 2. Wannan baya bada garantin cewa OOM-Killer ba zai shiga tsakani ba, amma zai rage yuwuwar tilasta tsarin PostgreSQL ya ƙare.

source: www.habr.com

Sayi amintaccen masauki don shafuka tare da kariyar DDoS, sabar VPS VDS 🔥 Sayi ingantaccen masaukin yanar gizo tare da kariyar DDoS, sabar VPS VDS | ProHoster