企业网站页面图片,论坛网站如何建设,wordpress优酷视频插件下载,惠州外发加工网目录 一、cgroups简介
cgroups有四大功能#xff1a;
二、cpu时间片的概念
三、对CPU使用的限制
3.1 设置CPU使用率上限
#xff08;1#xff09;查看容器的默认CPU使用限制
#xff08;2#xff09;进行压力测试
#xff08;3#xff09;创建容器时设置CPU使用时…目录 一、cgroups简介
cgroups有四大功能
二、cpu时间片的概念
三、对CPU使用的限制
3.1 设置CPU使用率上限
1查看容器的默认CPU使用限制
2进行压力测试
3创建容器时设置CPU使用时间限制
4对已存在的容器进行CPU限制
3.2 设置CPU资源占用比设置多个容器时才有效
1创建两个容器设置CPU资源占用比
2分别进入两个容器进行压力测试
3查看容器运行状态观察CPU使用占比
3.3 设置容器绑定指定的CPU绑核
四、对内存使用的限制
4.1 限制容器可以使用的最大内存
4.2 限制容器可用的swap 大小
五、对磁盘IO的配置控制blkio的限制
5.1 创建容器不限制写速度
5.2 创建容器并限制写速度
六、清除docker占用的磁盘空间
总结
1.对cpu的限制参数
2.对内存的限制
3.对磁盘IO的限制 一、cgroups简介
cgroups是一个非常强大的linux内核工具他不仅可以限制被namespace 隔离起来的资源还可以 为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。
cgroups有四大功能
资源限制可以对任务使用的资源总额进行限制。优先级分配通过分配的cpu时间片数量以及磁盘IO带宽大小实际上相当于控制了任务运行优先级。资源统计可以统计系统的资源使用量如cpu时长内存用量等。任务控制 cgroup可以对任务 执行挂起、恢复等操作。
二、cpu时间片的概念
时间片即CPU分配给各个程序的时间每个线程被分配一个时间段称作它的时间片即该进程允许运行的时间使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束则CPU当即进行切换。而不会造成CPU资源浪费。
在宏观上我们可以同时打开多个应用程序每个程序并行不悖同时运行。但在微观上由于只有一个CPU一次只能处理程序要求的一部分如何处理公平一种方法就是引入时间片每个程序轮流执行。
三、对CPU使用的限制
3.1 设置CPU使用率上限
Linux通过CFS Completely Fair Scheduler 完全公平调度器来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。
我们可以设置每个容器进程的调度周期以及在这个周期内各个容器最多能使用多少CPU时间。 使用 --cpu-period 即可设置调度周期使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。 CFS周期的有效范围是1ms ~ 1s 对应的 --cpu-period 的数值范围是 1000 ~1000000 单位微秒。 而容器的CPU配额必须不小于1ms即 --cpu-quota 的值必须 1000。 1查看容器的默认CPU使用限制
#创建并启动容器[rootyuji ~]# docker run -itd --name test1 centos:7 /bin/bashWARNING: IPv4 forwarding is disabled. Networking will not work.059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08#查看容器状态[rootyuji ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES059823a1abbe centos:7 /bin/bash 12 seconds ago Up 10 seconds test1#切换到cgroup下针对容器的相关配置目录[rootyuji ~]# cd /sys/fs/cgroup/cpu/docker/[rootyuji docker]# ls059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08 cpu.cfs_quota_uscgroup.clone_children cpu.rt_period_uscgroup.event_control cpu.rt_runtime_uscgroup.procs cpu.sharescpuacct.stat cpu.statcpuacct.usage notify_on_releasecpuacct.usage_percpu taskscpu.cfs_period_us##切换到test1容器的目录[rootyuji docker]# cd 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08[rootyuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# lscgroup.clone_children cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_releasecgroup.event_control cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks##查看test1容器的CPU使用限额。即每个调度周期内可占用的CPU时间单位微秒[rootyuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_quota_us-1 #默认为-1表示不限制##查看CPU调度周期单位微秒[rootyuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_period_us100000 #单位微秒即100毫秒0.1秒#cpu.cfs_period_us分配的周期微秒所以文件名中用u,默认为100000。#cpu.cfs_quota_us表示该cgroups限制占用的时间微秒默认为-1表示不限制。#cpu.cfs_quota_us 如果设为50000表示占用 50000/10000050%的CPU。2进行压力测试
[rootyuji ~]# docker exec -it test1 bash #进入容器[root059823a1abbe /]# vi /cpu.sh #写个死循环脚本#!/bin/bashi0while truedolet idone[root059823a1abbe /]# chmod x cpu.sh #给脚本权限[root059823a1abbe /]# ./cpu.sh #运行脚本#再开一个终端查看cpu.sh进程的cpu使用率[rootlocalhost ~]# top #可以看到使用率接近100%PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND3328 root 20 0 11688 1100 916 R 99.7 0.1 7:04.44 cpu.sh#之后在容器中使用ctrlc停止脚本的执行再top观察CPU使用率3创建容器时设置CPU使用时间限制
#创建容器test2并限制CPU使用时间为50000微秒表示最多占用50%的CPU。[rootyuji ~]# docker run -itd --name test2 --cpu-quota 50000 centos:7WARNING: IPv4 forwarding is disabled. Networking will not work.8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b#查看CPU限额文件[rootyuji ~]# cd /sys/fs/cgroup/cpu/docker/[rootyuji docker]# ls059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08 cpuacct.usage cpu.shares8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b cpuacct.usage_percpu cpu.statcgroup.clone_children cpu.cfs_period_us notify_on_releasecgroup.event_control cpu.cfs_quota_us taskscgroup.procs cpu.rt_period_uscpuacct.stat cpu.rt_runtime_us[rootyuji docker]# cd 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b[rootyuji 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b]# cat cpu.cfs_quota_us50000#登录容器test2写个死循环脚本并运行[rootyuji ~]# docker exec -it test2 bash[root8e7ba758a231 /]# vi /cpu.sh#!/bin/bashi0while truedolet idone[root8e7ba758a231 /]# chmod x cpu.sh[root8e7ba758a231 /]# ./cpu.sh #再开一个终端查看cpu使用率[rootyuji ~]# top #CPU使用率在50%左右PID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND3746 root 20 0 11688 1096 916 R 50.0 0.1 1:55.26 cpu.sh#容器的CPU使用时间限制设为50000而调度周期为100000表示容器占用50000/10000050%的CPU。4对已存在的容器进行CPU限制 直接修改 /sys/fs/cgroup/cpu/docker/容器id/cpu.cfs_quota_us 文件即可 #进入test1容器目录修改CPU使用时间限制[rootyuji ~]# cd /sys/fs/cgroup/cpu/docker/[rootyuji docker]# ls059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08 cpuacct.usage cpu.shares8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b cpuacct.usage_percpu cpu.statcgroup.clone_children cpu.cfs_period_us notify_on_releasecgroup.event_control cpu.cfs_quota_us taskscgroup.procs cpu.rt_period_uscpuacct.stat cpu.rt_runtime_us[rootyuji docker]# cd 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08#修改CPU使用时间限制[rootyuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# echo 33000 cpu.cfs_quota_us[rootyuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_quota_us33000#此时再进入test1容器执行之前创建好的脚本进行压力测试[rootyuji ~]# docker exec -it test1 bash[root059823a1abbe /]# ./cpu.sh#再开一个终端查看cpu使用率[rootlocalhost ~]# topPID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND4635 root 20 0 11688 1096 916 R 33.3 0.1 1:27.62 cpu.sh#容器的CPU使用时间限制设为33000而调度周期为100000表示容器占用33000/10000033%的CPU。3.2 设置CPU资源占用比设置多个容器时才有效 Docker 通过 --cpu-shares 指定CPU份额默认值为1024值为1024的倍数。 1创建两个容器设置CPU资源占用比
#先删除所有容器[rootyuji ~]# docker rm -f $(docker ps -aq)9c48e09ea1567c7e024b557e#创建两个容器为c1和c2#只有这2个容器的情况下cpu资源分摊给这两个容器512:1024等于1:2一个占1/3一个占2/3。[rootyuji ~]# docker run -itd --name c1 --cpu-shares 512 centos:7WARNING: IPv4 forwarding is disabled. Networking will not work.300b50f13ebef4921029e352f5850b1c81f8f8e28827a8d11f20e55eec94642b[rootyuji ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7WARNING: IPv4 forwarding is disabled. Networking will not work.7a999b00c9eef7fdb916c2914087809e7eba55b1c52aaaabeeda16a4006f57a9[rootyuji ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7a999b00c9ee centos:7 /bin/bash 4 seconds ago Up 3 seconds c2300b50f13ebe centos:7 /bin/bash 6 seconds ago Up 5 seconds c12分别进入两个容器进行压力测试
#宿主机开启路由转发功能使容器能够连通外网[rootyuji ~]# echo net.ipv4.ip_forward 1 /etc/sysctl.conf[rootyuji ~]# sysctl -pnet.ipv4.ip_forward 1#进入c1容器进行压力测试docker exec -it c1 bashyum install -y epel-release #下载epel源yum install -y stress #安装stress工具stress -c 4 #产生四个进程每个进程都反复不停地计算随机数的平方根#进入c2容器进行压力测试docker exec -it c2 bashyum install -y epel-release #下载epel源yum install -y stress #安装stress工具stress -c 4 #产生四个进程每个进程都反复不停的计算随机数的平方根进入c1容器进行压力测试 进入c2容器进行压力测试 3查看容器运行状态观察CPU使用占比
#再打开一个终端查看容器运行状态(动态更新)[rootyuji ~]# docker stats #可以看到CPU使用占比大约是1:2CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS7a999b00c9ee c2 266.52% 188.9MiB / 1.938GiB 9.52% 32.8MB / 152kB 1.91MB / 50MB 7300b50f13ebe c1 133.03% 203.1MiB / 1.938GiB 10.24% 33.7MB / 603kB 108MB / 51.4MB 7#因为宿主机有4核所以CPU总百分比是400%。#c1:c2 133.03%:266.52% ≈ 1:23.3 设置容器绑定指定的CPU绑核
注意CPU编号从0开始。 编号1、3代表第二个核和第四个核 。
#先为虚拟机分配4个CPU核数#创建容器c3时绑定1号和3号这两个CPU[rootyuji ~]# docker run -itd --name c3 --cpuset-cpus 1,3 centos:7 /bin/bash#进入容器进行压力测试docker exec -it c3 bashyum install -y epel-release #下载epel源yum install -y stress #安装stress工具stress -c 4 #产生四个进程每个进程都反复不停地计算随机数的平方根#退出容器执行top命令再按1查看CPU使用情况[rootyuji ~]# top #可以看到CPU1和CPU3占满其他CPU使用率为0top - 01:12:49 up 4:01, 3 users, load average: 3.47, 2.96, 2.49Tasks: 183 total, 6 running, 177 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 :100.0 us, 0.0 sy, 0.0 ni, 0.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 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stKiB Mem : 2031912 total, 150852 free, 635800 used, 1245260 buff/cacheKiB Swap: 4194300 total, 4194236 free, 64 used. 1138692 avail Mem四、对内存使用的限制
4.1 限制容器可以使用的最大内存 -m 或--memory选项用于限制容器可以使用的最大内存 #-m(--memory)选项用于限制容器可以使用的最大内存。#创建容器c4并限制容器可以使用的最大内存为512m[rootyuji ~]# docker run -itd --name c4 -m 512m centos:7 /bin/bash#查看容器状态可以看到c4可以使用的最大内存是512M[rootyuji ~]# docker statsCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS437180fc6266 c4 0.00% 396KiB / 512MiB 0.08% 648B / 0B 0B / 0B 1ebcc06da3a03 c3 0.00% 174.2MiB / 1.938GiB 8.78% 32.8MB / 196kB 47.7MB / 50.6MB 17a999b00c9ee c2 0.00% 101.7MiB / 1.938GiB 5.13% 32.9MB / 152kB 1.91MB / 50MB 2300b50f13ebe c1 0.00% 113MiB / 1.938GiB 5.69% 33.7MB / 603kB 108MB / 51.4MB 14.2 限制容器可用的swap 大小
#限制可用的swap 大小--memory-swap●强调一下 --memory-swap是必须要与 --memory或-m一起使用的。●正常情况下 --memory-swap 的值包含容器可用内存和可用swap 。●所以 -m 300m --memory-swap1g 的含义为容器可以使用300M 的物理内存并且可以使用700M (1G - 300M)的swap。设置为0或者不设置则容器可以使用的 swap 大小为 -m 值的两倍。如果 --memory-swap 的值和 -m 值相同则容器不能使用swap。如果 --memory-swap 值为 -1它表示容器程序使用的内存受限而可以使用的swap空间使用不受限制宿主机有多少swap 容器就可以使用多少。示例
#--memory-swap 的值包含容器可用内存和可用swap减去-m的值才是可用swap的值。#表示容器可以使用512M的物理内存并且可以使用512M的swap。因为1g减去512m的物理内存剩余值才是可用swap。docker run -itd --name yy01 -m 512m --memory-swap1g centos:7 bash#--memoryswap值和 -m 的值相同表示容器无法使用swapdocker run -itd --name yy02 -m 512m --memory-swap512m centos:7 bash# --memory-swap 的值设置为0或者不设置则容器可以使用的 swap 大小为 -m 值的两倍。docker run -itd --name yy03 -m 512m centos:7 bash# --memory-swap 值为 -1它表示容器程序使用的内存受限但可以使用的swap空间使用不受限制宿主机有多少swap 容器就可以使用多少。docker run -itd --name yy04 -m 512m --memory-swap-1 centos:7 bash五、对磁盘IO的配置控制blkio的限制 --device-read-bps限制某个设备上的读速度bps ( 数据量)单位可以是kb、mb (M)或者gb。 --device-write-bps : 限制某个设备上的写速度bps ( 数据量)单位可以是kb、mb (M)或者gb。 --device-read-iops :限制读某个设备的iops (次数) --device-write-iops :限制写入某个设备的iops ( 次数) --device-read-bps:限制某个设备上的读速度bps ( 数据量)单位可以是kb、mb (M)或者gb。 例: docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash #表示该容器每秒只能读取1M的数据量 --device-write-bps : 限制某个设备上的写速度bps ( 数据量)单位可以是kb、mb (M)或者gb。 例: docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash #表示该容器每秒只能写入1M的数据量 --device-read-iops :限制读某个设备的iops (次数) --device-write-iops :限制写入某个设备的iops ( 次数) 5.1 创建容器不限制写速度 #创建容器tt01不限制写入速度 docker run -it --name tt01 centos:7 /bin/bash #通过dd来验证写速度拷贝50M的数据 dd if/dev/zero of/opt/test.out bs10M count5 oflagdirect #添加oflag参数以规避掉文件系统cache #创建容器tt01不限制写入速度 [rootyuji ~]# docker run -it --name tt01 centos:7 /bin/bash #通过dd来验证写速度拷贝50M的数据到容器中 [roota62f5b811e58 /]# dd if/dev/zero of/opt/test.out bs10M count5 oflagdirect #添加oflag参数以规避掉文件系统cache 50 records in 50 records out 52428800 bytes (52 MB) copied, 0.0948474 s, 553 MB/s #没有限制写速度的情况下写入很快0.09秒的时间内已写入50M的数据写入速度为553M/s。 5.2 创建容器并限制写速度 #创建容器并限制写入速度为1MB/s即每秒只能写入1MB的数据量。 [rootyuji ~]# docker run -it --name tt02 --device-write-bps /dev/sda:1mb centos:7 bash #通过dd来验证写速度拷贝50M的数据到容器中 [root655f6cca0175 /]# dd if/dev/zero of/opt/test.out bs10M count5 oflagdirect #添加oflag参数以规避掉文件系统cache 50 records in 50 records out 52428800 bytes (52 MB) copied, 50.0048 s, 1.0 MB/s #写入50M的数据需要50s左右因为限制了容器的写速度是 1.0 MB/s。 六、清除docker占用的磁盘空间 docker system prune -a 可用于清理磁盘删除关闭的容器、无用的数据卷和网络。 示例 #查看容器 [rootyuji ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 655f6cca0175 centos:7 bash 10 minutes ago Exited (0) 4 minutes ago tt02 a62f5b811e58 centos:7 /bin/bash 19 minutes ago Exited (0) 11 minutes ago tt01 437180fc6266 centos:7 /bin/bash 36 minutes ago Up 36 minutes c4 ebcc06da3a03 centos:7 /bin/bash 50 minutes ago Up 50 minutes c3 #清理磁盘删除关闭的容器、无用的数据卷和网络。 [rootyuji ~]# docker system prune -a WARNING! This will remove: #提示 - all stopped containers #删除清理所有停止的容器 - all networks not used by at least one container #删除未被使用的网络 - all images without at least one container associated to them #未被使用的镜像 - all build cache #删除已建立的缓存 Are you sure you want to continue? [y/N] y #是否确定删除 Deleted Containers: 655f6cca01754d27a080e01b64aa26c4f96642ab5b5931b186ad04082a98430f a62f5b811e584cc6e8d344830d5df9ddcbdd72761966989245b0c52f6abb9a4a ...... Total reclaimed space: 451MB #再次查看容器只剩下启动中的容器 [rootlocalhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 525d77ff7423 centos:7 /bin/bash 3 minutes ago Up 3 minutes c6 fb2ee21e0468 centos:7 /bin/bash 12 minutes ago Up 12 minutes c4 81e3ea8f526e centos:7 /bin/bash 18 minutes ago Up 18 minutes c3 总结
1.对cpu的限制参数 docker run -cpu-period #设置调度周期时间1000~1000000 -cpu-quota #设置容器进程的CPU占用时间要与调度周期时间成比例 --cpu-shares #设置多个容器之间的CPU资源占用比 --cpuset-cpus #绑核第一个CPU编号从0开始 2.对内存的限制 -m 物理内存 [--memory-swap总值] 3.对磁盘IO的限制 --device-read-bps 设备文件:1mb/1M #限制读速度 --device-write-bps 设备文件:1mb/1M #限制写速度 --device-read-iops #限制读次数 --device-write-iops #限制写次数 docker system prune -a #清理磁盘删除关闭的容器、无用的数据卷和网络。