前面练完知道如何使用docker 那么如保更好的控制也需要进行练习
Docker 基于 Linux 内核提供的 cgroups 功能,可以限制容器在运行时使用到的资源,比如内存、CPU、块 I/O、网络等。
首先查看 cpu的数量
root@docker:~# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4 ---4个
On-line CPU(s) list: 0-3 ----cpu序号 0,1,2,3
先来看一下容器使用的内存CPU及相关资源
root@docker:~# docker stats dd4d7133240f
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
dd4d7133240f quizzical_curran 0.00% 5.379MiB / 7.79GiB 0.07% 9.83MB / 93.8kB 0B / 56.8MB 1
^C
root@docker:~#
从以上看 发现 是没有限制可以共用host的所有资源,
这样会影响资源有分配和容器的稳定性。系统可能kill容器
一,限制内存
命令
docker run -it -m 内存大小
root@docker:~# docker run -it -m 500M reg.ccie.wang/test/ubuntu:sshd001 /bin/bash
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
运行下面的命令后可以看出 LIMIT 500MiB成功
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
290255fe3161 inspiring_brown 0.00% 1.918MiB / 500MiB 0.38% 2.89kB / 0B 1.61MB / 0B 1
进行内存压力测试
容器内安装
安装stress
apt-get update
apt install -y stress
运行命令 使用1个IO进程,10个内存分配进程,每次分配100M,分配后不释放,测试100S
stress -i 1 -m 10 –vm-bytes 100M –vm-hang 100 –timeout 100s
命令运行前 内存使用 1.82MiB / 500MiB
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c3db20ece882 festive_blackburn 0.00% 1.82MiB / 500MiB 0.36% 2.51MB / 33.7kB 1.88MB / 2.42GB 1
命令使用后 499.9MiB / 500MiB
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c3db20ece882 festive_blackburn 12.20% 499.9MiB / 500MiB 99.97% 2.51MB / 33.7kB 393kB / 1.22GB 13
测试成功
如果进入容器会发现,容器内内存显示仍为主机的内存大小,这个无所谓
二,CPU 限制
进行cpu压力测试 计算圆周率
apt-get update
apt install bc
echo "scale=50000; 4*a(1)" | bc -l -q
以下方式是不指定CPU 所以看不出权限的作用
第一个 container
docker run -it -c 1024 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash
第二个 container
docker run -it -c 512 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash
第3个 container
docker run -it -c 512 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
5b9c706e650d lucid_babbage 99.65% 4.742MiB / 7.79GiB 0.06% 2.57MB / 33.3kB 1.09MB / 21.9MB 2
2个容器对应 两个CPU 100% 三个对应三个
top – 14:11:25 up 9 days, 22:39, 3 users, load average: 1.28, 0.41, 0.15
Tasks: 174 total, 3 running, 171 sleeping, 0 stopped, 0 zombie
%Cpu0 : 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 1.0 us, 0.7 sy, 0.0 ni, 95.8 id, 0.0 wa, 0.0 hi, 2.6 si, 0.0 st
%Cpu2 : 0.7 us, 1.0 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.3 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 st
MiB Mem : 7976.8 total, 1231.0 free, 1707.2 used, 5038.7 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 5977.2 avail Mem
-c,–cpu-shares=0 CPU 共享权值(相对权重)
–cpuset-cpus="" 允许使用的 CPU 集,值可以为 0-3,0,1
测试2 限制 容器只能使用CPU 1 并且三个容器 按权重分配使用率
1配置 :docker run -it –cpuset-cpus 1 -c 1024 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash
2配置 :docker run -it –cpuset-cpus 1 -c 512 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash
3配置 :docker run -it –cpuset-cpus 1 -c 512 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash
container 1 权重1024 理论上最大占50%
container 2 权重512 理论上最大占50% 的一半
container 3 权重512 理论上最大占50% 的一半
计算方式理解决 1+2+3 应等于100
1=2*2
1=3*2
在host上查看top cpu跑满
%Cpu1 : 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
查看运行中的三个 container
docker stats cf3388f91e18 2e7e91f901a2 48b30cb94410
结果如下,证明限制是有效的
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
cf3388f91e18 trusting_bassi 25.02% 3.25MiB / 7.79GiB 0.04% 2.57MB / 28.1kB 0B / 21.8MB 2
2e7e91f901a2 suspicious_bardeen 25.47% 3.227MiB / 7.79GiB 0.04% 2.59MB / 44kB 0B / 21.8MB 2
48b30cb94410 distracted_lamport 49.88% 3.027MiB / 7.79GiB 0.04% 2.6MB / 40.2kB 0B / 21.8MB 2
^C
警告解决
1. vim /etc/default/grub 增加配置
#docker add support cgroup
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
2. $ sudo update-grub 更新grub
3. 重启服务生效
https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities
root@docker:~# update-grub
Generating grub configuration file …
Found linux image: /boot/vmlinuz-4.18.0-16-generic
Found initrd image: /boot/initrd.img-4.18.0-16-generic
Found linux image: /boot/vmlinuz-4.18.0-15-generic
Found initrd image: /boot/initrd.img-4.18.0-15-generic
Found linux image: /boot/vmlinuz-4.18.0-10-generic
Found initrd image: /boot/initrd.img-4.18.0-10-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done
root@docker:~#
————-报错
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
警告解决
1. vim /etc/default/grub 增加配置
#docker add support cgroup
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
2. $ sudo update-grub 更新grub
3. 重启服务生效
https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities
Docker 提供的内存限制功能有以下几点:
容器能使用的内存和交换分区大小。
容器的核心内存大小。
容器虚拟内存的交换行为。
容器内存的软性限制。
是否杀死占用过多内存的容器。
容器被杀死的优先级
一般情况下,达到内存限制的容器过段时间后就会被系统杀死
内存限制相关的参数
执行docker run命令时能使用的和内存限制相关的所有选项如下。
选项 描述
-m,–memory 内存限制,格式是数字加单位,单位可以为 b,k,m,g。最小为 4M
–memory-swap 内存+交换分区大小总限制。格式同上。必须必-m设置的大
–memory-reservation 内存的软性限制。格式同上
–oom-kill-disable 是否阻止 OOM killer 杀死容器,默认没设置
–oom-score-adj 容器被 OOM killer 杀死的优先级,范围是[-1000, 1000],默认为 0
–memory-swappiness 用于设置容器的虚拟内存控制行为。值为 0~100 之间的整数
–kernel-memory 核心内存限制。格式同上,最小为 4M
CPU 限制
概述
Docker 的资源限制和隔离完全基于 Linux cgroups。对 CPU 资源的限制方式也和 cgroups 相同。Docker 提供的 CPU 资源限制选项可以在多核系统上限制容器能利用哪些 vCPU。而对容器最多能使用的 CPU 时间有两种限制方式:一是有多个 CPU 密集型的容器竞争 CPU 时,设置各个容器能使用的 CPU 时间相对比例。二是以绝对的方式设置容器在每个调度周期内最多能使用的 CPU 时间。
CPU 限制相关参数
docker run命令和 CPU 限制相关的所有选项如下:
选项 描述
–cpuset-cpus="" 允许使用的 CPU 集,值可以为 0-3,0,1
-c,–cpu-shares=0 CPU 共享权值(相对权重)
cpu-period=0 限制 CPU CFS 的周期,范围从 100ms~1s,即[1000, 1000000]
–cpu-quota=0 限制 CPU CFS 配额,必须不小于1ms,即 >= 1000
–cpuset-mems="" 允许在上执行的内存节点(MEMs),只对 NUMA 系统有效
其中–cpuset-cpus用于设置容器可以使用的 vCPU 核。-c,–cpu-shares用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。–cpu-period和–cpu-quata用于绝对设置容器能使用 CPU 时间。
–cpuset-mems暂用不上,这里不谈。
———————
作者:流沙的刺客
来源:CSDN
原文:https://blog.csdn.net/candcplusplus/article/details/53728507
版权声明:本文为博主原创文章,转载请附上博文链接!