Comment limiter l'utilisation du processeur et de la RAM d'un processus avec les cgroups sous Ubuntu

Sous Ubuntu, la méthode la plus sûre pour limiter la charge de travail avec les cgroups consiste à laisser systemd créer et gérer son groupe de contrôle. Utilisez cette systemd-runméthode pour une commande que vous lancez, ou configurez un service systemd lorsque la limite doit persister après un redémarrage. Définissez CPUQuota=une limite stricte de temps CPU et choisissez entre MemoryHigh=une limite de pression et MemoryMax=une limite de mémoire. Ces limites s'appliquent à l'unité et à ses processus enfants.

Un cgroup (groupe de contrôle) est un mécanisme du noyau Linux qui organise les processus afin que le système puisse comptabiliser et contrôler leur utilisation des ressources. Sous Ubuntu, systemd place déjà les services dans des cgroups ; la plupart des utilisateurs n'ont donc pas besoin de créer manuellement de répertoires /sys/fs/cgroup. Les exemples ci-dessous utilisent l'interface de contrôle des ressources de systemd et doivent être vérifiés avec la version de systemd installée sur votre distribution Ubuntu.

Une maquette de terminal de type Ubuntu vérifiant la version de systemd et le type de montage cgroup2fs avant de définir les limites de ressources.
Maquette de terminal illustrative pour la vérification de systemd et du montage cgroup v2. La version et la sortie affichées sont des exemples et non un résultat de test.

Choisissez la commande qui correspond au problème

MéthodeCe qu'il contrôleMeilleure adaptationCompromis principal
systemd-runportée transitoireLimites de quota de processeur et de mémoire pour une commande nouvellement lancée et ses descendantsUne tâche de compilation, de script, d'importation ou de traitement par lots ponctuelSon périmètre est temporaire et prend fin avec la charge de travail ; il ne s'attache pas à un processus arbitraire déjà en cours d'exécution.
paramètres du service systemdRessources pour le cgroup du service, y compris les processus enfantsUn démon ou une application qui doit conserver les mêmes limites après un redémarrageNécessite une configuration du service et généralement un redémarrage pour appliquer les nouveaux paramètres.
Fichiers cgroup v2 directsLes contrôleurs au niveau du noyau tels que cpu.maxetmemory.maxEnvironnements d'exécution de conteneurs, gestionnaires de cgroups délégués ou administration spécialiséePlus manuel ; systemd gère une grande partie de la hiérarchie d'Ubuntu, et l'écriture dans son arborescence gérée peut entrer en conflit avec systemd ou échouer en raison de problèmes de permissions et de délégation.
niceouCPUWeight=Priorité relative du processeur lorsque les groupes sont en compétitionMaintenir une priorité plus basse pour les tâches en arrière-plan tout en leur permettant d'utiliser le processeur inactif.Il ne s'agit pas d'une limite stricte pour le processeur et elle ne limite pas la mémoire.

Pour la plupart des machines Ubuntu interactives, une portée transitoire est l'option la plus rapide et réversible. Pour un service en production, utilisez l'unité de service afin que la politique soit documentée et restaurée au démarrage. N'utilisez les fichiers cgroup directement que si vous gérez délibérément une hiérarchie déléguée ou si vous créez un flux de travail conteneur/d'exécution.

Vérifiez le système Ubuntu avant de définir des limites

Vérifiez d'abord que systemd est disponible et si le système de fichiers cgroup est unified v2 :

systemctl --version
stat -fc %T /sys/fs/cgroup

Le résultat de cgroup2fsla seconde commande indique le système de fichiers cgroup v2 unifié. Les versions d'Ubuntu et les systèmes personnalisés peuvent différer ; ne présumez donc pas que chaque machine possède la même hiérarchie ou les mêmes fonctionnalités systemd. Vous pouvez également vérifier la version actuelle de systemd avec la première commande. Si le montage cgroup n'est pas en v2, certaines propriétés des ressources ou le comportement du contrôleur peuvent différer ; consultez la page de manuel d'Ubuntu correspondant à la version installée avant de copier une configuration.

Choisissez les valeurs après avoir mesuré la charge de travail. Prévoyez une marge pour le reste du système et n'oubliez pas que les limites définies pour un service utilisateur sont également soumises aux limites de son cgroup parent. Un cgroup enfant ne peut pas recevoir plus de ressources que son ancêtre ne le permet.

Limitez une commande que vous êtes sur le point de démarrer

Pour une commande de votre propre session utilisateur, lancez-la dans une portée transitoire avec systemd-run --user --scope. Par exemple :

Une maquette de terminal de type Ubuntu lançant un processus Python avec un quota de CPU de 50 % et des seuils de mémoire de 700 Mo et 900 Mo.
Maquette illustrative d'un terminal exécutant une commande systemd-run ponctuelle avec un quota de processeur, un seuil de pression de mémoire et une limite de mémoire maximale.
systemd-run --user --scope --unit=worker-capped \
  -p CPUQuota=50% \
  -p MemoryHigh=700M \
  -p MemoryMax=900M \
  -- python3 /opt/worker.py

