GNU/Linux >> Znalost Linux >  >> Linux

Správa zdrojů pomocí cgroups v systemd

Pro mě jako správce systému je o něco více frustrující než nečekané vyčerpání výpočetního zdroje. Nejednou se mi stalo, že jsem zaplnil veškerý dostupný prostor na disku v oddílu, došlo mi RAM a neměl jsem dostatek času CPU na provedení svých úkolů v rozumném čase. Správa zdrojů je jedním z nejdůležitějších úkolů, které správci systému dělají.

Smyslem správy zdrojů je zajistit, aby všechny procesy měly relativně stejný přístup k systémovým zdrojům, které potřebují. Správa zdrojů také zahrnuje zajištění toho, aby RAM, místo na pevném disku a kapacita CPU byly přidány, když je to nutné, nebo přiděleno, když to není možné. Kromě toho by v tom mělo být zabráněno uživatelům, kteří zabírají systémové prostředky, ať už úmyslně nebo náhodně.

Existují nástroje, které umožňují správcům systému monitorovat a spravovat různé systémové prostředky. Špičkové a podobné nástroje umožňují například sledovat využití paměti, I/O, úložiště (disk, SSD atd.), sítě, odkládacího prostoru, využití CPU a další. Tyto nástroje, zejména ty, které jsou zaměřeny na CPU, jsou většinou založeny na paradigmatu, že běžící proces je jednotkou řízení. V nejlepším případě poskytují způsob, jak upravit pěkné číslo – a tím i prioritu – nebo zabít běžící proces. (Informace o pěkných číslech viz Monitorování hostitelů Linuxu a Windows pomocí Glances .)

Více o sysadmins

  • Povolit blog Sysadmin
  • Automatizovaný podnik:průvodce řízením IT pomocí automatizace
  • eKniha:Ansible Automation for SysAdmins
  • Příběhy z terénu:Průvodce správcem systému pro automatizaci IT
  • eKniha:Průvodce Kubernetes pro SRE a správce systému
  • Nejnovější články správce systému

Další nástroje založené na tradiční správě zdrojů v prostředí SystemV jsou spravovány /etc/security/limits.conf a místní konfigurační soubory umístěné v /etc/security/limits.d adresář. Zdroje mohou být omezeny poměrně hrubým, ale užitečným způsobem uživatelem nebo skupinou. Mezi zdroje, které lze spravovat, patří různé aspekty paměti RAM, celkový čas procesoru za den, celkové množství dat, priorita, pěkný počet, počet souběžných přihlášení, počet procesů, maximální velikost souboru a další.

Použití cgroups pro správu procesů

Jedním z hlavních rozdílů mezi systemd a SystemV je způsob, jakým zpracovávají procesy. SystemV zachází s každým procesem jako s entitou pro sebe. systemd shromažďuje související procesy do kontrolních skupin, nazývaných cgroups (zkratka pro kontrolní skupiny), a spravuje systémové prostředky pro cgroup jako celek. To znamená, že zdroje mohou být spravovány podle aplikace, nikoli pomocí jednotlivých procesů, které aplikaci tvoří.

Řídicí jednotky pro cgroups se nazývají jednotky slice. Řezy jsou konceptualizace, která umožňuje systému systemd uspořádat procesy ve stromovém formátu pro snadnou správu.

Zobrazení cgroups

Začnu s některými příkazy, které vám umožňují zobrazit různé typy informací o cgroups. systemctl status <service> zobrazí informace o řezu o zadané službě, včetně jejího řezu. Tento příklad ukazuje at démon:

[root@testvm1 ~]# systemctl status atd.service
● atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-09-23 12:18:24 EDT; 1 day 3h ago
       Docs: man:atd(8)
   Main PID: 1010 (atd)
      Tasks: 1 (limit: 14760)
     Memory: 440.0K
        CPU: 5ms
     CGroup: /system.slice/atd.service
             └─1010 /usr/sbin/atd -f

Sep 23 12:18:24 testvm1.both.org systemd[1]: Started Deferred execution scheduler.
[root@testvm1 ~]#

Toto je vynikající příklad jednoho důvodu, proč mi systemd připadá použitelnější než SystemV a starý init program. Je zde mnohem více informací, než by SystemV mohl poskytnout. Záznam cgroup obsahuje hierarchickou strukturu, kde je system.slice je systemd (PID 1) a atd.service je o úroveň níže a je součástí system.slice . Druhý řádek záznamu cgroup také zobrazuje ID procesu (PID) a příkaz použitý ke spuštění démona.

