GNU/Linux >> Znalost Linux >  >> Linux

Tlačítko „zabít největší proces“?

Tento notebook má SSD a proto jsem se rozhodl swap vynechat. Ve většině případů to funguje dobře, ale někdy se RAM trochu zkracuje a počítač je opravdu pomalý a má tendenci zamrzat. Existuje způsob, jak implementovat tlačítko „zabít největší proces“, které půjde přímo do jádra v případě, že zaznamenám zamrznutí dostatečně rychle? Nebo, protože je to počítač, heuristika pro případ, kdy začne zamrzat a natáčet největší proces, by byla také v pořádku.

Přijatá odpověď:

Z vašeho komentáře to zní, jako by se systém jen vyměňoval.

Linux má OOM killer, který se vyvolá, když systém přetíží svou paměť, a nyní je vyčerpán.
Linux ve výchozím nastavení provádí overcommit paměti, což v podstatě znamená, že dává programům více paměti, než má systém ve skutečnosti. Dělá to za předpokladu, že programy ve skutečnosti nevyužijí veškerou paměť, kterou požadují. Když však systému dojde paměť, již sdělil různým běžícím procesům, že paměť mají, takže to už nemůže jen tak odepřít. Místo toho, co dělá, je vyvolat OOM zabijáka. OOM zabiják v podstatě najde proces, o kterém si jádro myslí, že zmírní stav nedostatku paměti. Obvykle se jedná pouze o proces využívající největší množství paměti, ale algoritmus je ve skutečnosti mnohem složitější.

Protože máte overcommit_memory nastavte na (automatický režim), jádro provádí overcommit paměti. Takže z vašeho vysvětleného chování to zní, jako by se systém jen silně přehazoval.

Odtud jsou 2 možnosti.

Omezit swap

Vašemu systému dochází RAM, a tak jádro začne strkat věci do swapu. Pokud vašemu systému dojde swap, spustí se OOM zabiják. Protože však máte zbývající volný odkládací prostor, nestane se to.

Váš původní nápad, ručně zabít proces.

Můžete ručně zabít proces, když si myslíte, že systém příliš přehazuje a něco musí zemřít. To lze provést pomocí spouštěčů SysRq jádra.

Jádro má to, co nazývá „magický SysRq“. Toto je malá funkce, která říká jádru, aby provedlo nějakou nouzovou operaci. Mohou to být věci jako „znovu připojit všechny svazky jen pro čtení“, „synchronizovat všechny systémy souborů“ nebo „restartovat nyní“. Jednou z těchto možností je také vyvolat OOM zabijáka.

Související:Jak provádět celočíselné a floatové výpočty v bash nebo jiných jazycích/rámcích?

Pokud má vaše jádro povoleno magic SysRq (možnost jádra CONFIG_MAGIC_SYSRQ ), můžete to udělat dvěma způsoby.

  1. Alt + SysRq + f
    Jednoduše stiskněte tyto 3 klávesy na klávesnici.
  2. echo f > /proc/sysrq-trigger
    To provede přesně stejný úkol jako metoda klávesnice, ale programově.

Můžete také úplně zakázat swap, a to je to, co dělám na většině svých systémů, a to přesně z tohoto důvodu. Swap je výhodný v tom, že jádro preventivně vymění data, která se nepoužívají, a umožní tak použití větší části paměti RAM pro ukládání do mezipaměti. Vede to však k tomuto problému s nucenou výměnou, který vidíte.

Osobně si myslím, že nejlepším řešením je nějaká možnost jádra pro vyvolání OOM killeru při vynucené výměně. V zásadě nechte fungovat preemptivní swap, ale pokud je jádro nuceno přesunout něco do swapu, protože vám došla RAM, pak vyvolejte OOM zabijáka.
Bohužel je to jen mé osobní přání. Nedělá to.


Linux
  1. Linux – Proč nemůže jádro spustit inicializaci?

  2. Linux – proprietární nebo uzavřené části jádra?

  3. Konečné otázky k pohovoru s Linuxem:swap

  1. Spuštění funkce uživatelského prostoru z prostoru jádra

  2. Jaký je aktuální zdrojový kód jádra Linuxu?

  3. Jak zkontrolovat HZ v terminálu?

  1. Linuxové jádro:5 nejlepších inovací

  2. Kam jde zbývající paměť vm.overcommit_ratio?

  3. Jak velký by měl být swapovací oddíl?