Limiter ressources daemon docker via daemon.json

Résolu
pcsystemd Messages postés 734 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Dans l'optique de limiter les ressources du daemon docker, j'ai testé plusieurs façons de faire.

- Premier façon de faire qui fonctionne pour moi
1- Créer un fichier "fichier.slice" avec les données suivantes

[Unit]
Description=Throttle CPU usage to 70% and memory usage to 8GB for docker-spawned processes
Before=slices.target

[Slice]
CPUQuota=50%
MemoryAccounting=true
MemoryMax=20G


2- Declarer le nouveau fichier .slice dans le bloc [Service] du fichier docker.service

Slice=monfichier.slice


3- Reload daemon et restart docker

- Seconde façon de faire qui ne fonctionne pas pour moi
1- Créer un fichier "fichier.slice" avec les données suivantes

[Unit]
Description=Throttle CPU usage to 70% and memory usage to 8GB for docker-spawned processes
Before=slices.target

[Slice]
CPUQuota=50%
MemoryAccounting=true
MemoryMax=20G


2- Creation du fichier "daemon.json" avec les données suivantes

{
"exec-opts": ["native.cgroupdriver=systemd"],
"cgroup-parent": "/monfichier.slice"
}


3- Reload daemon et restart docker

La question
Avez vous une idée pourquoi en passant par le daemon.json cela ne fonctionne pas?

Les logs n'indique rien et la commande
pcsystemctl status docker
indique failed mais rien d'autre.

Merci

--
L'accès au savoir est la première liberté que chaque homme devrait avoir.