Remplacez la commande Python par le programme que vous souhaitez exécuter. Cet exemple attribue au cgroup une bande passante CPU maximale équivalente à la moitié d'un cœur de processeur, active la gestion de la pression mémoire autour de 700 Mio et fixe une limite de mémoire maximale de 900 Mio. Les valeurs de mémoire sont exprimées en unités de base 1024 de systemd. Un quota 100%représente le temps d'exécution d'un cœur de processeur ; 200%il peut utiliser jusqu'à deux cœurs si disponible. Il ne s'agit pas d'un pourcentage du nombre total de cœurs de l'ordinateur.

La commande s'exécute au premier plan car il s'agit d'une unité temporaire. À sa fermeture, l'unité temporaire disparaît. Ne la supprimez --userque si vous prévoyez d'utiliser le gestionnaire système et que vous disposez des privilèges requis ; pour une unité temporaire système, exécutez la commande avec sudoles options appropriées. Les paramètres de ressources peuvent être refusés si le gestionnaire ou le contrôleur cgroup ne les prend pas en charge.

Définir des limites pour un service systemd persistant

Pour un service tel que worker.service, créez un module complémentaire au lieu de modifier le fichier d'unité du fournisseur. Exécutez sudo systemctl edit worker.serviceet ajoutez :

Une maquette de configuration de service systemd contenant les paramètres CPUQuota, MemoryHigh et MemoryMax
Exemple de configuration d'un service systemd avec contrôle persistant du processeur et de la mémoire. Utilisez le nom et les valeurs réels du service, adaptés à votre charge de travail.
[Service]
CPUQuota=50%
MemoryHigh=700M
MemoryMax=900M

Enregistrez le fichier de configuration, puis rechargez les définitions d'unités de systemd et redémarrez le service afin que le processus démarre selon la politique révisée :

sudo systemctl daemon-reload
sudo systemctl restart worker.service

Utilisez une limite de mémoire prudente. Si le service ne parvient pas à récupérer suffisamment de mémoire en dessous d'un certain seuil MemoryMax, le noyau peut déclencher le processus de gestion de la mémoire insuffisante au sein du cgroup. Cela peut interrompre un ou plusieurs processus du groupe de services et provoquer des interruptions. Il est souvent plus sûr de définir MemoryHighune limite de mémoire où la récupération et la limitation de débit sont acceptables, puis de la fixer MemoryMaxà un niveau supérieur comme limite finale. Effectuez des tests avec des pics de charge réalistes avant d'appliquer des limites strictes.

Vérifiez l'appareil et observez son comportement.

Pour l'oscilloscope transitoire, vérifiez son état en utilisant le nom d'unité que vous avez fourni :

Une maquette de terminal affichant l'état de systemctl et la surveillance par systemd-cgtop d'une charge de travail transitoire
Affichage illustratif de l'état et du moniteur cgroup. Les valeurs de CPU et de mémoire présentées ici ne proviennent pas d'une exécution réelle.
systemctl --user status worker-capped.scope
systemd-cgtop

Pour un service système, omettez l'option correspondante --userdans la commande d'état. La vue d'état confirme l'existence et l'activité de l'unité ; systemd-cgtopelle affiche l'utilisation des ressources en temps réel par groupe de contrôle. Pour examiner les propriétés configurées, interrogez directement l'unité, par exemple :

systemctl --user show worker-capped.scope \
  -p CPUQuotaPerSecUSec -p MemoryHigh -p MemoryMax

La mémoire affichée pour un cgroup ne correspond pas nécessairement à la mémoire résidente d'un processus : elle prend en compte la mémoire allouée au groupe et peut inclure les processus descendants de la charge de travail. Il convient d'interpréter la surveillance comme un indicateur du comportement de cette charge de travail dans le temps, et non comme une valeur unique à optimiser aveuglément.

Que se passe-t-il si le processus est déjà en cours d'exécution ?

systemd-runCette commande lance une nouvelle unité ; elle ne déplace pas un PID existant arbitraire dans cette unité. Si le processus appartient à un service systemd, appliquez les paramètres à ce service via une commande spécifique ou, pour une modification temporaire, utilisez la commande appropriée sudo systemctl set-property --runtime worker.service CPUQuota=50% MemoryHigh=700M MemoryMax=900M. Cette --runtimedernière est temporaire et ne remplace pas la configuration permanente d'un service.

Si le processus est un programme régulier de votre session de bureau, la méthode la plus simple et la plus sûre consiste généralement à l'arrêter et à le relancer systemd-run. Appliquer une propriété à une zone plus large, comme votre espace utilisateur complet, peut affecter de nombreuses applications sans lien entre elles. Déplacer un processus en écrivant son PID dans un fichier cgroup nécessite de contrôler la hiérarchie déléguée correspondante et de respecter les règles de placement des processus cgroup v2 ; n'écrivez pas dans les répertoires gérés par systemd sans précaution.

