GNU/Linux >> Znalost Linux >  >> Linux

Správa cgroups obtížným způsobem - ručně

V první části jsem diskutoval o funkci a použití cgroups pro správu systému a ladění výkonu. Ve druhé části jsem si všiml složitosti hodnot cgroups a CPUShares. Zde ve třetí části se zaměřuji na manuální administrativní úlohy pro cgroups.

Nezapomeňte si přečíst ve čtvrté části o tom, jak cgroups pracují s systemd.

Cgroups tvrdě

Pojďme se podívat na to, jak vytvořit cgroups bez jakýchkoliv nástrojů kolem nich. Ve své podstatě jsou cgroups jednoduše adresářová struktura s cgroups namontované do nich. Mohou být umístěny kdekoli v souborovém systému, ale cgroups vytvořené systémem najdete v /sys/fs/cgroup ve výchozím stavu. Jak tedy vytvoříte cgroups? Začněte vytvořením následujícího adresáře nejvyšší úrovně:

# mkdir -p /my_cgroups

Po vytvoření se rozhodněte, které ovladače chcete použít. Pamatujte, že struktura cgroups verze 1 vypadá asi takto:

/my_cgroups
├── <controller type>
│   ├── <group 1>
│   ├── <group 2>
│   ├── <group 3>

[ Čtenářům se také líbilo:Úvod do crunu, rychlého běhu kontejneru s nízkou pamětí ]

Všechny skupiny, které chcete vytvořit, jsou vnořeny samostatně pod každý typ ovladače. Proto skupina1 pod ovladačem memory je zcela nezávislý na group1 v blkio . S ohledem na to vytvoříme základní příklad CPUShares.

Pro jednoduchost vygeneruji zatížení systému spuštěním:

# cat /dev/urandom

To vytváří určité umělé zatížení systému pro snadné měření. Toto není skutečný příklad zatížení, ale zdůrazňuje hlavní body CPUShares. Také jsem nastavil virtuální stroj se systémem CentOS 8 s jedním vCPU, aby byla matematika opravdu jednoduchá. S ohledem na to je prvním krokem vytvoření některých adresářů pro naše řadiče cgroup:

# mkdir -p /my_cgroups/{memory,cpusets,cpu}

Dále připojte cgroups do těchto složek:

# mount -t cgroup -o memory none /my_cgroups/memory
# mount -t cgroup -o cpu,cpuacct none /my_cgroups/cpu
# mount -t cgroup -o cpuset none /my_cgroups/cpusets

Chcete-li vytvořit své vlastní skupiny cgroups, jednoduše vytvořte nový adresář pod řadičem, který chcete použít. V tomto případě mám co do činění se souborem cpu.shares , který se nachází v cpu adresář. Vytvořme tedy několik cgroups pod cpu ovladač:

# mkdir -p /my_cgroups/cpu/{user1,user2,user3}

Všimněte si, že adresáře jsou automaticky naplněny řadičem:

# ls -l /my_cgroup/cpu/user1/
-rw-r--r--. 1 root root 0 Sep  5 10:26 cgroup.clone_children
-rw-r--r--. 1 root root 0 Sep  5 10:26 cgroup.procs
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.stat
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_all
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu_sys
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu_user
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_sys
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_user
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Sep  5 10:20 cpu.shares
-r--r--r--. 1 root root 0 Sep  5 10:26 cpu.stat
-rw-r--r--. 1 root root 0 Sep  5 10:26 notify_on_release
-rw-r--r--. 1 root root 0 Sep  5 10:23 tasks

Nyní, když mám nastavené nějaké cgroups, je čas vygenerovat nějakou zátěž. Za tímto účelem jednoduše otevřu tři relace SSH a spustím následující příkaz v popředí:

# cat /dev/urandom

Výsledky můžete vidět top :

DŮLEŽITÁ POZNÁMKA :Pamatujte, že CPUShares jsou založeny na cgroup nejvyšší úrovně, která je ve výchozím nastavení neomezená. To znamená, že pokud by proces výše ve stromu vyžadoval CPUShares, systém dá tomuto procesu prioritu. To může lidi zmást. Je důležité mít vizuální reprezentaci rozvržení cgroup v systému, aby se předešlo zmatkům.

Na výše uvedeném snímku obrazovky můžete vidět, že všechny cat procesy dostávají víceméně stejné množství času CPU. Je to proto, že ve výchozím nastavení mají cgroups v cpu.shares hodnotu 1024 . Tato sdílení jsou omezena vztahem rodiče k jiným cgroups, jak bylo uvedeno výše. V našem příkladu jsem neupravoval váhu žádného z rodičů. Pokud tedy všechny nadřazené cgroups požadují zdroje současně, použije se výchozí váha 1024 CPUShares.

Vraťme se k našemu příkladu, vytvořil jsem cgroup s některými výchozími hodnotami. To znamená, že každá skupina má výchozí váhu 1024. Chcete-li to změnit, jednoduše změňte hodnoty v cpu.shares soubor:

# echo 2048 > user1/cpu.shares
# echo 768 > user2/cpu.shares
# echo 512 > user3/cpu.shares

Výborně, teď mám složitější výpočet váhy, ale ve skutečnosti jsem do cgroup nepřidal žádné procesy. Proto je cgroup neaktivní. Chcete-li přidat proces do cgroup, jednoduše přidejte požadované PID do tasks soubor:

# echo 2023 > user1/tasks

Zde je výsledek přidání procesu do cgroup, jak je vidět v top :

Jak vidíte na obrázku výše, proces v nové cgroup zabírá zhruba polovinu času CPU. To je způsobeno rovnicí z dříve:

Pojďme do toho a přidejte další dva procesy do jejich příslušných cgroups a sledujte výsledky:

# echo 2024 > user2/tasks
# echo 2025 > user3/tasks

Nyní vidíme, že vážení se projevilo pomocí cgroup user1 zabírá asi 61 % času CPU:

Zbývající čas je rozdělen mezi uživatele2 a uživatel3 .

S naším testovacím nastavením je samozřejmě několik problémů.

  1. Všechny jsou vytvořeny ručně. Co se stane, když proces, který vkládáte do cgroup, změní své PID?
  2. Vytvořené vlastní soubory a složky nepřežijí restart.
  3. Je to hodně manuální práce. Kde jsou nástroje?

Nemějte strach, přátelé, systém vás pokryl.

[ Bezplatný online kurz:Technický přehled Red Hat Enterprise Linux. ] 

Zabalit

Nyní, když lépe rozumíme ruční správě cgroups, můžeme lépe ocenit hodnotu společné spolupráce cgroups a systemd. Tuto myšlenku zkoumám ve čtvrté části této série. Mimochodem, čtvrtá část je závěr.


Linux
  1. Zakažte přihlášení pomocí účtu root

  2. Jak fungují vnitřnosti sudo?

  3. Existuje inverzní příkaz k řezání?

  1. Správa zdrojů pomocí cgroups v systemd

  2. Jaký je účel skupiny „wheel“ v Linuxu

  3. Jak zkontrolovat stav pevného disku

  1. Jak spustit příkaz jako správce systému (root)?

  2. Funkce kořene uživatelské skupiny??

  3. Linux – Je lomítko (/) součástí názvu kořenového adresáře Linuxu?