docker——Cgroups资源配置
目录一.Cgroup资源配置二.cpu使用率控制三.使用stress工具测试CPU和内存一.Cgroup资源配置cgroups隔离=====容器隔离docker使用cgroup控制资源Docker通过cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。Cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录
目录
一.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
更多推荐
所有评论(0)