Docker 資源配額控制

2022-04-09 07:13:15 字數 4439 閱讀 9239

啟動docker

容器時,指定

cpu,記憶體,硬碟效能等的硬體資源使用份額。

docker

通過cgroup

來控制容器使用的資源配額,包括

cpu、記憶體、磁碟三大方面,基本覆蓋了常見的資源配額和使用量控制。

cgroup

概述:cgroup

是control groups

的縮寫,是

linux

核心提供的一種可以限制、記錄、隔離迚程組所使用的物理資源(如

cpu、

memory

、磁碟io

等等)

的機制,被

lxc、

docker

等很多專案用於實現迚程資源控制。

cgroup

將任意迚程迚行分組化管理的

linux

核心功能。

cgroup

本身是提供將迚程迚行分組化管理的功能和介面的基礎結構,

i/o

戒記憶體的分配控制等具體的資源管理功能是通過這個功能來實現的。

為什麼要迚行硬體配額?

當多個容器執行時,防止某容器把所有的硬體都占用了。(比如一台被黑的容器)

[root@syxk ~]#docker run --help | grep cpu-shares

cpu配額引數-c,

--cpu-shares int cpu shares

在建立容器時指定容器所使用的

cpu份額值。

cpu shares

的值不能保證可以獲得1個

vcpu

或者多少

ghz的

cpu資源,僅僅只是乙個彈性的加權值。預設情況下:每個

docker

容器的cpu

份額都是

1024.

單獨乙個容器的份額是沒有意義的,只有在同時執行多個容器時,容器的

cpu加權的效果才能體現出來。

例如:兩個容器

a,b的

cpu份額分別為

1000

和500

,結果會怎麼樣?

情況1:a和b

正常執行,在

cpu進行時間片分配的時候,容器

a比容器

b多一倍的機會獲得

cpu的時間片。

情況2:

分配的結果取決於當前主機和其他容器執行狀況,實際上也無法保證容器

a一定能獲得

cpu時間片。比如容器

a的程序一直是空閒的,那麼容器

b是可以獲取比容器

a更多的

cpu時間片的。極端情況下,比如主機只執行乙個容器,即使它的

cpu份額只有

50,它也可以獨佔整個主機的

cpu資源。

問:兩個容器a、

b的cpu份額分別為

1000

和500,1000+500>1024

是超出了嗎?

答:沒有。a使用

1024

的2/3,b

使用1024

的1/3

cgroups

只在容器分配的資源緊缺時,也就是說在需要對容器使用的資源迚行限制時,才會生效。因此,無法單純根據某個容器的

cpu

份額來確定有多少

cpu

資源分配給它,資源分配結果取決於同時執行的其他容器的

cpu

分配和容器中程序運**況。

[root@syxk ~]#docker run -it --cpu-shares 512 centos:latest /bin/bash

[root@df176dd75bd3]#cat /sys/fs/cgroup/cpu/cpu.shares

檢視結果

512注:應啟動多個容器,測試下是不是只能使用

512份額的

cpu資源。單獨乙個容器,看不出來。

--cpu-period

指定週期

預設值是

0.1秒

--cpu-quota

指定在這個週期中使用多少時間片

預設值是

-1 表示不做控制

--cpu-period --cpu-quota

的單位是微妙

跟--cpu-shares

不同,--cpu-period --cpu-quota

是指定乙個絕對值,而且沒有彈性在裡面,容器對

cpu資源的使用絕對不會超過配置的值。

例項:如果容器程序需要每

1秒使用單個

cpu的

0.2秒時間,可以將

cpu-period

配置為1000000(即1

秒),cpu-quota

設定為200000

(0.2

秒)。[root@syxk ~]#docker run -it --cpu-period 1000000 --cpu-quota 200000 centos /bin/bash

[root@0363ce23f264]#cat /sys/fs/cgroup/cpu/cpu.cfs_period_us

1000000

[root@0363ce23f264]#cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us

200000

引數:--cpuset

可以繫結

cpu對多核

cpu伺服器,

docker

還可以控制容器執行限定使用哪些

cpu核心和記憶體節點,即使用

-cpuset-cpus

和-cpuset-mems

引數。對具有

numa

拓撲(具有多

cpu、多記憶體節點)的伺服器尤其有用,可以對需要高效能計算的容器迚行效能最優的配置。如果伺服器只有乙個記憶體節點,則–

cpuset-mems

的配置基本上不會有明顯效果。

docker

提供引數-m,

--memory=""

限制容器的記憶體使用量

例項:允許容器使用的記憶體上限為128m

[root@syxk ~]#

docker run -it -m 128m centos:latest

[root@40bf29765691 /]#cat /sys/fs/cgroup/memory/memory.limit_in_bytes

134217725

[root@syxk ~]

#docker run --help | grep write-b

--device-write-bps value

限制此裝置上的寫速度,單位可以是kb、mb或者gb

--device-read-bps value

限制此裝置上的讀速度,單位可以是kb、mb或者gb

為什麼阿里雲上普通雲盤的io為:1000 iops,為什麼這麼小?

原因:儲存給2000臺雲主機使用,需要控制一下。防止某台雲主機吃光你的磁碟i/o資源

場景

:防止某個

docker

容器吃光你的磁碟

i/o資源。

例項:容器對磁碟的最高寫入速度設定為

1mb/s

--device

引數:將主機裝置新增到容器

說明:1

、該裝置在主機上是要真實存在的

2、預設情況下,在容器裡沒有該裝置

[root@syxk ~]#docker run -it -v /var/www/html/:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:1mb centos /bin/bash

[root@81254456fe12:~]#time dd if=/dev/sda of=/var/www/html/test.out bs=1m count=50 oflag=direct,nonblock

direct:

讀寫資料採用直接

io方式。

nonblock

:讀寫資料採用非阻塞

io方式。驗證:

[root@syxk ~]#ll -h /var/www/html發現1

秒寫1m

。限制成功。

同理:測試容器對磁碟的最大讀取速度設定為

1mb/s

[root@syxk ~]#docker run -it --device /dev/sda:/dev/sda --device-read-bps /dev/sda:1mb centos /bin/bash

[root@8124556fe12:~]#time dd if=/dev/sda of=test.out bs=1m count=50 oflag=direct,nonblock

Docker 資源控制

cpu限額 block io頻寬限額 docker run it m 200m memory swap 300m progrium stress vm 1 vm bytes 280m vm 1 啟動1個記憶體工作執行緒 vim bytes 280m 每個執行緒分配280mb記憶體 如果超過 vm b...

Linux 磁碟配額 訪問控制列表

quota 磁碟配額 核心中實現,檔案系統 針對檔案系統 兩種配額標準 空間配額 1k blocks 檔案配額 使用者最多可以穿件的檔案 兩種配額型別 軟限制硬限制 對管理員無效 指定特殊的掛載選項 etc fstab usrquota grpquota mount o remount 磁碟 aqu...

Docker資源限制

1.linux cgroups 的全稱是 linux control group,是限制乙個程序組能夠使用的資源上限,包括 cpu 記憶體 磁碟 網路頻寬等。2.對程序進行優先順序設定 審計,以及將程序掛起和恢復等操作。3.linux cgroups 給使用者暴露出來的操作介面是檔案系統,它以檔案和...