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:
- Úvod správce systému Linux do cgroups
- Jak spravovat cgroups pomocí CPUShares
- Správa cgroups obtížným způsobem – ručně
- 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