tuto3: telegraf with cgroups v2

This commit is contained in:
nemunaire 2022-10-26 16:57:27 +02:00
parent a9f149b2e4
commit 8195919d22
2 changed files with 89 additions and 11 deletions

View File

@ -82,14 +82,17 @@ accessible ici :
### Permettre à l'utilisateur de monitorer des processus
Maintenant, séparons notre script en deux parties afin qu'un utilisateur normal
(non-root) puisse utiliser la partie monitoring de notre script.
(non-root) puisse utiliser la partie monitoring de notre script. La procédure
sera différente suivant la version des *cgroup*s que vous utilisez.
#### *cgroup*s v1\
Un premier script doit s'occuper de créer le(s) *cgroup*s et lui attribuer les
bons droits (`chown $EUID`), tandis que le deuxième va effectuer le monitoring,
sans privilèges particuliers.
#### Exemple {-}
##### Exemple {-}
\
<div lang="en-US">
```
42sh$ sudo ./telegraf_init.sh my_cgroup_name
@ -97,4 +100,79 @@ sans privilèges particuliers.
```
</div>
#### *cgroup*s v2\
On part du principe que `systemd` est le système d'initialisation de votre
machine et qu'il gère lui-même l'arborescence.
Dans cette version des *cgroup*s, on peut toujours déléguer une partie de
l'arborescence à un utilisateur, au moyen d'un `chown`, cependant une
contrainte supplémentaire entre en jeu. Lorsque l'on veut déplacer un
processus, il faut avoir les droits d'écriture à la fois sur la destination,
mais également sur la source, et sur tous les nœuds de l'arborescence que l'on
peut croiser lors du parcourt de l'arbre.
Cela signifie, qu'après avoir `mkdir -p virli/child1 virli/child2 && chown -R
$EUID:$EUID virli`, il est possible de déplacer un processus de :
```
/virli/child1
```
vers
```
/virli/child2
```
car on dispose bien des droits d'écriture sur l'ancêtre commun le plus proche
(à savoir `/virli`).
Les problèmes surviennent lorsque l'on souhaite déplacer un processus que
`systemd` a placé dans :
```
/user.slice/user@$UID.service/app.slice/app-alacritty-0a1b2c3d4e5f6e7d9c
```
Il ne sera alors pas possible de le déplacer vers `/virli/child1`, car
l'ancêtre commun le plus proche est la racine des *cgroup*s, sur laquelle
l'utilisateur n'a pas les droits d'écriture.\
Pour faire cet exercice, vous allez donc devoir rechercher l'ancêtre commun le
plus proche sur lequel votre utilisateur a les droits d'écritures.
En utilisant `systemd` :
```
42sh$ systemctl --user show | grep ControlGroup
ControlGroup=/user.slice/user-1234.slice/user@1234.service
```
Ou bien en recherchant dans l'arborescence des *cgroup*s votre processus :
```
42sh$ find /sys/fs/cgroup/ -name cgroup.procs -exec grep -l $$ {} \;
```
... puis en remontant tant que l'on dispose des droits d'écritures.\
Le script `telegraf_init.sh` devra retourner le chemin vers le dossier
(éventuellement) créé à partir du nom passé en paramètre, depuis la racine des
*cgroup*s.
Ce retour servira de premier argument au script `telegraf.sh`.
##### Exemple {-}
\
<div lang="en-US">
```
42sh$ ./telegraf_init.sh my_cgroup_name
/user.slice/user@1234.service/my_cgroup_name
42sh$ ./telegraf.sh "/user.slice/user@1234.service/my_cgroup_name" memhog 500
```
</div>
:::::

View File

@ -82,7 +82,7 @@ versions des `cgroup`s à chaque fois.
::::: {.question}
#### Quelles sont différences entre les deux versions des *cgroups* ? {-}
#### Quelles sont les différences entre les deux versions des *cgroups* ? {-}
La principale différence entre les deux est la fusion des différents
sous-systèmes au sein d'une même arborescence. Dans la première version, chaque
@ -135,12 +135,12 @@ version, vous allez devoir activer le ou les contrôleurs dont vous avez besoin
(tandis que dans la première version, on se rendait dans l'arborescence du
sous-système que l'on voulait).
Pour activer le contrôleur *memory* dans notre groupe `virli`, nous utilisons
la commande suivante :
Pour activer le contrôleur *memory*, nous utilisons la commande suivante à la
racine :
<div lang="en-US">
```bash
echo "+memory" > virli/cgroup.subtree_control
echo "+memory" > cgroup.subtree_control
```
</div>
@ -151,11 +151,11 @@ première version, le fait qu'elle soit active empêche l'utilisation de la v2 e
parallèle.
:::::
On peut contrôler les contrôleurs actifs en consultant le fichier
On peut voir les contrôleurs actifs en consultant le fichier
`virli/cgroup.controllers`.
Le contrôleur *freezer* est activé par défaut, il n'y a pas besoin de
l'activer.
Le contrôleur *freezer* est généralement activé par défaut, il n'y a pas besoin
de l'activer.
### Rattachement de processus
@ -276,7 +276,7 @@ mémoire.
[^memhog]: Ce programme fait partie du paquet `numactl`, mais vous trouverez une
version modifiée plus adaptée à nos tests sur
<https://nemunai.re/posts/slow-memhog>.
<https://nemunai.re/post/slow-memhog>.
:::::