目录

一.Cgroup资源配置

二.cpu使用率控制

三.使用stress工具测试CPU和内存

1.模拟单个容器

2.模拟cpu不同加权值

四.cpu周期限制

1.设置资源限制参数

2.查询资源限制参数

五.cpu Core控制

六.cpu配额控制参数的混合使用

七.内存限额

​八. Block IO的限制


一.Cgroup资源配置

cgroups隔离=====容器隔离

docker使用cgroup控制资源

Docker通过cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。

Cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如CPU、内存、磁盘 IO等等)的机制

cgroup是一种资源控制手段,也是容器隔离的6个名称空间的一种实现手段

每个容器相当于一个进程

进程相当于资源

二.cpu使用率控制

cpu周期:1s为一个周期的定律,参数值一般为100000 (CPU衡量单位是秒)

假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s

cpu在一个时刻,只能给一个进程占用

CPU——虚拟化

cgroup限制和记录

cadvisor收集记录

docker stats展示记录

三.使用stress工具测试CPU和内存

使用Dockerfile来创建一个基于Centos的stress工具镜像。

[root@docker ~]# mkdir /opt/stress
[root@docker ~]# cd /opt/stress/
[root@docker /opt/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 /opt/stress]# docker build -t centos:stress .

1.模拟单个容器

使用如下命令创建容器,命令中的--cpu-shares参数值不能保证可以获得1个vcpu或者多少GHz的 CPU资源,它仅是一个弹性的加权值。

与--cpu-shares 不同的是,这种配置是指定一个绝对值,容器对CPU资源的使用绝对不会超过配置的值。——权重,随机值。

[root@localhost stress]# docker run -itd --name stress_v1 --cpu-shares 100 centos:stress

 [root@docker /opt/stress]# docker stats

默认情况下,每个Docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的CPU加权的效果才能体现出来。

2.模拟cpu不同加权值

[root@docker /opt/stress]# docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
[root@docker /opt/stress]# docker run -itd --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
[root@docker /opt/stress]# docker run -itd --name cpu256 --cpu-shares 256 centos:stress stress -c 10
[root@docker /opt/stress]# docker stats 
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
ff11323b5e76   cpu512    115.68%   340KiB / 1.781GiB   0.02%     648B / 0B   0B / 0B     11
8d71db9445c4   cpu1024   227.70%   336KiB / 1.781GiB   0.02%     648B / 0B   0B / 0B     11
19b77ab7835d   cpu256    55.47%    336KiB / 1.781GiB   0.02%     648B / 0B   0B / 0B     11

四.cpu周期限制

Docker提供了--cpu-period、--cpu-quota两个参数控制容器可以分配到的CPU时钟周期。

--cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配。

--cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。——单位时间内

cpu-period和cpu-quota 的单位为微秒(us) 。 cpu-period的最小值为10000微秒,最大值为1秒(10^6 us),默认值为0.1秒(100000us).cpu-quota的值默认为-1,表示不做控制。cpu-period和cpu-quota 参数一般联合使用。

1.设置资源限制参数

#设置cpu-quota和cpu-period资源限制参数
#法一
[root@docker ~]# docker run -itd --cpu-period 100000 --cpu-quota 20000 centos:stress 
[root@docker /sys/fs/cgroup/cpu/docker/36ac73fd1579478a29112d982291ba0362f4b3c684caee528838f37769616bd8]# cat cpu.cfs_quota_us 
[root@docker /sys/fs/cgroup/cpu/docker/36ac73fd1579478a29112d982291ba0362f4b3c684caee528838f37769616bd8]# cat cpu.cfs_period_us 
#法二
可以直接修改cpu.cfs_period_us和cpu.cfs_quota_us这两个文件内容,但是必须先将容器关掉

2.查询资源限制参数

