一看必會系列:docker 練習 6 docker資源限制cpu memory

來源:本站原創 Docker 超過194 views圍觀 0條評論

 

前面練完知道如何使用docker 那么如保更好的控制也需要進行練習

Docker 基于 Linux 內核提供的 cgroups 功能,可以限制容器在運行時使用到的資源,比如內存、CPU、塊 I/O、網絡等。

首先查看 cpu的數量
[email protected]:~# 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及相關資源

[email protected]:~# 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
[email protected]:~#

從以上看 發現 是沒有限制可以共用host的所有資源,
這樣會影響資源有分配和容器的穩定性。系統可能kill容器

一,限制內存

命令
docker run -it -m  內存大小

[email protected]:~# 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

[email protected]:~# 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
[email protected]:~#

————-報錯
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.qdxgqk.live/ 版權所有。本站文章除注明出處外,皆為作者原創文章,可自由引用,但請注明來源。 禁止全文轉載。
本文鏈接:http://www.qdxgqk.live/?p=4089轉載請注明轉自CCIE那點事
如果喜歡:點此訂閱本站
  • 相關文章
  • 為您推薦
  • 各種觀點
?
暫時還木有人評論,坐等沙發!
發表評論

您必須 [ 登錄 ] 才能發表留言!

?
?
萌宠夺宝游戏