Apr 122015
 

systemd è una suite di demoni per la gestione del sistema, librerie ed utility progettate per dirigere centralmente e configurare il sistema operativo GNU/Linux.
Fornisce un gestore per il sistema ed i servizi che viene eseguito come PID 1 e avvia il resto del sistema come alternativa al tradizionale Sysvinit .
systemd fornisce funzionalità di parallelizzazione aggressive, è possibile attivare socket e D-Bus per i servizi che si stanno avviando, offre demoni che possono partire a richiesta,

Sta diventando lo standard per tutte le principali distribuzioni GNU/Linux ed al momento è il default per Arch Linux, Red Hat Enterprise/CentOS (versione 7), Fedora, Mageia e Suse Enterprise, è pianificato il suo utilizzo su Debian 8 ed Ubuntu 15.04.

Ci sono un sacco di persone che “parlano” a favore e contro systemd in rete in quanto alcuni lo vedono come troppo intrusivo, complesso e contro la la < a href=”http://en.wikipedia.org/wiki/Unix_philosophy”>filosofia Unix di mantenere le cose semplici e fare un solo compito con un programma.

Utilizzando Red Hat 7 al lavoro e Arch Linux sul mio portatile ho iniziato ad usarlo e devo dire che sono d’accordo che non è così semplice in partenza, ma cerchiamo di prendere le cose buone ed in questo articolo mi piacerebbe mostrarvi qualche comando che è possibile utilizzare con systemd per gestire i processi e che ho trovato molto utile.


Processesi e cgroups

systemd organizza i processi con cgroups ,questa è una caratteristica del kernel Linux per limitare, dare delle policy e gestire l’utilizzo delle risorse di alcuni processi (in realtà gruppi di processi). Rispetto ad altri approcci, come il comando ‘nice’ o /etc/security/limits.conf, i cgroups sono più flessibili.

I gruppi di controllo possono essere utilizzati in diversi modi:

  • crearli e gestirli al volo utilizzando strumenti come cgcreate, cgexec, cgclassify etc
  • il “rules engine daemon”, per spostare automaticamente alcuni utenti/gruppi/gruppi di comandi  (/etc/cgrules.conf e /usr/lib/systemd/system/cgconfig.service)
  • Attraverso dei software come i Linux Containers (LXC)

Quindi i Control Groups sono due cose: (A) un modo per dare una gerarchia ed etichette a gruppi di processi , e (B) un modo per applicare i limiti delle risorse a questi gruppi. systemd richiede solo la prima cosa (A), e non la seconda (B).

Questo uso dei cgroups si può vedere con il comando ps, che è stato aggiornato per mostrare cgroups. Utilizzare questo comando per vedere quale servizio possiede quale processo:

$ ps xawf -eo pid,user,cgroup,args
  PID USER     CGROUP                              COMMAND
    2 root     -                                   [kthreadd]
    3 root     -                                    \_ [ksoftirqd/0]
[...]
 4281 root     -                                    \_ [flush-8:0]
    1 root     name=systemd:/systemd-1             /sbin/init
  455 root     name=systemd:/systemd-1/sysinit.service /sbin/udevd -d
