cgroup資源配置
- 容器資源配置
- 1、CPU利用率控制
- 2、記憶體限額
- 總結
cgroup是Control Groups的縮寫,是Linux內核提供的一直可以限制、記錄、隔離行程組所使用的物理資源,dokcer通過cgroup來控制容器使用的資源配額,包括CPU、記憶體、磁盤三大方面
容器資源配置
- 構建容器時指定資源限制引數
--build-arg=[] :
設定鏡像創建時的變數;
--cpu-shares :
設定cpu使用權重;
--cpu-period :
限制CPU CFS周期;
--cpu-quota :
限制cPU CFS配額;
--cpuset-cpus :
指定使用的CPU id;
--cpuset-mems :
指定使用的記憶體id;
--disable-content-trust :忽略校驗,默認開啟;-f :
指定要使用的Dockerfile路徑;
--force-rm :
設定鏡像程序中冊洗掉中間容器;
--isolation :
使用容器隔離技術;
--label=[ ] :
設定鏡像使用的元資料;
-m :
設定記憶體最大值;
--memory-swap :
設定Swap的最大值為記憶體+swap, "-1"表示個/限swap;
--no-cache :
創建鏡像的程序不使用快取;
--pull :
嘗試去更新鏡像的新版本;
--quiet, -q :
安靜模式,成功后只輸出鏡像工D;
--rm :
設定鏡像成功后洗掉中間容器;
--shm-size :
設定/dev/ shm的大小,默認值是64M;
--ulimit :
Ulimit配置,
--squash :
將Dockerfile中所有的操作壓縮為一層,
--tag, -t:
鏡像的名字及標簽,通常name: tag或者name
格式;可以在一次構建中為一個鏡像設定多個標簽,
--network :
默認default,在構建期間設定RUN指令的網路模式
1、CPU利用率控制
- CPU周期:ls為一個周期的定律,引數值一般為100000(秒)
- 用stress壓力測驗工具測驗CPU和記憶體使用情況
[root@docker ~]# mkdir /opt/stress
[root@docker ~]# cd /opt/stress/
[root@docker stress]# vim Dockerfile
FROM centos:7
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
[root@docker stress]# docker build -t centos:stress .
##容器產生10個子函式行程,做cpu權重限制
[root@docker stress]# docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
592e3c1839d101d8c06530dbb854b3e080081d6bc8aaf275e7015f7673ffa28c
[root@docker stress]#
##另開一個終端,在創建一個容器進行對比
[root@docker ~]# docker run -itd --name cpu1023 --cpu-shares 1024 centos:stress stress -c 10
783b4cfb91a1e5489155438a5493ccd027db142f6d8fecc92c53c6e57a7896c0
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
783b4cfb91a1 centos:stress "stress -c 10" 19 seconds ago Up 18 seconds cpu1023
592e3c1839d1 centos:stress "stress -c 10" 23 minutes ago Up 22 minutes cpu512
[root@docker stress]# docke stats #查看當前宿主機所有容器CPU和記憶體等資訊