systemctl příkaz zobrazí více položek cgroup. --all volba zobrazí všechny řezy, včetně těch, které nejsou aktuálně aktivní:

[root@testvm1 ~]# systemctl -t slice --all
  UNIT                             LOAD   ACTIVE   SUB    DESCRIPTION                    
  -.slice                          loaded active   active Root Slice                      
  system-getty.slice               loaded active   active system-getty.slice              
  system-lvm2\x2dpvscan.slice      loaded active   active system-lvm2\x2dpvscan.slice    
  system-modprobe.slice            loaded active   active system-modprobe.slice          
  system-sshd\x2dkeygen.slice      loaded active   active system-sshd\x2dkeygen.slice    
  system-systemd\x2dcoredump.slice loaded inactive dead   system-systemd\x2dcoredump.slice
  system-systemd\x2dfsck.slice     loaded active   active system-systemd\x2dfsck.slice    
  system.slice                     loaded active   active System Slice                    
  user-0.slice                     loaded active   active User Slice of UID 0            
  user-1000.slice                  loaded active   active User Slice of UID 1000          
  user.slice                       loaded active   active User and Session Slice          

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

11 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
[root@testvm1 ~]#

První věc, kterou si na těchto datech všimnete, je, že zobrazují uživatelské řezy pro UID 0 (root) a 1000, což je moje přihlašovací jméno. Zobrazí se pouze řezy, nikoli služby, které jsou součástí každého řezu. Tato data ukazují, že pro každého uživatele je vytvořen řez v době, kdy se přihlásí. To může poskytnout způsob, jak spravovat všechny úkoly uživatele jako jediná entita cgroup.

Prozkoumejte hierarchii cgroup

Vše je zatím v pořádku, ale cgroups jsou hierarchické a všechny servisní jednotky běží jako členové jedné z cgroups. Zobrazení této hierarchie je snadné a používá jeden starý příkaz a jeden nový, který je součástí systemd.

ps příkaz lze použít k mapování procesů a jejich umístění v hierarchii cgroup. Pamatujte, že při použití ps je nutné zadat požadované datové sloupce příkaz. Výrazně jsem snížil objem výstupu z tohoto příkazu níže, ale snažil jsem se nechat dost, abyste si mohli udělat představu o tom, co můžete na svých systémech najít:

[root@testvm1 ~]# ps xawf -eo pid,user,cgroup,args
    PID USER     CGROUP                      COMMAND
      2 root     -                           [kthreadd]
      3 root     -                            \_ [rcu_gp]
      4 root     -                            \_ [rcu_par_gp]
      6 root     -                            \_ [kworker/0:0H-kblockd]
      9 root     -                            \_ [mm_percpu_wq]
     10 root     -                            \_ [ksoftirqd/0]
     11 root     -                            \_ [rcu_sched]
     12 root     -                            \_ [migration/0]
     13 root     -                            \_ [cpuhp/0]
     14 root     -                            \_ [cpuhp/1]
<SNIP>
 625406 root     -                            \_ [kworker/3:0-ata_sff]
 625409 root     -                            \_ [kworker/u8:0-events_unbound]
      1 root     0::/init.scope              /usr/lib/systemd/systemd --switched-root --system --deserialize 30
    588 root     0::/system.slice/systemd-jo /usr/lib/systemd/systemd-journald
    599 root     0::/system.slice/systemd-ud /usr/lib/systemd/systemd-udevd
    741 root     0::/system.slice/auditd.ser /sbin/auditd
    743 root     0::/system.slice/auditd.ser  \_ /usr/sbin/sedispatch
    764 root     0::/system.slice/ModemManag /usr/sbin/ModemManager
    765 root     0::/system.slice/NetworkMan /usr/sbin/NetworkManager --no-daemon
    767 root     0::/system.slice/irqbalance /usr/sbin/irqbalance --foreground
    779 root     0::/system.slice/mcelog.ser /usr/sbin/mcelog --ignorenodev --daemon --foreground
    781 root     0::/system.slice/rngd.servi /sbin/rngd -f
    782 root     0::/system.slice/rsyslog.se /usr/sbin/rsyslogd -n