28188 root     name=systemd:/systemd-1/sysinit.service  \_ /sbin/udevd -d
28191 root     name=systemd:/systemd-1/sysinit.service  \_ /sbin/udevd -d
 1096 dbus     name=systemd:/systemd-1/dbus.service /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
 1131 root     name=systemd:/systemd-1/auditd.service auditd
 1133 root     name=systemd:/systemd-1/auditd.service  \_ /sbin/audispd
 1135 root     name=systemd:/systemd-1/auditd.service      \_ /usr/sbin/sedispatch
 1171 root     name=systemd:/systemd-1/NetworkManager.service /usr/sbin/NetworkManager --no-daemon
 4028 root     name=systemd:/systemd-1/NetworkManager.service  \_ /sbin/dhclient -d -4 -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-wlan0.pid -lf /var/lib/dhclient/dhclient-7d32a784-ede9-4cf6-9ee3-60edc0bce5ff-wlan0.lease -
 1175 avahi    name=systemd:/systemd-1/avahi-daemon.service avahi-daemon: running [epsilon.local]
 1194 avahi    name=systemd:/systemd-1/avahi-daemon.service  \_ avahi-daemon: chroot helper
 1193 root     name=systemd:/systemd-1/rsyslog.service /sbin/rsyslogd -c 4
 1195 root     name=systemd:/systemd-1/cups.service cupsd -C /etc/cups/cupsd.conf
 1207 root     name=systemd:/systemd-1/mdmonitor.service mdadm --monitor --scan -f --pid-file=/var/run/mdadm/mdadm.pid
 1210 root     name=systemd:/systemd-1/irqbalance.service irqbalance
 1216 root     name=systemd:/systemd-1/dbus.service /usr/sbin/modem-manager
 1219 root     name=systemd:/systemd-1/dbus.service /usr/libexec/polkit-1/polkitd
 1242 root     name=systemd:/systemd-1/dbus.service /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -B -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid
 1249 68       name=systemd:/systemd-1/haldaemon.service hald
 1250 root     name=systemd:/systemd-1/haldaemon.service  \_ hald-runner
 1273 root     name=systemd:/systemd-1/haldaemon.service      \_ hald-addon-input: Listening on /dev/input/event3 /dev/input/event9 /dev/input/event1 /dev/input/event7 /dev/input/event2 /dev/input/event0 /dev/input/event8
 1275 root     name=systemd:/systemd-1/haldaemon.service      \_ /usr/libexec/hald-addon-rfkill-killswitch
 1284 root     name=systemd:/systemd-1/haldaemon.service      \_ /usr/libexec/hald-addon-leds
 1285 root     name=systemd:/systemd-1/haldaemon.service      \_ /usr/libexec/hald-addon-generic-backlight
 1287 68       name=systemd:/systemd-1/haldaemon.service      \_ /usr/libexec/hald-addon-acpi
 1317 root     name=systemd:/systemd-1/abrtd.service /usr/sbin/abrtd -d -s
 1332 root     name=systemd:/systemd-1/getty@.service/tty2 /sbin/mingetty tty2
 1339 root     name=systemd:/systemd-1/getty@.service/tty3 /sbin/mingetty tty3
 1342 root     name=systemd:/systemd-1/getty@.service/tty5 /sbin/mingetty tty5
 1343 root     name=systemd:/systemd-1/getty@.service/tty4 /sbin/mingetty tty4
 1344 root     name=systemd:/systemd-1/crond.service crond
.....

Nella terza colonna si vede il systemd cgroup assegnato ad ogni processo. Troverete che i processi udev utilizzano il nome = systemd: cgroup /systemd-1/sysinit.service, che è dove systemd mette tutti i processi avviati dal servizio sysinit.service, che copre l’avvio dei processi iniziali.

Un modo diverso di presentare le stesse informazioni è lo strumento systemd-cgls che viene fornito con systemd. Esso mostra la gerarchia cgroup in un bel albero. Il suo output è simile al seguente:

