docker ------- Méthode de configuration des ressources Cgroup

Préface

Par défaut, il n'y a pas de limite de ressources pour un conteneur, car il s'agit d'un processus lui-même. Lorsqu'un conteneur occupe trop de ressources, cela affectera d'autres conteneurs. Par conséquent, l'allocation raisonnable des ressources du conteneur est un problème auquel les administrateurs doivent prêter attention. .
docker passe Cgroup Pour contrôler le quota de ressources utilisé par le conteneur, y compris les trois aspects majeurs du processeur, de la mémoire et du disque, couvrant essentiellement les quotas de ressources communs et le contrôle de l'utilisation

1. Configuration des ressources Cgroup

Cgroup est l'abréviation de Control Groups. Il s'agit d'un mécanisme fourni par le noyau Linux pour limiter, enregistrer et isoler les ressources physiques (telles que le processeur, la mémoire, le disque l0, etc.) utilisées par les groupes de processus. Il est utilisé par de nombreux projets tels que LXC et docker Réaliser le contrôle des ressources de processus. Cgroup lui-même est une structure de base qui fournit des fonctions et des interfaces pour les processus de regroupement. La gestion des ressources spécifiques telles que les E / S ou le contrôle d'allocation de mémoire est réalisée par le biais de cette fonction. Ces fonctions de gestion des ressources spécifiques sont appelées sous-systèmes Cgroup., Il existe les principaux sous-systèmes suivants :

  • blkio: paramétré pour limiter le contrôle d'entrée et de sortie de chaque périphérique, tel que: disque, CD, usb, etc.
  • CPU: utilisez le planificateur pour fournir un accès au processeur pour les tâches de groupe de contrôle
  • cpuacct: générer des rapports de ressources CPU pour les tâches de groupe de contrôle
  • cpuset: s'il s'agit d'un processeur multicœur, ce sous-système allouera un processeur et une mémoire séparés pour les tâches de groupe de contrôle
  • appareils: autoriser ou refuser l'accès aux appareils par des tâches de groupe de contrôle
  • congélateur: mettre en pause et reprendre les tâches du groupe de contrôle
  • mémoire: définissez la limite de mémoire de chaque groupe de contrôle et générez un rapport sur les ressources mémoire
  • net_cls: marque chaque paquet réseau pour une utilisation pratique par cgroup
  • ns: sous-système d'espace de noms
  • perf_event: Augmentez les capacités de surveillance et de suivi de chaque groupe, qui peut surveiller tous les threads appartenant à un groupe spécifique et autoriser les threads sur un processeur spécifique

Deux, testez le processeur et la mémoire

Utilisez Dockerfile pour créer une image d'outil de contrainte basée sur les centos

mkdir /opt/stress
cd /opt/stress

vim Dockerfile
FROM centos:7
MAINTAINER HZH<397615552@qq.com>
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress

docker build -t centos:stress .

Utilisez la commande suivante pour créer un conteneur. La valeur du paramètre -cpu-share dans la commande ne garantit pas que vous pouvez obtenir 1 vcpu ou combien de GHz de ressources CPU, il s'agit uniquement d'une valeur pondérée flexible

docker run -itd --cpu-shares 100 centos:stress

说明:默认情况下,每个Docker容器的CPU份额都是1024。 单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。
Par exemple: démarrer 2 conteneurs et permettre d'afficher le pourcentage d'utilisation du processeur

docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10  #容器产生10个子函数进程
docker exec -it xxxxxxxx bash  		#进入容器使用top查看cpu使用情况

再开一个容器做比较
docker run -itd ---name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
docker exec -it xxxxxxxxx bash      #进入容器使用top对比两个容器的%CPU,比例是12

Insérez la description de l'image ici

Trois, limite de cycle du processeur

1. Docker fournit deux paramètres --cpu-period et --cpu-quota pour contrôler les cycles d'horloge du processeur que le conteneur peut allouer

  • --Cpu-period: Il est utilisé pour spécifier combien de temps l'utilisation du processeur du conteneur doit être redistribuée
  • --Cpu-quota: est utilisé pour spécifier le temps maximum qui peut être utilisé pour exécuter le conteneur dans ce cycle
  • Contrairement à –cpu-share, cette configuration est une valeur absolue spécifiée et l'utilisation des ressources CPU par le conteneur ne dépassera jamais la valeur configurée
    . L'unité de –cpu-period et –cpu-quota est de microsecondes.
  • La valeur minimale de -cpu-period est de 1000 microsecondes, la valeur maximale est de 1 seconde et la valeur par défaut est de 0,1 seconde
  • La valeur par défaut de –cpu-quota est -1, ce qui signifie qu'il n'y a pas de contrôle. Les paramètres –cpu-period et –cpu-quota sont généralement utilisés en combinaison

Par exemple: le processus de conteneur doit utiliser un seul processeur pendant 0,2 seconde toutes les 1 seconde. Vous pouvez définir la période du processeur sur 100 000 (soit 0,1 seconde) et le quota du processeur sur 200 000 (0,2 seconde). Bien entendu, dans le cas du multicœur, si autorisé Si le processus de conteneur occupe complètement deux processeurs, vous pouvez définir cpu-period sur 100000 (soit 0,1 seconde) et cpu-quota sur 200000 (0,2 seconde)