<SNIP>
    893 root     0::/system.slice/sshd.servi sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
   1130 root     0::/user.slice/user-0.slice  \_ sshd: root [priv]
   1147 root     0::/user.slice/user-0.slice  |   \_ sshd: root@pts/0
   1148 root     0::/user.slice/user-0.slice  |       \_ -bash
   1321 root     0::/user.slice/user-0.slice  |           \_ screen
   1322 root     0::/user.slice/user-0.slice  |               \_ SCREEN
   1323 root     0::/user.slice/user-0.slice  |                   \_ /bin/bash
 498801 root     0::/user.slice/user-0.slice  |                   |   \_ man systemd.resource-control
 498813 root     0::/user.slice/user-0.slice  |                   |       \_ less
   1351 root     0::/user.slice/user-0.slice  |                   \_ /bin/bash
 123293 root     0::/user.slice/user-0.slice  |                   |   \_ man systemd.slice
 123305 root     0::/user.slice/user-0.slice  |                   |       \_ less
   1380 root     0::/user.slice/user-0.slice  |                   \_ /bin/bash
 625412 root     0::/user.slice/user-0.slice  |                   |   \_ ps xawf -eo pid,user,cgroup,args
 625413 root     0::/user.slice/user-0.slice  |                   |   \_ less
 246795 root     0::/user.slice/user-0.slice  |                   \_ /bin/bash
 625338 root     0::/user.slice/user-0.slice  |                       \_ /usr/bin/mc -P /var/tmp/mc-root/mc.pwd.246795
 625340 root     0::/user.slice/user-0.slice  |                           \_ bash -rcfile .bashrc
   1218 root     0::/user.slice/user-1000.sl  \_ sshd: dboth [priv]
   1233 dboth    0::/user.slice/user-1000.sl      \_ sshd: dboth@pts/1
   1235 dboth    0::/user.slice/user-1000.sl          \_ -bash
<SNIP>
   1010 root     0::/system.slice/atd.servic /usr/sbin/atd -f
   1011 root     0::/system.slice/crond.serv /usr/sbin/crond -n
   1098 root     0::/system.slice/lxdm.servi /usr/sbin/lxdm-binary
   1106 root     0::/system.slice/lxdm.servi  \_ /usr/libexec/Xorg -background none :0 vt01 -nolisten tcp -novtswitch -auth /var/run/lxdm/lxdm-:0.auth
 370621 root     0::/user.slice/user-1000.sl  \_ /usr/libexec/lxdm-session
 370631 dboth    0::/user.slice/user-1000.sl      \_ xfce4-session
 370841 dboth    0::/user.slice/user-1000.sl          \_ /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4"
 370911 dboth    0::/user.slice/user-1000.sl          \_ xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2
 370930 dboth    0::/user.slice/user-1000.sl          \_ xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952
 370942 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libsystray.so 6 23068680 systr
ay Notification Area Area where notification icons appear
 370943 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libpulseaudio-plugin.so 8 2306
8681 pulseaudio PulseAudio Plugin Adjust the audio volume of the PulseAudio sound system
 370944 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libxfce4powermanager.so 9 2306
8682 power-manager-plugin Power Manager Plugin Display the battery levels of your devices and control the brightness of your display
 370945 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libnotification-plugin.so 10 2
3068683 notification-plugin Notification Plugin Notification plugin for the Xfce panel
 370948 dboth    0::/user.slice/user-1000.sl          |   \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libactions.so 14 23068684 acti
ons Action Buttons Log out, lock or other system actions
 370934 dboth    0::/user.slice/user-1000.sl          \_ Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon
 370939 dboth    0::/user.slice/user-1000.sl          \_ xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324
 370962 dboth    0::/user.slice/user-1000.sl          \_ nm-applet
<SNIP>

Celou hierarchii můžete zobrazit pomocí systemd-cgls příkaz, který je o něco jednodušší, protože nevyžaduje žádné složité volby.

Tento stromový pohled jsem značně zkrátil. také, ale nechal jsem toho dost, abych vám poskytl určitou představu o množství dat a také o typech záznamů, které byste měli vidět, když to uděláte ve svém systému. Udělal jsem to na jednom ze svých virtuálních počítačů a má asi 200 řádků; množství dat z mé primární pracovní stanice je asi 250 řádků:

