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 ### Permettre à l'utilisateur de monitorer des processus
Maintenant, séparons notre script en deux parties afin qu'un utilisateur normal 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 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, bons droits (`chown $EUID`), tandis que le deuxième va effectuer le monitoring,
sans privilèges particuliers. sans privilèges particuliers.
#### Exemple {-} ##### Exemple {-}
\
<div lang="en-US"> <div lang="en-US">
``` ```
42sh$ sudo ./telegraf_init.sh my_cgroup_name 42sh$ sudo ./telegraf_init.sh my_cgroup_name
@ -97,4 +100,79 @@ sans privilèges particuliers.
``` ```
</div> </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} ::::: {.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 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 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 (tandis que dans la première version, on se rendait dans l'arborescence du
sous-système que l'on voulait). sous-système que l'on voulait).
Pour activer le contrôleur *memory* dans notre groupe `virli`, nous utilisons Pour activer le contrôleur *memory*, nous utilisons la commande suivante à la
la commande suivante : racine :
<div lang="en-US"> <div lang="en-US">
```bash ```bash
echo "+memory" > virli/cgroup.subtree_control echo "+memory" > cgroup.subtree_control
``` ```
</div> </div>
@ -151,11 +151,11 @@ première version, le fait qu'elle soit active empêche l'utilisation de la v2 e
parallèle. 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`. `virli/cgroup.controllers`.
Le contrôleur *freezer* est activé par défaut, il n'y a pas besoin de Le contrôleur *freezer* est généralement activé par défaut, il n'y a pas besoin
l'activer. de l'activer.
### Rattachement de processus ### Rattachement de processus
@ -276,7 +276,7 @@ mémoire.
[^memhog]: Ce programme fait partie du paquet `numactl`, mais vous trouverez une [^memhog]: Ce programme fait partie du paquet `numactl`, mais vous trouverez une
version modifiée plus adaptée à nos tests sur version modifiée plus adaptée à nos tests sur
<https://nemunai.re/posts/slow-memhog>. <https://nemunai.re/post/slow-memhog>.
::::: :::::