docker run -itd --cpu-period 100000 --cpu-quota 200000 centos:stress
docker exec -it xxxxxxxxxx
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us

Insérez la description de l'image ici

Quatre, contrôle CPU Core

Pour les serveurs dotés de processeurs multicœurs, Docker peut également contrôler les cœurs de processeur que le conteneur est autorisé à utiliser, c'est-à-dire utiliser le paramètre -cpuset-cpus.
Ceci est particulièrement utile pour les serveurs avec plusieurs processeurs et peut configurer les meilleures performances pour les conteneurs. qui nécessitent un calcul haute performance.

docker run -itd --name cpu1 --cpuset-cpus 2-3 centos:stress			#2-3表示创建容器只能使用第23这两个内核,
docker exec -it xxxxxxxxxxx bash
cat /sys/fs/cgroup/cpuset/cpuset.cpus

docker exec xxxxxx taskset -c -p 1
pid 1's current affinity list: 2,3

Insérez la description de l'image ici

5. Utilisation mixte des paramètres de contrôle des quotas CPU

Utilisez le paramètre cpuset-cpus pour spécifier que le conteneur A utilise le cœur de processeur 0 et que le conteneur B utilise uniquement le cœur de processeur 3.
Sur l'hôte, seuls ces deux conteneurs utilisent les cœurs de processeur correspondants. Ils occupent chacun toutes les ressources de base et cpu- Les partages n'ont pas d'effet évident
. -cpus, les paramètres cpuset-mems ne sont valides que sur les serveurs sur des nœuds multicœur et multi-mémoire et doivent correspondre à la configuration physique réelle, sinon l'objectif du contrôle des ressources ne peut pas être atteint.
Dans le cas de plusieurs cœurs de processeur dans le système, il doit être passé Le paramètre cpuset-cpus consiste à définir le cœur de processeur du conteneur pour faciliter les tests

docker run -itd --name cpu3 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1 
docker exec -it xxxxxxxxxxx bash
exit 
top #1查看每个核心的占用

docker run -itd --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1 
docker exec -it xxxxxxx bash    

Insérez la description de l'image ici

总结:上面的centos:stress镜像安装了stress工具,用来测试CPU和内存的负载,通过在两个容器上分别执行stress -c 1命令,将会给系统一个随机负载,产生1个进程,这个进程都会反复不停的计算由rand()产生随机数的平方根,直到资源耗尽,观察到宿主机上CPU使用率,第三个内核的使用率接近100%,并且一批进程的CPU使用率明显存在2:1 的使用比例的对比

Sixièmement, la limite de mémoire

Semblable au système d'exploitation, la mémoire que le conteneur peut utiliser comprend deux parties: la mémoire physique et le menu
fixe Swap contrôlent l'utilisation de la mémoire du conteneur via les deux ensembles de paramètres suivants

  • -m ou --memory: définit la limite d'utilisation de la mémoire
  • --Memory-swap: définir la limite d'utilisation de la mémoire + swap
  • --Vm 1: démarrer 1 thread de travail de la mémoire
  • –Vm-bytes 280M: chaque thread alloue 280M de mémoire, la valeur ici doit être inférieure à –memory-swap, sinon une erreur sera signalée
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M			#工作线程分配的内存超过300M或者等于300M,分配的内存超过限额,stress线程会报错,容器退出

Insérez la description de l'image ici
–Vm-bytes est égal à –memory-swap value, le résultat est une erreur
Insérez la description de l'image ici

Sept limitations d'E / S de bloc

Par défaut, tous les conteneurs peuvent lire et écrire sur le disque de la même manière. Vous pouvez modifier la priorité d'E / S du bloc de conteneur via le paramètre
–blkio-weight . –Blkio-weight est similaire à –cpu-partages. Le poids relatif est défini. La valeur par défaut est 500.
Par exemple: la bande passante du conteneur A pour lire et écrire sur le disque est le double de celle du conteneur B

docker run -it --name container_A --blkio-weight 600 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weight

docker run -it --name container_B --blkio-weight 300 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weight

Insérez la description de l'image ici

8. Limitations des bps et des iops

bps est octet par seconde: la quantité de données lues et écrites par seconde
iops est de io par seconde: le nombre d'E / S par seconde.
Les bps et iops du conteneur peuvent être contrôlés par les paramètres suivants

–Device-read-bps: limite de lecture de bps d'un certain périphérique
-device-write-bps: limite d'écriture de bps d'un certain périphérique
-device-read-iops: limite de lecture d'iops d'un certain périphérique
-device-write- iops: limit Ecrire les iops d'un certain périphérique

L'exemple suivant consiste à limiter la vitesse à laquelle le conteneur écrit / dev / sda à 5 Mo / s

docker run -it --device-write-bps /dev/sda:5MB centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct			#可以按ctrl+c中断查看

docker run -it centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_51432789/article/details/115323438
conseillé
Classement