$ systemd-cgls
+    2 [kthreadd]
[...]
+ 4281 [flush-8:0]
+ user
| \ lennart
|   \ 1
|     +  1495 pam: gdm-password
|     +  1521 gnome-session
|     +  1534 dbus-launch --sh-syntax --exit-with-session
|     +  1535 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
|     +  1603 /usr/libexec/gconfd-2
|     +  1612 /usr/libexec/gnome-settings-daemon
|     +  1615 /ushr/libexec/gvfsd
|     +  1621 metacity
|     +  1626 /usr/libexec//gvfs-fuse-daemon /home/lennart/.gvfs
|     +  1634 /usr/bin/pulseaudio --start --log-target=syslog
|     +  1635 gnome-panel
|     +  1638 nautilus
|     +  1640 /usr/libexec/polkit-gnome-authentication-agent-1
|     +  1641 /usr/bin/seapplet
|     +  1644 gnome-volume-control-applet
|     +  1645 /usr/libexec/bonobo-activation-server --ac-activate --ior-output-fd=24
|     +  1646 /usr/sbin/restorecond -u
|     +  1649 /usr/libexec/pulse/gconf-helper
|     +  1652 /usr/bin/devilspie
|     +  1662 nm-applet --sm-disable
|     +  1664 gnome-power-manager
|     +  1665 /usr/libexec/gdu-notification-daemon
|     +  1668 /usr/libexec/im-settings-daemon
|     +  1670 /usr/libexec/evolution/2.32/evolution-alarm-notify
|     +  1672 /usr/bin/python /usr/share/system-config-printer/applet.py
|     +  1674 /usr/lib64/deja-dup/deja-dup-monitor
|     +  1675 abrt-applet
|     +  1677 bluetooth-applet
|     +  1678 gpk-update-icon
|     +  1701 /usr/libexec/gvfs-gdu-volume-monitor
|     +  1707 /usr/bin/gnote --panel-applet --oaf-activate-iid=OAFIID:GnoteApplet_Factory --oaf-ior-fd=22
|     +  1725 /usr/libexec/clock-applet
|     +  1727 /usr/libexec/wnck-applet
|     +  1729 /usr/libexec/notification-area-applet
|     +  1759 gnome-screensaver
|     +  1780 /usr/libexec/gvfsd-trash --spawner :1.9 /org/gtk/gvfs/exec_spaw/0
|     +  1864 /usr/libexec/gvfs-afc-volume-monitor
|     +  1874 /usr/libexec/gconf-im-settings-daemon
|     +  1882 /usr/libexec/gvfs-gphoto2-volume-monitor
|     +  1903 /usr/libexec/gvfsd-burn --spawner :1.9 /org/gtk/gvfs/exec_spaw/1
|     +  1909 gnome-terminal
|     +  1913 gnome-pty-helper
|     +  1914 bash
|     +  1968 ssh-agent
|     +  1994 gpg-agent --daemon --write-env-file
|     +  2221 bash
|     +  2461 bash
|     +  4193 ssh tango
|     + 15113 bash
|     + 18679 /bin/sh /usr/lib64/firefox-3.6/run-mozilla.sh /usr/lib64/firefox-3.6/firefox
|     + 18741 /usr/lib64/firefox-3.6/firefox
|     + 27251 empathy
|     + 27262 /usr/libexec/mission-control-5
|     + 27265 /usr/libexec/telepathy-haze
|     + 27268 /usr/libexec/telepathy-logger
|     + 27270 /usr/libexec/dconf-service
|     + 27280 /usr/libexec/notification-daemon
|     + 27284 /usr/libexec/telepathy-gabble
|     + 27285 /usr/libexec/telepathy-salut
|     + 27297 /usr/libexec/geoclue-yahoo
|     + 28900 /usr/lib64/nspluginwrapper/npviewer.bin --plugin /usr/lib64/mozilla/plugins/libflashplayer.so --connection /org/wrapper/NSPlugins/libflashplayer.so/18741-6
|     + 29219 emacs systemd-for-admins-1.txt
|     + 29231 ssh tango
|     \ 29519 systemd-cgls
\ systemd-1
  + 1 /sbin/init
  + ntpd.service
  | \ 4112 /usr/sbin/ntpd -n -u ntp:ntp -g
  + systemd-logger.service
  | \ 1499 /lib/systemd/systemd-logger
  + accounts-daemon.service
  | \ 1496 /usr/libexec/accounts-daemon
  + rtkit-daemon.service
  | \ 1473 /usr/libexec/rtkit-daemon
  + console-kit-daemon.service
  | \ 1408 /usr/sbin/console-kit-daemon --no-daemon
  + prefdm.service
  | + 1376 /usr/sbin/gdm-binary -nodaemon
  | + 1391 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1 --force-active-vt
  | + 1394 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-f2KUOh/database -nolisten tcp vt1
  | + 1419 /usr/bin/dbus-launch --exit-with-session
  | \ 1511 /usr/bin/gnome-keyring-daemon --daemonize --login
  + getty@.service
  | + tty6
  | | \ 1346 /sbin/mingetty tty6
  | + tty4
  | | \ 1343 /sbin/mingetty tty4
  | + tty5
  | | \ 1342 /sbin/mingetty tty5
  | + tty3
  | | \ 1339 /sbin/mingetty tty3
  | \ tty2
  |   \ 1332 /sbin/mingetty tty2
  + abrtd.service
  | \ 1317 /usr/sbin/abrtd -d -s
  + crond.service
  | \ 1344 crond
  + sshd.service
  | \ 1362 /usr/sbin/sshd
  + sendmail.service
  | + 4094 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
  | \ 4096 sendmail: accepting connections
  + auditd.service
  | + 1131 auditd
  | + 1133 /sbin/audispd
  | \ 1135 /usr/sbin/sedispatch