[root@testvm1 ~]# systemd-cgls
Control group /:
-.slice
├─user.slice
│ ├─user-0.slice
│ │ ├─session-1.scope
│ │ │ ├─  1130 sshd: root [priv]
│ │ │ ├─  1147 sshd: root@pts/0
│ │ │ ├─  1148 -bash
│ │ │ ├─  1321 screen
│ │ │ ├─  1322 SCREEN
│ │ │ ├─  1323 /bin/bash
│ │ │ ├─  1351 /bin/bash
│ │ │ ├─  1380 /bin/bash
│ │ │ ├─123293 man systemd.slice
│ │ │ ├─123305 less
│ │ │ ├─246795 /bin/bash
│ │ │ ├─371371 man systemd-cgls
│ │ │ ├─371383 less
│ │ │ ├─371469 systemd-cgls
│ │ │ └─371470 less
│ │ └─[email protected]
│ │   ├─dbus-broker.service
│ │   │ ├─1170 /usr/bin/dbus-broker-launch --scope user
│ │   │ └─1171 dbus-broker --log 4 --controller 12 --machine-id 3bccd1140fca488187f8a1439c832f07 --max-bytes 100000000000000 --max-fds 25000000000000 --max->
│ │   ├─gvfs-daemon.service
│ │   │ └─1173 /usr/libexec/gvfsd
│ │   └─init.scope
│ │     ├─1137 /usr/lib/systemd/systemd --user
│ │     └─1138 (sd-pam)
│ └─user-1000.slice
│   ├─[email protected]
│   │ ├─dbus\x2d:1.2\x2dorg.xfce.Xfconf.slice
│   │ │ └─dbus-:[email protected]
│   │ │   └─370748 /usr/lib64/xfce4/xfconf/xfconfd
│   │ ├─dbus\x2d:1.2\x2dca.desrt.dconf.slice
│   │ │ └─dbus-:[email protected]
│   │ │   └─371262 /usr/libexec/dconf-service
│   │ ├─dbus-broker.service
│   │ │ ├─1260 /usr/bin/dbus-broker-launch --scope user
│   │ │ └─1261 dbus-broker --log 4 --controller 11 --machine-id
<SNIP>
│   │ └─gvfs-mtp-volume-monitor.service
│   │   └─370987 /usr/libexec/gvfs-mtp-volume-monitor
│   ├─session-3.scope
│   │ ├─1218 sshd: dboth [priv]
│   │ ├─1233 sshd: dboth@pts/1
│   │ └─1235 -bash
│   └─session-7.scope
│     ├─370621 /usr/libexec/lxdm-session
│     ├─370631 xfce4-session
│     ├─370805 /usr/bin/VBoxClient --clipboard
│     ├─370806 /usr/bin/VBoxClient --clipboard
│     ├─370817 /usr/bin/VBoxClient --seamless
│     ├─370818 /usr/bin/VBoxClient --seamless
│     ├─370824 /usr/bin/VBoxClient --draganddrop
│     ├─370825 /usr/bin/VBoxClient --draganddrop
│     ├─370841 /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4"
│     ├─370910 /bin/gpg-agent --sh --daemon --write-env-file /home/dboth/.cache/gpg-agent-info
│     ├─370911 xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2
│     ├─370923 xfsettingsd --display :0.0 --sm-client-id 261b4a437-3029-461c-9551-68c2c42f4fef
│     ├─370930 xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952
│     ├─370934 Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon
│     ├─370939 xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324
<SNIP>
└─system.slice
  ├─rngd.service
  │ └─1650 /sbin/rngd -f
  ├─irqbalance.service
  │ └─1631 /usr/sbin/irqbalance --foreground
  ├─fprintd.service
  │ └─303383 /usr/libexec/fprintd
  ├─systemd-udevd.service
  │ └─956 /usr/lib/systemd/systemd-udevd
<SNIP>
  ├─systemd-journald.service
  │ └─588 /usr/lib/systemd/systemd-journald
  ├─atd.service
  │ └─1010 /usr/sbin/atd -f
  ├─system-dbus\x2d:1.10\x2dorg.freedesktop.problems.slice
  │ └─dbus-:[email protected]
  │   └─371197 /usr/sbin/abrt-dbus -t133
  ├─sshd.service
  │ └─893 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
  ├─vboxservice.service
  │ └─802 /usr/sbin/VBoxService -f
  ├─crond.service
  │ └─1011 /usr/sbin/crond -n
  ├─NetworkManager.service
  │ └─765 /usr/sbin/NetworkManager --no-daemon
  ├─switcheroo-control.service
  │ └─787 /usr/libexec/switcheroo-control
 <SNIP>

Toto stromové zobrazení ukazuje všechny uživatelské a systémové části a služby a programy běžící v každé cgroup. Všimněte si jednotek nazývaných „rozsahy“, které seskupují související programy do jednotky správy v rámci user-1000.slice ve výše uvedeném seznamu. user-1000.slice/session-7.scope cgroup obsahuje hierarchii desktopových programů GUI, počínaje relací správce zobrazení LXDM a všemi jeho dílčími úkoly, včetně věcí, jako je prostředí Bash a správce souborů GUI Thunar.

Jednotky rozsahu nejsou definovány v konfiguračních souborech, ale jsou generovány programově jako výsledek spouštění skupin souvisejících programů. Jednotky rozsahu nevytvářejí ani nespouštějí procesy běžící jako součást této cgroup. Všechny procesy v rámci rozsahu jsou rovnocenné a neexistuje žádná vnitřní hierarchie. Životnost rozsahu začíná, když je vytvořen první proces, a končí, když je poslední proces zničen.