Docker提供了--cpu-period、--cpu-quota兩個引數控制容器分配到的CPU時鐘周期,單位為微秒
--cpu-period是用來指定容器對CPU的使用要在多長時間內做一次重新分配
--cpu-quota是用來指定在這個周期內,最多可以用多少時間來跑這個容器
[root@docker ~]# docker rm -f `docker ps -aq` ##清空上面開啟的容器,這種方法在實際生產中慎用
783b4cfb91a1
592e3c1839d1
##設定--cpu-period為0.1秒,--cpu-quota為0.2秒
[root@docker ~]# docker run -itd --name cpu01 --cpu-period 100000 --cpu-quota 200000 centos:stress
de934a7f89c1edee959b68fcaf3b1a1409ab94ea6c7ea1ac61b495e85daaa868
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de934a7f89c1 centos:stress "/bin/bash" 6 seconds ago Up 6 seconds cpu01
[root@docker ~]# docker exec -it de934a7f89c1 /bin/bash ##進入容器查看配置結果
[root@de934a7f89c1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
[root@de934a7f89c1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000
[root@docker ~]# top ##top完按數值1可查看所有的cpu
top - 18:10:37 up 22:23, 4 users, load average: 0.00, 1.07, 7.82
Tasks: 230 total, 2 running, 228 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
##指定容器只能用0、1兩個內核,
[root@docker ~]# docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress
5e591e5acbe74af4743c6f831b0bd0e89073876d85661660e555bf3886714221
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e591e5acbe7 centos:stress "/bin/bash" 5 seconds ago Up 4 seconds cpu1
de934a7f89c1 centos:stress "/bin/bash" 14 minutes ago Up 14 minutes cpu01
[root@docker ~]# docker exec -it 5e591e5acbe7 bash
[root@5e591e5acbe7 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1
##創建兩個容器,分別指定不同的內核,和cpu權限,對比查看
[root@docker ~]# docker run -itd --name cpu2 --cpu-shares 512 --cpuset-cpus 1 centos:stress stress -c 1
7f00b49b1d87757c8f2215bbc6648ea85b4cd7db94d6d6cb5f5e07806746469a
[root@docker ~]# docker run -itd --name cpu3 --cpu-shares 1023 --cpuset-cpus 3 centos:stress stress -c 1
587682893c4b6a104f80fdb5f32815635c3c05df2c38d4e5ac1bd23849b00ac7
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
587682893c4b centos:stress "stress -c 1" 6 seconds ago Up 5 seconds cpu3
[root@docker ~]# docker stats ##查看容器cpu使用,不同容器使用不同cpu,其設定的權重無意義
7f00b49b1d87 centos:stress "stress -c 1" 5 minutes ago Up 5 minutes cpu2
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
587682893c4b cpu3 99.87% 120KiB / 5.651GiB 0.00% 737B / 0B 0B / 0B 2
7f00b49b1d87 cpu2 100.12% 120KiB / 5.651GiB 0.00% 737B / 0B 0B / 0B 2
2、記憶體限額
docker -m或者--memory 設定記憶體使用限額
docker --memeory-swap 設定swap使用限額
[root@docker ~]# docker run -itd -m 200M --memory-swap=300M centos:stress
[root@docker ~]# docker stats ##查看設定結果
c99558b808e9029d53cc439c79ce9846e8e64e345926e9d5104d1da2a7e94cc5
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c99558b808e9 stoic_bhabha 0.00% 396KiB / 200MiB 0.19% 656B / 0B 0B / 0B 1
- Block IO
--blkio-weight 引數可以改變容器block IO的優先級,默認為500
[root@docker ~]# docker run -it --name container_a --blkio-weight 600 centos:stress
[root@9bea566d8268 /]# cat /sys/fs/cgroup/blkio/blkio.weight ##查看修改
600
##bps和iops限制
bps:byte per second :每秒讀寫的資料量
iops:io per second :每秒IO的次數
--device-read-bps #限制讀某個設備的bps
--device-write-bps #限制寫莫格設備的bps
--device-read-iops #限制讀某個設備的iops
--device-write-iops #限制寫某個設備的iops
[root@docker ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress
[root@12b9a7dc32be /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
^C27+0 records in ##ctrl+c中斷查看
27+0 records out
28311552 bytes (28 MB) copied, 5.40251 s, 5.2 MB/s
[root@12b9a7dc32be /]# exit
[root@docker ~]# docker run -it centos:stress ##不做限制查看速度
[root@79486127aa12 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
^C622+0 records in
622+0 records out
652214272 bytes (652 MB) copied, 0.47992 s, 1.4 GB/s
總結
- 資源限制主要型別:CPU、磁盤、記憶體、IO
- 資源限制方式:構建鏡像時指定鏡像資源限制,構建容器時指定容器的資源限制,容器啟動后在宿主機對應容器目錄下修改資源限制
- 資源限制查詢:docker inspect 鏡像ID/容器ID,或者直接查看宿主機對應容器ID資源限制檔案(/sys/fs/cgroup/*)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299778.html
標籤:其他
