GNU/Linux >> Znalost Linux >  >> Linux

Linux Out-of-Memory Killer

Každá distribuce Linuxu obsahuje proces Out-of-Memory (OOM) Killer, ale co to je? Jednoduše řečeno, jde o proces sebezáchovy serveru. Abyste plně pochopili, co to znamená, zvažte, jak Linux alokuje paměť.

Přidělení paměti Linux

Linuxové jádro přiděluje paměť na vyžádání pro všechny aplikace aktuálně spuštěné na serveru. Protože k tomu obvykle dochází předem, aplikace obvykle nevyužívají veškerou přiřazenou paměť. To umožňuje jádru přetížit paměť, čímž je paměť efektivnější. Toto nadměrné zavázání umožňuje jádru odevzdat více paměti, než je skutečně fyzicky dostupné. Obvykle se nejedná o problém. Problém nastává, když příliš mnoho aplikací najednou začne využívat paměť, která jim byla přidělena. Serveru hrozí riziko selhání, protože mu došla paměť. Aby se zabránilo serveru v dosažení tohoto kritického stavu, obsahuje jádro také proces známý jako OOM Killer . Jádro používá tento proces k zahájení zabíjení nepodstatných procesů, aby server mohl zůstat funkční.

I když si možná myslíte, že by to neměl být problém, procesy OOM Killerkills, které server považoval za nepodstatné, nikoli uživatel. Dvě aplikace, které OOM Killer obvykle zabije jako první, jsou například Apache® a MySQL®, protože využívají velké množství paměti. Každý, kdo má webové stránky, okamžitě ví, že je to velký problém. Pokud OOM Killer zabije kteréhokoli z nich, web často okamžitě spadne.

Proč byl konkrétní proces zabit?

Když se snažíte zjistit, proč OOM zabiják zabil aplikaci nebo proces, můžete hledat pár věcí, které vám mohou pomoci odhalit, jak a proč byl proces zabit. První místo, kam se podívat, je syslog spuštěním následujícího příkazu:

$ grep -i kill /var/log/messages*
host kernel: Out of Memory: Killed process 5123 (exampleprocess)

Měli byste získat výstup podobný předchozímu příkladu. Velké K vKilled říká, že proces byl zabit -9 signál, a to je obvykle dobrý indikátor toho, že za to může OOM Killer.

Kromě toho můžete spustit následující příkaz a zkontrolovat statistiku vysoké a nízké paměti serveru:

$ free -lh

-l přepínač zobrazuje statistiku vysoké a nízké paměti a -h přepínač převádí výstup do gigabajtů pro snadnější čitelnost pro člověka. Toto můžete změnit na -m přepněte, pokud dáváte přednost výstupu v megabajtech. Další výhodou tohoto příkazu je, že vám také poskytuje informace o využití paměti Swap. Jednou z výhrad je, že free příkaz poskytuje pouze snímek tohoto okamžiku, takže jej musíte několikrát zkontrolovat, abyste získali představu o tom, co se děje.

Naštěstí vmstat příkaz získává výstup paměti po určitou dobu a má dokonce možnost pro snadno čitelnou tabulku:

$ vmstat -SM 10 20

Předchozí příkaz vydává informace o systémové paměti dvacetkrát v 10sekundových intervalech. To je to, co znamenají 10 a 20 v předchozím příkladu. Obě tato čísla můžete změnit tak, aby odpovídala frekvenci a součtu, který lépe vyhovuje vašim potřebám. -S přepínač zobrazí výstup ve formátu tabulky a -M přepínač zobrazuje výstup v megabajtech. Tento příkaz použijte k zobrazení toho, co se aktivně děje během zadaných časových parametrů.

Dalším dobrým nástrojem k použití je samozřejmě top příkaz. top standardně objednává výstup podle proměnné CPU, ale pokud kliknete na Shift + M po spuštění top můžete získat aktualizace v reálném čase pro využití paměti namísto využití CPU.

Nakonfigurujte OOM Killer

Protože OOM Killer je proces, můžete jej nakonfigurovat tak, aby lépe vyhovoval vašim potřebám. Ve skutečnosti má OOM Killer již několik možností konfigurace, které umožňují správcům a vývojářům serveru vybrat, jak chtějí, aby se proces OOM Killer choval, když čelí paměť-se-nebezpečně-nízká situace. Mějte na paměti, že tyto možnosti se mohou lišit v závislosti na faktorech, jako je prostředí a spuštěné aplikace.

Stejně jako u všeho, co zahrnuje změny konfigurací, je vždy lepší otestovat navrhované změny ve vývojovém nebo přípravném prostředí, než tyto změny provedete v živém produkčním prostředí. Tímto způsobem víte, jak systém na tyto změny reaguje. Nakonec, i když jste si svým plánem jisti, vždy si před provedením jakýchkoli změn vytvořte zálohu. Pro následující možnosti konfigurace musíte být root uživatel.