10 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Je ne connais pas bien
    docker
    , mais voici ce que je vérifierais en premier lieu :
    • Es-tu sûr que ton fichier
      daemon.json
      est lu ? D'après la documentation,
      docker
      va lire par défaut
      /etc/docker/daemon.json
      ou utiliser le chemin passé en paramètre via l'option
      --config-file string 
      .
    • Arrives-tu as exploiter le fichier
      monfichier.slice
      via l'option
      --cgroup-parent
      ? (voir dans la documentation la section "Default cgroup parent"). En particulier, est-ce que
      monfichier.slice
      est placé un dossier inspecté par docker (est-ce que la valeur associée à
      cgroup-parent
      est cohérente) ?


    Bonne chance
    1
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Est-ce qu'au niveaux des logs dockers il y a des erreurs qui permettraient d'y voir plus clair ?
    1
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Unable to configure the Docker daemon with file
    /etc/docker/daemon.json
    : invalid character '#' looking for beginning of value

    Effectivement, il n'y a pas de manière d'écrire des commentaires dans un fichier
    json
    . Mais, comme tu le soulignes, cette erreur confirme que le fichier
    /etc/docker/daemon.json
    est bien lu.

    Bon par contre ce qui est curieux c'est que malgré cela mon
    cgroup-parent "cgroup-parent": "limit-docker-resource.slice"
    qui est présent dans mon fichier
    daemon.log
    semble ne pas être pis en compte comme on peut le voir avec un
    systemctl status docker
    !

    Tu veux dire dans
    /etc/docker/daemon.json
    ?

    En tout cas, difficile à dire pour moi vue que la capture d'écran est tronquée. De manière générale, évite les captures d'écran sur un forum, un bon vieux copier coller sera plus pratique pour tout le monde et plus écologique.

    Retour à ton problème : il faut regarder dans tes logs voir si quelque chose explique pourquoi ta directive n'est pas prise en compte. Si les logs de docker sont bien faits, ils devraient t'indiquer les fichiers lus, les instructions appliquées avec succès, et les éventuelles erreurs. C'est à partir de ces informations qu'on comprendra mieux ce qui cloche, soit par nous-même, soit en cherchant les messages d'erreur sur Internet...

    Par contre si je renseigne la ligne
    Slice=limit-docker-resource.slice
    dans mon
    /etc/systemd/system/docker.service
    et que je redémarre les services c'est pris en compte!

    Ce qui est sûr c'est qu'il faut redémarrer (ou recharger) les services adéquats pour qu'un changement de configuration soit pris en compte. Est-ce bien le cas ?

    Pardonne ma méconnaissance de
    docker
    mais es-tu sûr qu'un
    cgroup
    peut être un slice, ou s'agit-il de deux notions différentes ?

    Bonne chance
    1
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    En effet, je viens de tomber sur cette discussion qui semble correspondre exactement à ton problème. As-tu essayer de suivre en particulier cette réponse ?

    Bonne chance
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pcsystemd Messages postés 734 Statut Membre 23
     
    Enfin c'est résolu!

    Merci.

    J'ai supprimé
     Slice=limit-docker-resource.slice
    dans mon
    /etc/systemd/system/docker.service
    et fait un
     pcsystemctl start limit-docker-resource.slice
    et c'etait good

    D'ailleurs cette commande
    systemd-cgtop
    l'indique

    Control Group                          Tasks   %CPU   Memory  Input/s Output/s
    /limit-docker-resource.slice 902 61.3 9.2G - -
    /limit-docker-resource.slice/689eb9a 36 5.7 361.6M - -
    /limit-docker-resource.slice/a51e874 36 5.6 361.7M - -


    ATTENTION
    Pour info si d'autres personnes ont besoin, le paramètre
    MemoryLimit=
    indiqué dans cette réponse ( https://unix.stackexchange.com/questions/537645/how-to-limit-docker-total-resources/550954#550954) est obsolète et remplacé par
    MemoryMax=
    . Consulter le MAN de "systemd.resource-control"

    L'accès au savoir est la première liberté que chaque homme devrait avoir.
    1
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      Merci pour ton retour !
      0
  7. pcsystemd Messages postés 734 Statut Membre 23
     
    Merci.

    Alors oui mon fichier
    daemon.json
    est bien lu car si je l'active justement il plante de daemon docker. Et il est bien dans
    /etc/docker
    .

    Par contre effectivement, tu m'as mis la puce a l'oreille concernant le path du fichier
    monfichier.slice
    pour que docker l'exploite! Je vais vérifier cela.
    0
  8. pcsystemd Messages postés 734 Statut Membre 23
     
    Bin après vérification je comprends toujours pas!

    Voici le contenu de mon fichier daemon.json qui est dans /etc/docker

    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "cgroup-parent": "limit-docker-resource.slice"
    }


    et voici le contenu du fichier
    limit-docker-resource.slice
    qui se trouve dans /etc/systemd/system

    [Unit]
    Description=Throttle CPU usage to 70% and memory usage to 8GB for docker-spawned processes
    Before=slices.target

    [Slice]
    CPUQuota=50%
    MemoryAccounting=true
    MemoryMax=20G


    Le cgroup
    /sys/fs/cgroup/memory/limit.slice/limit-docker.slice/limit-docker-resource.slice/

    0
  9. pcsystemd Messages postés 734 Statut Membre 23
     
    Merci car en fait je ne regardais pas le bon log et du coup en testant ce matin j'ai trouvé ou était l"erreur et pourquoi le daemon docker plantait. Cela venait du commentaire présent dans
    daemon.log
    . Cela confirme également que docker lit bien le fichier.

    unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '#' looking for beginning of value


    Bon par contre ce qui est curieux c'est que malgré cela mon cgroup-parent
    "cgroup-parent": "limit-docker-resource.slice"
    qui est présent dans mon fichier
    daemon.log
    semble ne pas être pis en compte comme on peut le voir avec un
    systemctl status docker
    !



    Par contre si je renseigne la ligne
    Slice=limit-docker-resource.slice
    dans mon /etc/systemd/system/docker.service et que je redémarre les services c'est pris en compte!



    0
  10. pcsystemd Messages postés 734 Statut Membre 23
     
    Pardonne ma méconnaissance de docker mais es-tu sûr qu'un cgroup peut être un slice, ou s'agit-il de deux notions différentes ?

    Au vu de la doc https://docs.docker.com/engine/reference/commandline/dockerd/ je dirais oui.
    0
  11. pcsystemd Messages postés 734 Statut Membre 23
     
    Oui oui j'ai essayé cette solution il y a quelques jours mais cela ne m'a pas apporté plus!
    Merci

    0