....

questo comando mostra i processi per il loro cgroup e quindi il servizio, come etichette systemd con i cgroups dopo i servizi. Ad esempio, si può facilmente vedere che il servizio auditd.service genera tre processi individuali, auditd, audisp e sedispatch.

Quando è necessario uccidere un servizio si può uccidere tramite il nome cgroup, in modo da non dover cercare tutti i PID o utilizzare comandi come killall o pgrep, come esempio per uccidere tutti i processi del servizio auditd è possibile utilizzare il comando :

# systemctl kill auditd.service

Questo farà sì che SIGTERM venga inviato a tutti i processi del servizio auditd, non solo al processo principale. Naturalmente, è possibile anche inviare un segnale diverso, se lo si desidera.

# systemctl kill -s SIGKILL auditd.service

A volte è sufficiente inviare un segnale specifico per il processo principale di un servizio, forse perché si vuole attivare una ripartenza via SIGHUP. Invece di ricercare il PID, ecco un modo più semplice per farlo:

# systemctl kill -s HUP –kill-who=main crond.service

E dal mio punto di vista questo è davvero ottimo!
Non più ps -ef | grep qualcosa | awk qualcosa | uccidi il risultato dell’awk 🙂

Analisi dell’uso delle risorse

Per comprendere l’utilizzo delle risorse di tutti i servizi, gli sviluppatori hanno creato lo strumento systemd systemd-cgtop , che mostrerà tutti cgroups del sistema, determina il loro utilizzo delle risorse (CPU, memoria, e IO) e le presenta con uno stile simile al comando top. Basandosi sul fatto che i servizi systemd sono gestiti in cgroups questo strumento, quindi, può presentare i servizi come top mostra i processi.

Purtroppo, per impostazione predefinita cgtop sarà solo in grado di tracciare l’utilizzo della CPU per-servizio, IO e memoria sono monitorati solo come totale per l’intera macchina. La ragione di questo è semplicemente che per default non ci sono cgroups per-service blkio e memory nelle gerarchie del controller, ma questo è ciò che è necessario per determinare l’utilizzo delle risorse.

Se è necessario il monitoraggio delle risorse per queste risorse si consiglia di aggiungere blkio e memory per il parametro DefaultControllers= in /etc/systemd/system.conf (vedi systemd.conf(5) per i dettagli). In alternativa, è possibile abilitare la risorsa di audit singolarmente per servizi, facendo uso dell’opzione ControlGroup= nei file unitari (Vedere systemd.exec (5) per i dettagli).

Per sottolineare questo: a meno che blkio e memory siano abilitati per i servizi in questione, con una delle opzioni suggerite sopra nessuna informazione sull’utilizzo delle risorse sarà disponibile per i servizi di sistema ed i dati mostrati da systemd-cgtop saranno incompleti.

Risorse

Managing Services on Linux with systemd

Dal creatore di systemd:


Popular Posts:

Flattr this!

  2 Responses to “Come gestire i processi con cgroup su Systemd”

  1. What? No comments in three days? And we were told that systemd was soooo popular an very much appreciated by Linux users worldwide!

  2. Great article!
    One question, though: when I create a service through systemd, does it automatically generates its own cgroup? I am curious about it because I configured microservices (2 standalone jars) to run as services (using systemd). When I execute systemctl -l status service1 It outputs some description showing a main PID, and a cgroup tree, describing the service file path I configured, a sh file path that I also created and finally the jar file path I am running as a microservices. Does this microservice, in this cenario, have isolated resources as in a container approach (such as Docker)?
    Thanks!!

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*