Comment choisir une politique de processeur et de mémoire

  • Besoin d'une limite de processeur stricte ? Choisissez l'option correspondante CPUQuota=. Des valeurs plus basses réduisent la consommation maximale du processeur, mais peuvent ralentir l'exécution et augmenter le temps d'attente.
  • Besoin d'une priorité plus basse ? Privilégiez CPUWeight=plutôt qu'un quota. Le poids répartit la charge du processeur de manière proportionnelle à la charge ; il ne réserve pas un pourcentage fixe et n'empêche pas l'utilisation du processeur inactif.
  • Besoin de pression sur la mémoire sans arrêt brutal immédiat ? Définissez MemoryHigh=-la comme seuil de pression principal et observez la latence et le comportement de récupération.
  • Besoin d'une limite de confinement finale ? Prévoyez MemoryMax=une marge suffisante pour les pics normaux. Soyez prêt à gérer les situations de mémoire insuffisante (OOM) lorsque la limite ne peut être respectée.
  • Vous utilisez déjà un conteneur ? Privilégiez les options de configuration du processeur et de la mémoire prises en charge par le gestionnaire de conteneurs, qui configurent les cgroups pour ce conteneur et s’adaptent à son cycle de vie.

Il n'existe pas de limite idéale unique pour toutes les charges de travail. Un traitement par lots sur un ordinateur de bureau peut tolérer un quota faible et une limite de mémoire modérée ; un service sensible à la latence peut nécessiter une plus grande marge de manœuvre du processeur et une limite plus élevée MemoryHighpour éviter les pauses liées à la récupération de mémoire. Commencez par des valeurs prudentes, surveillez l'unité pendant un pic représentatif et ajustez un paramètre à la fois.

Références

Laisser un commentaire

Téléchargez FlightGear gratuitement : Guide d’installation officiel

Téléchargez FlightGear gratuitement : Guide d’installation officiel

Téléchargez gratuitement FlightGear depuis le site officiel. Comparez les versions pour Windows, macOS et Linux, installez les fichiers de données et effectuez votre premier vol.

Application Google Tasks pour ordinateur : comment l’utiliser sur un ordinateur

Application Google Tasks pour ordinateur : comment l’utiliser sur un ordinateur

Ouvrez Google Tasks dans un navigateur, ajoutez un raccourci Chrome ou lancez-le comme une application, et gérez vos tâches datées via Agenda et Gmail.

OKSampler : un échantillonneur musical gratuit et simple pour les rythmes au clavier

OKSampler : un échantillonneur musical gratuit et simple pour les rythmes au clavier

OKSampler permet d'associer des clips MP3 à des touches du clavier et de lire des fichiers audio en boucle. Découvrez les fonctionnalités de cette ancienne version gratuite, ses limitations et les points à vérifier avant de la télécharger.

Comment créer une clé USB bootable Windows 11 sous Linux

Comment créer une clé USB bootable Windows 11 sous Linux

Créez une clé USB d'installation Windows 11 sous Linux avec Ventoy : téléchargez l'ISO officiel, installez Ventoy en toute sécurité, copiez l'image et démarrez le PC cible.

Comment jouer à Don't Starve Together sous Linux

Comment jouer à Don't Starve Together sous Linux

Installez la version Linux de Don't Starve Together via Steam, créez un monde ou rejoignez vos amis grâce à ces étapes d'installation et de dépannage.

Comment jouer à Squad sur Linux avec Steam Proton

Comment jouer à Squad sur Linux avec Steam Proton

Configurez Squad sur Linux avec Steam Play et Proton, installez le jeu, choisissez un outil de compatibilité et résolvez les problèmes liés à l'anti-triche.

Comment installer Linux Mint Debian Edition 5 « Elsie » depuis une clé USB

Comment installer Linux Mint Debian Edition 5 « Elsie » depuis une clé USB

Téléchargez et vérifiez l'image ISO archivée de LMDE 5, créez une clé USB bootable et choisissez l'option d'installation sécurisée. Elsie n'est plus prise en charge ; consultez la version actuelle de LMDE.

Comment installer Wireshark sous Linux : Ubuntu, Fedora, Arch et autres distributions

Comment installer Wireshark sous Linux : Ubuntu, Fedora, Arch et autres distributions

Installez Wireshark sur Ubuntu, Debian, Fedora, Arch ou openSUSE avec les commandes de paquets actuelles, puis configurez la capture de paquets en direct en toute sécurité.

Comment jouer à DiRT Rally sur Linux : configuration de Steam et correctifs Proton

Comment jouer à DiRT Rally sur Linux : configuration de Steam et correctifs Proton

Découvrez comment jouer à DiRT Rally sur Linux si vous le possédez déjà sur Steam : installez la version native, lancez-la et n’utilisez Proton qu’en dernier recours.

Comment jouer à It Takes Two sur Linux avec Steam Proton

Comment jouer à It Takes Two sur Linux avec Steam Proton

Apprenez à jouer à It Takes Two sur Linux avec Steam Proton, à installer la version Steam, à activer la compatibilité, à configurer le mode coopératif et à résoudre les problèmes de lancement.