Možnost 1:Restartovat

První možnost zahrnuje úpravu sysctl konfigurace (/etc/sysctl.conf ), což umožňuje, aby vaše změny přetrvávaly i mezi restarty:

sysctl vm.panic_on_oom=1
sysctl kernel.panic=X
echo “vm.panic_on_oom=1” >> /etc/sysctl.conf
echo “kernel.panic=X” >> /etc/sysctl.conf

X v předchozím příkazu je počet sekund, po které má systém čekat, než se restartuje.

Ve většině situací není možné restartovat pokaždé, když má systém kriticky málo paměti. I když může být tento přístup v některých situacích nezbytný, většina z nich nepotřebuje ani nezaručuje restart celého systému, aby se problém vyřešil.

Možnost 2:Ochrana nebo obětování procesů

Tato konkrétní možnost vyžaduje jemnější přístup. Můžete buď (a) chránit určité procesy tím, že snížíte pravděpodobnost jejich zabití OOM Killerem, nebo (b) nastavit určité procesy tak, aby byly pravděpodobněji zabity. Můžete to provést pomocí následujících příkazů:

echo -15 > /proc/(PID)/oom_adj			(less likely)
echo 10 > /proc/(PID)/oom_adj			(more likely)

Nahraďte (PID) zástupný symbol v ukázkovém příkazu s ID konkrétního procesu (nebo PID), které vás zajímá. Chcete-li chránit nebo obětovat proces, musíte najít nadřazený proces (originál). Pomocí následujícího příkazu vyhledejte PPID (nebo ID nadřazeného procesu), kde proces nahradíte svým procesem (například Apache, MySQL atd.):

pstree -p | grep "process" | head -1

Můžete vidět, že tato možnost je o něco lepší než jaderná možnost restartu celého systému. Co když však máte proces, který je zásadní a nelze jej zabít?

Možnost 3:Vyjmout proces

Tato možnost je dodávána s upozorněním. Vyjmutí procesů může za určitých okolností způsobit nezamýšlené změny chování, které do značné míry závisí na konfiguraci systému a prostředků. Pokud jádro nemůže zabít proces využívající velké množství paměti, začne zabíjet další dostupné procesy. To může zahrnovat procesy, které mohou být také důležité pro procesy operačního systému. V důsledku toho by systém mohl potenciálně spadnout úplně. Stačí říci, používejte tuto možnost s extrémní opatrností.

Protože platný rozsah pro úpravy OOM Killer je mezi -16 a +15 , nastavení -17 zcela vyjímá proces, protože spadá mimo rozsah přijatelných celých čísel pro stupnici úprav OOM Killer. Obecné pravidlo zní:čím vyšší je číselná hodnota, tím je pravděpodobnější, že bude proces zabit. Příkaz pro úplné vyjmutí aprocesu je tedy:

echo -17 > /proc/(PID)/oom_adj

Možnost 4:Riziková možnost

Upozornění :Rackspace to nedoporučuje pro produkční prostředí.

Pokud restartování a ochrana, obětování nebo vynětí procesů prostě nestačí, je tu poslední, riskantní možnost:úplně deaktivovat OOM Killer možnost.

Tato možnost může způsobit některý z následujících výsledků:

  • vážná jaderná panika
  • zaseknutí systému
  • úplné selhání systému

Proč? Zabraňuje serveru, aby si sám nedošel zdroje. Pokud OOM Killer úplně deaktivujete, pak nic neochrání server před nedostatkem paměti. Při zvažování této možnosti buďte extrémně zdrženliví a opatrní.

Chcete-li použít tuto možnost, spusťte následující příkaz:

sysctl vm.overcommit_memory=2
echo “vm.overcommit_memory=2” >> /etc/sysctl.conf

Nyní, když jste se dozvěděli o OOM Killer, víte, jak přizpůsobit proces vašim individuálním potřebám prostředí a systému. Obecným pravidlem je, že buďte opatrní, kdykoli upravujete procesy jádra. OOM Killer není výjimkou z tohoto pravidla.


Linux
  1. Jak vymazat mezipaměť v Linuxu

  2. Linux – skutečné využití paměti?

  3. Linux – Jak se Oom Killer rozhodne, který proces zabije jako první?

  1. Přijmout signál, než je proces zabit Oom Killer / Cgroups?

  2. Může Linux vymazat paměť?

  3. Vyhněte se rušení linuxové aplikace kvůli nedostatku paměti

  1. Využití paměti Linuxu

  2. Vydání Kali Linux 2018.1

  3. Zjištění, který proces zabil Linux OOM killer