Otevřete na ploše několik oken, jako jsou emulátory terminálu, LibreOffice nebo cokoli jiného, ​​pak se přepněte na dostupnou virtuální konzoli a spusťte něco jako top nebo Midnight Commander. Spusťte systemd-cgls příkaz na vašem hostiteli a poznamenejte si celkovou hierarchii a jednotky rozsahu.

systemd-cgls příkaz poskytuje úplnější reprezentaci hierarchie cgroup (a podrobnosti o jednotkách, které ji tvoří), než kterýkoli jiný příkaz, který jsem našel. Dávám přednost jeho čistší reprezentaci stromu než ps příkaz poskytuje.

S malou pomocí mých přátel

Po probrání těchto základů jsem měl v plánu jít do podrobností o cgroups a jejich používání, ale na sesterském webu Enable Sysadmin od Opensource.com jsem objevil sérii čtyř vynikajících článků Steva Ovense z Red Hatu. Spíše než v podstatě přepisování Stevových článků jsem se rozhodl, že by bylo mnohem lepší využít jeho odbornosti cgroup tím, že na ně odkazuji:

  1. Úvod správce systému Linux do cgroups
  2. Jak spravovat cgroups pomocí CPUShares
  3. Správa cgroups obtížným způsobem – ručně
  4. Správa cgroups pomocí systemd

Užívejte si je a učte se od nich, stejně jako já.

Další zdroje

Na internetu je k dispozici velké množství informací o systemd, ale mnohé jsou stručné, tupé nebo dokonce zavádějící. Kromě zdrojů uvedených v tomto článku nabízejí následující webové stránky podrobnější a spolehlivější informace o spouštění systemd. Tento seznam se rozrostl od doby, kdy jsem začal s touto sérií článků, aby odrážel výzkum, který jsem provedl.

  • Projekt Fedora má dobrého praktického průvodce systemd. Obsahuje téměř vše, co potřebujete vědět, abyste mohli nakonfigurovat, spravovat a udržovat počítač Fedora pomocí systemd.
  • Projekt Fedora má také dobrý cheat sheet, který křížově odkazuje na staré příkazy SystemV se srovnatelnými příkazy systemd.
  • Manuálová stránka systemd.unit(5) obsahuje pěkný seznam sekcí souborů jednotek a jejich konfiguračních možností spolu se stručným popisem každé z nich.
  • Dokumentace Red Hat obsahuje dobrý popis struktury souborů Unit a další důležité informace.
  • Podrobné technické informace o systemd a důvodech pro jeho vytvoření naleznete v popisu systemd na Freedesktop.org. Tato stránka je jednou z nejlepších, které jsem našel, protože obsahuje mnoho odkazů na další důležitou a přesnou dokumentaci.
  • Pokročilejší systémové informace a tipy nabízí stránka Linux.com „More systemd fun“.
  • Viz manuálovou stránku systemd.resource-control(5).
  • V Příručce uživatele a správce jádra Linux , viz položka Control Group v2.

Existuje také řada hluboce technických článků pro správce systému Linux od Lennarta Poetteringa, návrháře a primárního vývojáře systemd. Tyto články byly napsány mezi dubnem 2010 a zářím 2011, ale nyní jsou stejně aktuální jako tehdy. Většina všeho dobrého, co bylo napsáno o systemd a jeho ekosystému, je založeno na těchto dokumentech.

  • Přehodnocení PID 1
  • systemd pro administrátory, část I
  • systemd pro administrátory, část II
  • systemd pro administrátory, část III
  • systemd pro administrátory, část IV
  • systemd pro administrátory, část V
  • systemd pro administrátory, část VI
  • systemd pro administrátory, část VII
  • systemd pro administrátory, část VIII
  • systemd pro administrátory, část IX
  • systemd pro administrátory, část X
  • systemd pro administrátory, část XI

Linux
  1. Správa oddílů v Linuxu pomocí fdisk

  2. Vytváření a správa oddílů v Linuxu s parted

  3. RedHat / CentOS :Správa softwarového RAID pomocí mdadm

  1. Správa připojeného hardwaru v systému Linux pomocí systemd-udevd

  2. Systemd s více execStart

  3. Konfigurace služby Systemd pro spuštění s přístupem root

  1. Tato chyba o Upstart/systemd With Runit?

  2. Negrafické spouštění pomocí Systemd?

  3. Omezte paměť a procesor pomocí lxc-execute