一看必会系列:docker 练习 6 docker资源限制cpu memory

来源:本站原创 Docker 超过124 views围观 0条评论

 

前面练完知道如何使用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
版权声明:本文为博主原创文章,转载请附上博文链接!

文章出自:CCIE那点事 http://www.jdccie.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。
本文链接:http://www.jdccie.com/?p=4089转载请注明转自CCIE那点事
如果喜欢:点此订阅本站
  • 相关文章
  • 为您推荐
  • 各种观点

暂时还木有人评论,坐等沙发!
发表评论

您必须 [ 登录 ] 才能发表留言!