目录
一、Cgroup定义
cgroup是Linux系统内核提供的一种用来限制、记录、隔离进程组所使用的物理资源的机制,能够实现对进程的分组化管理。
Docker通过cgroup来控制容器使用的资源配额,包括 cPU、内存、磁盘三大方面
二、使用stress压力测试工具测试cpu和内存状态
1、创建一个dockerfile文件
[root@zwb_docker stress_docker]# 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 -y install stress:
2、创建镜像
docker build -t centos:stress .
3、创建容器
①创建容器
选项:--cpu-shares参数值不能保证可以获得1个vcpu 或者多少GHz的cpu资源,它仅是一个弹性的加权值。
[root@zwb_docker data]# docker run -itd --cpu-shares 100 centos:stress
cde58dbbde820db7533a2f095f03b39d5b89255c6e789bfa23344c22d32b865a
只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu份额来确定有多少cpu资源分配给他。
②、创建容器并产生10个子函数进程
容器一:创建容器名为cpu512,设置cpu的权重为512
[root@zwb_docker data]# docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
--cpu-shares 512:表示设置权重为512
容器一:创建容器名为cpu1024,设置cpu的权重为1024
[root@zwb_docker data]# docker run -itd --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
b850fe8bbb77b37320f0233660c20e81128802d26ff239d72d8d64a83030bdab--cpu-shares 1024:表示设置权重为1024
将两天容器放一起进行对比
docker stats
容器ID为b850fe8bbb77,名为cpu1024,为cpu权重为1024
容器ID为9758ca391cb0,名为cpu512,为cpu权重为512
结果:CPU1024 比cpu512多出一半的机会拿到CPU的资源(权重值分配的是获取CPU资源的机会,而不是指cpu的资源)
三、CPU 周期
1、实现方案
Docker提供了--cpu-period、--cpu-quota两个参数控制容器可以分配到的CPU时钟周期。--cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配。
2、实验
例如:容器进程需要每1秒使用单个CPU的0.2秒时间,可以将cpu-period 设置为100000(即1秒),cpu-quota设置为20000 ( 0.2秒)
先查看默认配置,文件位置
[root@zwb_docker 9758ca391cb02d198b42da4a21c44d8d66ee1658e5a4a9561faf251ec317d32a]# pwd
/sys/fs/cgroup/cpu/docker/9758ca391cb02d198b42da4a21c44d8d66ee1658e5a4a9561faf251ec317d32a[root@zwb_docker 9758ca391cb02d198b42da4a21c44d8d66ee1658e5a4a9561faf251ec317d32a]# cat cpu.cfs_quota_us
-1 ### 数值为1,表示没有进行设置
创建容器并进行设置:
[root@zwb_docker ~]# docker run -itd --cpu-period 100000 --cpu-quota 20000 centos:stress
765c8c86912f752395d35d8a640432f6c9d69f32b702821bdec5b1464f26d968
[root@zwb_docker ~]# cd /sys/fs/cgroup/cpu/docker/765c8c86912f752395d35d8a640432f6c9d69f32b702821bdec5b1464f26d968/
[root@zwb_docker 765c8c86912f752395d35d8a640432f6c9d69f32b702821bdec5b1464f26d968]# ls
cgroup.clone_children cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release
cgroup.event_control cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks
[root@zwb_docker 765c8c86912f752395d35d8a640432f6c9d69f32b702821bdec5b1464f26d968]# cat cpu.cfs_quota_us
20000
四、 CPU Core控制
对多核CPU的服务器,Docker还可以控制容器运行使用哪些CPU内核,即使用--cpuset-cpus参数。这对具有多CPU的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。
[root@zwb_docker ~]# docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress
## 表示容器运行起来的时候只能使用0和1这两个cpu进行处理
[root@zwb_docker ~]# docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress
524ca820088440a12d0bd2d7844fa2bb5c348282d7cb055b4d24761851c9bd21
五、docker build
为了使用方便,我们也可以在构建镜像的时候把资源限制填写进去
语法格式:
docker build [选项]
选项:
-
--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 :安静模式,成功后只输出镜像 ID;
-
--rm :设置镜像成功后删除中间容器;
-
--shm-size :设置/dev/shm的大小,默认值是64M;
-
--ulimit :Ulimit配置。
-
--squash :将 Dockerfile 中所有的操作压缩为一层。
-
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
-
--network: 默认 default。在构建期间设置RUN指令的网络模式