#宿主机上查询
[root@docker /sys/fs/cgroup/cpu/docker/36ac73fd1579478a29112d982291ba0362f4b3c684caee528838f37769616bd8]# cat cpu.cfs_quota_us 
[root@docker /sys/fs/cgroup/cpu/docker/36ac73fd1579478a29112d982291ba0362f4b3c684caee528838f37769616bd8]# cat cpu.cfs_period_us 
#进入容器内查询
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS     NAMES
36ac73fd1579   centos:stress   "/bin/bash"   9 minutes ago   Up 9 minutes             vigilant_borg
[root@docker ~]# docker exec -it 36ac73fd1579 /bin/bash
[root@36ac73fd1579 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us 
100000
[root@36ac73fd1579 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us  
20000

五.cpu Core控制

对多核CPU的服务器,Docker还可以控制容器运行使用哪些CPU内核,即使用--cpuset-cpus 参数。

这对具有多CPU的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。

————相当于cpu的优先级

[root@docker ~]# docker run -itd --name cpu01 --cpuset-cpus 0-1 centos:stress 
[root@docker/sys/fs/cgroup/cpuset/docker/18faa354b70d24c6c1de4b085630294b811a16d7e442ae0a68ee7bb0f2bb66d9]# cat cpuset.cpus 
0-1
##容器内部
[root@docker ~]# docker exec -it 18faa354b70d /bin/bash
[root@18faa354b70d /]# cd /sys/fs/cgroup/cpuset/
[root@18faa354b70d cpuset]# ls
cgroup.clone_children  cpuset.cpu_exclusive  cpuset.mem_hardwall     cpuset.memory_spread_page  cpuset.sched_load_balance        tasks
cgroup.event_control   cpuset.cpus           cpuset.memory_migrate   cpuset.memory_spread_slab  cpuset.sched_relax_domain_level
cgroup.procs           cpuset.mem_exclusive  cpuset.memory_pressure  cpuset.mems                notify_on_release
[root@18faa354b70d cpuset]# cat cpuset.cpus
0-1

 

六.cpu配额控制参数的混合使用

通过cpuset-cpus 参数指定容器A使用CPU内核0,容器B只是用CPU内核1。

在主机上只有这两个容器使用对应CPU内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。

cpuset-cpus、 cpuset-mems参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配

[root@docker ~]# docker run -itd --cpuset-cpus 0 --cpu-shares 1024 centos:stress 
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND         CREATED         STATUS     
924e51901244   centos:stress   "stress -c 1"   4 seconds ago   Up 3 seco
[root@docker ~]# top
#按1查看每个cpu核心的占用

[root@docker ~]# docker run -itd --name cpu512 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1

七.内存限额

容器可使用的内存包括两部分:物理内存和Swap分区

-m或--memory:设置内存的使用限额,例如100M、1024M.

--memory-swap:设置内存+swap的使用限额。

[root@docker ~]# docker run -itd --name cpu-memory  -m 200m --memory-swap 300m centos:stress 

八. Block IO的限制

所有容器能平等地读写磁盘,可以通过设置--blkio-weight参数来改变容器block IO的优先级。

--blkio-weight 与--cpu-shares类似,设置的是相对权重值,默认为500。

#法一
[root@docker ~]# docker run -it --name test1 --blkio-weight 600 centos:stress 
[root@af41147b44a7 /]# cat /sys/fs/cgroup/blkio/blkio.weight
600

#法二
[root@docker ~]# docker run -itd --name test2 --blkio-weight 600 centos:stress 
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS          PORTS     NAMES
e21fdcbfdd4e   centos:stress   "/bin/bash"   28 seconds ago   Up 27 seconds             test2
[root@docker ~]# docker exec -it e21fdcbfdd4e /bin/bash
[root@e21fdcbfdd4e /]# cat /sys/fs/cgroup/blkio/blkio.weight
600

bps是byte per second,每秒读写的数据量(吞吐量)。

iops是io per second,每秒IO的次数。

可以通过这些参数控制容器的bps和iops

--device-read-bps,限制读某个设备的bps。

--device-write-bps,限制写某个设备的bps.

--device-read-iops,限制读某个设备的iops。

--device-write-iops,限制写某个设备的iops.
[root@docker ~]# docker run -itd --name wbps1 --device-write-bps /dev/sda:5m centos:stress 
a052cffa9e91392da8e3da7fb709ee85ee93231c148d92fdc51d100cf2cac584
[root@docker ~]# docker exec -it wbps1 /bin/bash
[root@a052cffa9e91 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
199+0 records in
199+0 records out
208666624 bytes (209 MB) copied, 39.8008 s, 5.2 MB/s
#按ctrl+c中断查看

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS     NAMES
579a647ec39c   centos:stress   "/bin/bash"   3 seconds ago   Up 2 seconds             test2
a052cffa9e91   centos:stress   "/bin/bash"   5 minutes ago   Up 5 minutes             wbps1
[root@docker ~]# docker exec -it test2 /bin/bash
[root@579a647ec39c /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.716525 s, 1.5 GB/s

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