C'è poco più frustrante per me come amministratore di sistema che esaurire inaspettatamente una risorsa di elaborazione. In più di un'occasione, ho riempito tutto lo spazio su disco disponibile in una partizione, ho esaurito la RAM e non avevo abbastanza tempo di CPU per eseguire le mie attività in un ragionevole lasso di tempo. La gestione delle risorse è una delle attività più importanti svolte dagli amministratori di sistema.
Lo scopo della gestione delle risorse è garantire che tutti i processi abbiano un accesso relativamente uguale alle risorse di sistema di cui hanno bisogno. La gestione delle risorse implica anche garantire che RAM, spazio su disco rigido e capacità della CPU vengano aggiunti quando necessario o razionati quando ciò non è possibile. Inoltre, agli utenti che monopolizzano le risorse di sistema, intenzionalmente o accidentalmente, dovrebbe essere impedito di farlo.
Esistono strumenti che consentono agli amministratori di sistema di monitorare e gestire varie risorse di sistema. Ad esempio, gli strumenti migliori e simili consentono di monitorare l'uso di memoria, I/O, storage (disco, SSD, ecc.), rete, spazio di scambio, utilizzo della CPU e altro. Questi strumenti, in particolare quelli incentrati sulla CPU, sono per lo più basati sul paradigma che il processo in esecuzione è l'unità di controllo. Nella migliore delle ipotesi, forniscono un modo per regolare il numero corretto - e, attraverso questo, la priorità - o per interrompere un processo in esecuzione. (Per informazioni sui numeri interessanti, vedere Monitoraggio di host Linux e Windows con Sguardi .)
Altro sugli amministratori di sistema
- Abilita blog Sysadmin
- The Automated Enterprise:una guida alla gestione dell'IT con l'automazione
- eBook:Ansible Automation per SysAdmins
- Racconti dal campo:una guida per l'amministratore di sistema all'automazione IT
- eBook:una guida a Kubernetes per SRE e amministratori di sistema
- Ultimi articoli sull'amministratore di sistema
Altri strumenti basati sulla gestione tradizionale delle risorse in un ambiente SystemV sono gestiti da /etc/security/limits.conf
e i file di configurazione locali che si trovano in /etc/security/limits.d
directory. Le risorse possono essere limitate in modo abbastanza grezzo ma utile per utente o gruppo. Le risorse che possono essere gestite includono vari aspetti della RAM, tempo totale della CPU al giorno, quantità totale di dati, priorità, numero corretto, numero di accessi simultanei, numero di processi, dimensione massima del file e altro.
Utilizzo di cgroup per la gestione dei processi
Una delle principali differenze tra systemd e SystemV è il modo in cui gestiscono i processi. SystemV tratta ogni processo come un'entità a sé stante. systemd raccoglie i processi correlati in gruppi di controllo, chiamati cgroups (abbreviazione di gruppi di controllo), e gestisce le risorse di sistema per il cgroup nel suo insieme. Ciò significa che le risorse possono essere gestite per applicazione anziché dai singoli processi che compongono un'applicazione.
Le unità di controllo per cgroup sono chiamate unità slice. Le fette sono una concettualizzazione che consente a systemd di ordinare i processi in un formato ad albero per una facile gestione.
Visualizzazione di cgroup
Inizierò con alcuni comandi che ti consentono di visualizzare vari tipi di informazioni su cgroups. Lo stato systemctl status <service>
Il comando visualizza le informazioni sulla sezione su un servizio specifico, inclusa la relativa sezione. Questo esempio mostra il at
demone:
[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 ~]#
Questo è un eccellente esempio di una delle ragioni per cui trovo systemd più utilizzabile di SystemV e del vecchio programma init. Ci sono molte più informazioni qui di quelle che SystemV potrebbe fornire. La voce cgroup include la struttura gerarchica in cui si trova system.slice
è systemd (PID 1) e atd.service
è un livello sotto e fa parte di system.slice
. La seconda riga della voce cgroup mostra anche l'ID del processo (PID) e il comando utilizzato per avviare il demone.
Il systemctl
il comando mostra più voci di cgroup. Il --all
l'opzione mostra tutte le sezioni, comprese quelle attualmente non attive:
[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 ~]#
La prima cosa da notare su questi dati è che mostra le sezioni utente per gli UID 0 (root) e 1000, che è il mio login utente. Questo mostra solo le sezioni e non i servizi che fanno parte di ciascuna sezione. Questi dati mostrano che viene creata una sezione per ogni utente al momento dell'accesso. Ciò può fornire un modo per gestire tutte le attività di un utente come un'unica entità cgroup.
Esplora la gerarchia di cgroup
Tutto è andato bene finora, ma i cgroup sono gerarchici e tutte le unità di servizio vengono eseguite come membri di uno dei cgroup. Visualizzare quella gerarchia è facile e utilizza un vecchio comando e uno nuovo che fa parte di systemd.
Il ps
Il comando può essere utilizzato per mappare i processi e le loro posizioni nella gerarchia di cgroup. Si noti che è necessario specificare le colonne di dati desiderate quando si utilizza il ps
comando. Ho ridotto significativamente il volume di output da questo comando di seguito, ma ho cercato di lasciare abbastanza in modo che tu possa avere un'idea di ciò che potresti trovare sui tuoi sistemi:
[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>
Puoi visualizzare l'intera gerarchia con systemd-cgls
comando, che è un po' più semplice perché non richiede opzioni complesse.
Ho accorciato considerevolmente questa vista ad albero. anche, ma ho lasciato abbastanza per darti un'idea della quantità di dati e dei tipi di voci che dovresti vedere quando lo fai sul tuo sistema. L'ho fatto su una delle mie macchine virtuali ed è lungo circa 200 righe; la quantità di dati dalla mia workstation principale è di circa 250 righe:
[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>
Questa vista ad albero mostra tutte le sezioni utente e sistema ei servizi e programmi in esecuzione in ogni cgroup. Nota le unità chiamate "scopes", che raggruppano i programmi correlati in un'unità di gestione, all'interno di user-1000.slice
nell'elenco sopra. user-1000.slice/session-7.scope
cgroup contiene la gerarchia del programma desktop della GUI, a partire dalla sessione del display manager LXDM e tutte le sue attività secondarie, incluse cose come la shell Bash e il file manager della GUI di Thunar.
Le unità dell'ambito non sono definite nei file di configurazione, ma vengono generate a livello di codice come risultato dell'avvio di gruppi di programmi correlati. Le unità di ambito non creano o avviano i processi in esecuzione come parte di quel cgroup. Tutti i processi all'interno dell'ambito sono uguali e non esiste una gerarchia interna. La vita di un ambito inizia quando viene creato il primo processo e termina quando l'ultimo processo viene distrutto.
Apri diverse finestre sul desktop, come emulatori di terminale, LibreOffice o qualsiasi altra cosa desideri, quindi passa a una console virtuale disponibile e avvia qualcosa come top
o il comandante di mezzanotte. Esegui systemd-cgls
comando sul tuo host e prendi nota della gerarchia generale e delle unità di ambito.
Il systemd-cgls
command fornisce una rappresentazione più completa della gerarchia di cgroup (e dei dettagli delle unità che la compongono) rispetto a qualsiasi altro comando che ho trovato. Preferisco la sua rappresentazione più pulita dell'albero rispetto a quella di ps
comando fornisce.
Con un piccolo aiuto dai miei amici
Dopo aver trattato queste nozioni di base, avevo programmato di approfondire i cgroup e come usarli, ma ho scoperto una serie di quattro eccellenti articoli di Steve Ovens di Red Hat sul sito gemello di Opensource.com, Enable Sysadmin. Piuttosto che riscrivere sostanzialmente gli articoli di Steve, ho deciso che sarebbe stato molto meglio sfruttare la sua esperienza in cgroup collegandomi ad essi:
- Un'introduzione di un amministratore di sistema Linux a cgroups
- Come gestire i cgroup con CPUShares
- Gestire i cgroup nel modo più difficile, manualmente
- Gestire cgroup con systemd
Divertiti e impara da loro, come ho fatto io.
Altre risorse
Ci sono molte informazioni su systemd disponibili su Internet, ma molte sono concise, ottuse o addirittura fuorvianti. Oltre alle risorse menzionate in questo articolo, le seguenti pagine Web offrono informazioni più dettagliate e affidabili sull'avvio di systemd. Questo elenco è cresciuto da quando ho iniziato questa serie di articoli per riflettere la ricerca che ho fatto.
- Il progetto Fedora ha una buona guida pratica a systemd. Ha praticamente tutto ciò che devi sapere per configurare, gestire e mantenere un computer Fedora usando systemd.
- Il progetto Fedora ha anche un buon cheat sheet che incrocia i vecchi comandi SystemV con quelli di systemd comparabili.
- La pagina di manuale di systemd.unit(5) contiene un bell'elenco di sezioni di file di unità e le relative opzioni di configurazione insieme a descrizioni concise di ciascuna.
- La documentazione di Red Hat contiene una buona descrizione della struttura del file Unit e altre informazioni importanti.
- Per informazioni tecniche dettagliate su systemd e le ragioni per crearlo, controlla la descrizione di systemd di Freedesktop.org. Questa pagina è una delle migliori che ho trovato perché contiene molti collegamenti ad altra documentazione importante e accurata.
- "Più divertimento di sistema" di Linux.com offre informazioni e suggerimenti più avanzati sul sistema.
- Vedi la pagina man per systemd.resource-control(5).
- In Guida per l'utente e l'amministratore del kernel Linux , vedi la voce Gruppo di controllo v2.
C'è anche una serie di articoli profondamente tecnici per gli amministratori di sistema Linux di Lennart Poettering, il designer e sviluppatore principale di systemd. Questi articoli sono stati scritti tra aprile 2010 e settembre 2011, ma sono rilevanti ora come allora. Gran parte di tutto ciò che è stato scritto di buono su systemd e il suo ecosistema si basa su questi documenti.
- Ripensare il PID 1
- systemd per amministratori, parte I
- sistema per amministratori, parte II
- sistema per amministratori, parte III
- systemd per amministratori, parte IV
- sistema per amministratori, parte V
- sistema per amministratori, parte VI
- sistema per amministratori, parte VII
- systemd per amministratori, parte VIII
- systemd per amministratori, parte IX
- sistema per amministratori, parte X
- systemd per amministratori, parte XI