其實(shí)在日常的工作中,我們一般都沒(méi)有對(duì)docker容器進(jìn)行資源限制,也就是默認(rèn)情況下,可以使用宿主機(jī)的所有資源。但是如果你運(yùn)行的服務(wù)有問(wèn)題,就有可能對(duì)宿主機(jī)和宿主機(jī)上的其他業(yè)務(wù)造成影響,這還是有一定的風(fēng)險(xiǎn)。那么本文會(huì)給大家介紹一下如何對(duì)容器進(jìn)行資源配置管理。
一、Cgroup資源配置簡(jiǎn)介
Cgroup,全稱Control Groups,是一個(gè)非常強(qiáng)大的linux內(nèi)核工具,它不僅可以限制被namespace 隔離起來(lái)的資源,還可以為資源設(shè)置權(quán)重、計(jì)算使用量、操控進(jìn)程啟停等等。Docker通過(guò)Cgroup 來(lái)控制容器使用資源配額,包括CPU、內(nèi)存、磁盤三大方面,基本覆蓋了對(duì)常見(jiàn)的資源配額和使用量控制管理。
Cgroup是Linux 內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組所使用的物理資源(如CPU、內(nèi)存、磁盤lO等等)的機(jī)制,被LXC、Docker等很多項(xiàng)目用于實(shí)現(xiàn)進(jìn)程資源控制。
Cgroup本身是提供將進(jìn)程進(jìn)行分組化管理的功能和接口 的基礎(chǔ)結(jié)構(gòu)。I/O或內(nèi)存的分配控制等具體的資潭管理是通過(guò)內(nèi)核功能來(lái)實(shí)現(xiàn)的。這些具體的資源管理功能稱為Cgroup子系統(tǒng),目前有如下幾大子系統(tǒng):
Cgroup子系統(tǒng) | 作用 |
---|---|
blkio | 用于對(duì)塊設(shè)備的輸入輸出進(jìn)行控制。例如:磁盤,光盤等。 |
CPU | 使用調(diào)度程序?yàn)镃group任務(wù)提供CPU的訪問(wèn)。 |
cpuacct | 用于產(chǎn)生Cgroup任務(wù)的CPU資源報(bào)告。 |
cpuset | 如果是多核心的CPU,這個(gè)子系統(tǒng)用于為Cgroup任務(wù)分配單獨(dú)的CPU和內(nèi)存。 |
devices | 用于允許或拒絕Cgroup任務(wù)對(duì)設(shè)備的訪問(wèn)。 |
freezer | 用于暫停和恢復(fù)Cgroup任務(wù)。 |
memory | 用于設(shè)置每個(gè)Cgroup的內(nèi)存限制以及產(chǎn)生內(nèi)存資源報(bào)告。 |
net_cls | 用于標(biāo)記每個(gè)網(wǎng)絡(luò)包以供Cgroup方便使用 |
ns | 用于命名空間子系統(tǒng)。 |
perf_event | 增加了對(duì)每個(gè) group 的監(jiān)測(cè)跟蹤的能力,用于監(jiān)測(cè)屬于某個(gè)特定的group的所有線程以及運(yùn)行在特定CPU上的線程。 |
二、CPU時(shí)間片的概念
時(shí)間片可以理解為CPU分配給各個(gè)程序的運(yùn)行時(shí)間,每個(gè)線程被分配一個(gè)時(shí)間段,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間,使各個(gè)程序從表面上看是同時(shí)進(jìn)行的。如果在時(shí)間片結(jié)束時(shí)進(jìn)程還在運(yùn)行,則CPU將被剝奪并分配給另一個(gè)進(jìn)程。如果進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束,則CPU當(dāng)即進(jìn)行切換。而不會(huì)造成CPU資源浪費(fèi)。
在宏觀上:我們可以同時(shí)打開多個(gè)應(yīng)用程序,每個(gè)程序并行不悖,同時(shí)運(yùn)行。但在微觀上:假如只有一個(gè)CPU,一次只能處理要求的一部分程序,那么如何分配,一種方法就是引入時(shí)間片,每個(gè)程序在某個(gè)時(shí)間片段輪流執(zhí)行。
測(cè)試使用環(huán)境:centos7,docker-ce-19.03.15,2個(gè)物理CPU,總共16核
三、CPU的資源配額
1、資源準(zhǔn)備
先制作一個(gè)有stress命令的鏡像,方便進(jìn)行壓測(cè)。并查看當(dāng)前版本的docker支持的關(guān)于cpu方便的配置。Linux通過(guò)CFS (Completely Fair Scheduler, 完全公平調(diào)度器)來(lái)調(diào)度各個(gè)進(jìn)程對(duì)CPU的使用。
[root@k8s-m1 docker]# cat Dockerfile
FROM centos:7
MAINTAINER margu_168
RUN yum install -y wget && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
&& yum install -y stress
[root@k8s-m1 docker]# docker build -t nginx:stress .
#查看docker run關(guān)于cpu的參數(shù)
See 'docker run --help'.
[root@k8s-m1 docker]# docker run --help|grep cpu
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit CPU real-time period in microseconds
--cpu-rt-runtime int Limit CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
解析:
選項(xiàng) | 描述 |
---|---|
–cpu-period | 指定CPU CFS調(diào)度程序周期,該周期與–cpu-quota一起使用。默認(rèn)為100000微妙,以微秒表示。大多數(shù)用戶不會(huì)從默認(rèn)值更改此設(shè)置。如果您使用Docker 1.13或更高版本,建議使用–cpus。 |
–cpu-quota | 在容器上添加CPU CFS配額。每個(gè)–cpu-period允許CPU訪問(wèn)的容器數(shù)微秒數(shù)。換句話說(shuō),cpu-quota / cpu-period。如果您使用Docker 1.13或更高版本,請(qǐng)改用–cpus。 |
–cpu-rt-period | 指定CPU實(shí)時(shí)周期(微秒) |
–cpu-rt-runtime | 指定CPU實(shí)時(shí)周期(微秒),CPU動(dòng)態(tài)調(diào)度是內(nèi)核的高級(jí)功能,一般不需要更改這些值,如果配置不當(dāng),可能使主機(jī)系統(tǒng)將變得不穩(wěn)定或者無(wú)法使用。該功能默認(rèn)未開啟,具體怎么使用請(qǐng)自行查閱。 |
-c,–cpu-shares | 將此標(biāo)志設(shè)置為大于或小于默認(rèn)值1024的值,以增加或減少容器的重量,并使其能夠訪問(wèn)主機(jī)CPU周期的更大或更小比例。這僅在CPU周期受到限制時(shí)才會(huì)執(zhí)行。當(dāng)大量CPU周期可用時(shí),所有容器都使用盡可能多的CPU。這樣,這是一個(gè)軟限制。–cpu-shares不會(huì)阻止容器在群集模式下進(jìn)行調(diào)度。它優(yōu)先考慮容器CPU資源的可用CPU周期。它不保證或保留任何特定的CPU訪問(wèn)權(quán)限。 |
–cpus | 指定容器可以使用多少可用CPU資源。例如,如果主機(jī)有兩個(gè)CPU,并且您設(shè)置了–cpus =“1.5”,那么該容器將保證最多可以訪問(wèn)一個(gè)半的CPU。這相當(dāng)于設(shè)置–cpu-period =“100000”和–cpu-quota =“150000”。在Docker 1.13和更高版本中可用。 |
–cpuset-cpus | 限制容器可以使用的特定CPU或核心。如果有多個(gè)CPU,則容器可以使用的逗號(hào)分隔列表或連字符分隔的CPU范圍。第一個(gè)CPU編號(hào)為0.設(shè)置為0-3(表示使用第一,第二,第三和第四個(gè)CPU)或1,3(表示使用第二個(gè)和第四個(gè)CPU)。 |
–cpuset-mems | 通過(guò)cpuset-mems設(shè)置NUMA架構(gòu)的CPU的內(nèi)存使用。很少使用 |
2、限制可用的cpu個(gè)數(shù)
1)通過(guò)–cpu-period和–cpu-quota 配合限制
[root@k8s-m1 ~]# docker run -it --cpu-period=100000 --cpu-quota=150000 centos:stress /bin/bash
[root@a482506a9cdd /]# stress -c 2 &
[1] 17
[root@a482506a9cdd /]# stress: info: [17] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
[root@a482506a9cdd /]# top
top - 08:38:21 up 1 day, 5:40, 0 users, load average: 0.56, 0.72, 1.14
Tasks: 5 total, 3 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.5 us, 0.8 sy, 0.0 ni, 88.2 id, 0.4 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 8007188 total, 473880 free, 2134940 used, 5398368 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 5308112 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19 root 20 0 7312 96 0 R 75.1 0.0 0:08.04 stress
18 root 20 0 7312 96 0 R 74.8 0.0 0:08.06 stress
1 root 20 0 11828 1936 1524 S 0.0 0.0 0:00.08 bash
17 root 20 0 7312 424 344 S 0.0 0.0 0:00.00 stress
21 root 20 0 56188 2040 1440 R 0.0 0.0 0:00.01 top
#可以觀察到cpu的使用率加起來(lái)在150%左右
##相應(yīng)的配置也可查看
[root@a482506a9cdd /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
[root@a482506a9cdd /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
150000
補(bǔ)充:可以看到,如果我們?nèi)绻业奖镜氐年P(guān)于cpu配置的文件,是可以實(shí)現(xiàn)手動(dòng)修改文件對(duì)CPU進(jìn)行限制
本地對(duì)應(yīng)文件:
以4c5ee0e0bae0為例:
[root@k8s-m1 system.slice]# docker ps -a|grep stres
4c5ee0e0bae0 centos:stress "/bin/bash" 26 minutes ago Up 15 minutes cpu4
[root@k8s-m1 system.slice]# find /sys/fs/cgroup/ -name *4c5ee0e0bae0*
/sys/fs/cgroup/perf_event/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/freezer/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/memory/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/pids/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/blkio/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/cpuset/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/devices/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/hugetlb/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/cpu,cpuacct/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/net_cls,net_prio/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
/sys/fs/cgroup/systemd/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope
如修改綁定使用的cpu
[root@k8s-m1 system.slice]# echo 3 > /sys/fs/cgroup/cpuset/system.slice/docker-4c5ee0e0bae09c3eb4ffe99b4583410d42a645298edfc544f80cbd5ca471f4a6.scope/cpuset.cpus
##注意只能能echo,不能通過(guò)vi打開修改。
2)通過(guò)–cpu限制
在 docker 1.13 及更高的版本上,能夠更方便限制容器可以使用的宿主機(jī) CPU的個(gè)數(shù)。只需要通過(guò) --cpus 選項(xiàng)可用很簡(jiǎn)單設(shè)定容器可以使用的 CPU 個(gè)數(shù),并且可以設(shè)定如1.5 之類的小數(shù)。
[root@k8s-m1 docker]# docker run -it --cpus=1.5 centos:stress /bin/bash
##-c 用于指定進(jìn)程數(shù),不宜太多,太多使用率分散了不好觀察
[root@333169612fe9 /]# stress -c 2 &
[1] 17
[root@333169612fe9 /]# stress: info: [17] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
[root@333169612fe9 /]# top
top - 07:30:18 up 1 day, 4:32, 0 users, load average: 2.73, 1.97, 2.04
Tasks: 6 total, 3 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.2 us, 0.8 sy, 0.0 ni, 88.2 id, 0.7 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 8007188 total, 810564 free, 2058384 used, 5138240 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 5400800 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28 root 20 0 7312 128 32 R 75.7 0.0 2:24.65 stress
29 root 20 0 7312 128 32 R 75.0 0.0 2:24.07 stress
30 root 20 0 56188 2044 1440 R 0.3 0.0 0:00.10 top
1 root 20 0 11828 1656 1380 S 0.0 0.0 0:00.06 bash
14 root 20 0 11828 1884 1484 S 0.0 0.0 0:00.05 bash
27 root 20 0 7312 424 344 S 0.0 0.0 0:00.00 stress
#可以觀察到cpu的使用率加起來(lái)在150%左右
或者新重新打開一個(gè)窗口,使用docker stats container_id 查看。
[root@k8s-m1 ~]# docker stats 333
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
333169612fe9 ecstatic_poincare 148.90% 1.512MiB / 7.636GiB 0.02% 0B / 0B 0B / 0B 6
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
333169612fe9 ecstatic_poincare 154.73% 1.512MiB / 7.636GiB 0.02% 0B / 0B 0B / 0B 6
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
333169612fe9 ecstatic_poincare 154.73% 1.512MiB / 7.636GiB 0.02% 0B / 0B 0B / 0B 6
#看起來(lái)更直觀,大概就在150%左右
#直接在宿主機(jī)執(zhí)行top
[root@k8s-m1 ~]# top
top - 15:36:10 up 1 day, 4:38, 2 users, load average: 1.87, 1.89, 1.99
Tasks: 280 total, 3 running, 277 sleeping, 0 stopped, 0 zombie
%Cpu(s): 9.9 us, 0.9 sy, 0.0 ni, 88.4 id, 0.6 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 8007188 total, 803368 free, 1928904 used, 5274916 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 5395364 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31017 root 20 0 7312 128 32 R 77.2 0.0 6:27.71 stress
31018 root 20 0 7312 128 32 R 76.9 0.0 6:24.28 stress
1942 root 20 0 1442696 669188 43032 S 28.9 8.4 29:46.87 kube-apiserver
5680 root 20 0 10.4g 251560 36268 S 16.9 3.1 107:35.39 etcd
容器 CPU 的負(fù)載為 150%,它的含義為單個(gè) CPU 負(fù)載的1.5倍。我們也可以把它理解為有1.5個(gè) CPU 的100%時(shí)間都在為它工作。我們通過(guò) top 命令也看到主機(jī) CPU 的真實(shí)負(fù)載情況,總共16核的服務(wù)器,我們?cè)O(shè)置使用了1.5個(gè)CPU,大概就在10%左右,所以id 大概就在90%左右(上面顯示的88.4%)。后面150%也是大致平均分在兩個(gè)cpu上,而不是一個(gè)100%+另一個(gè)50%。看來(lái)所以對(duì)于進(jìn)程來(lái)說(shuō)是沒(méi)有 CPU個(gè)數(shù)這一概念的,內(nèi)核只能通過(guò)進(jìn)程消耗的 CPU 時(shí)間片來(lái)統(tǒng)計(jì)出進(jìn)程占用 CPU 的百分比。這也是我們看到的各種工具中都使用百分比來(lái)說(shuō)明CPU 使用率的原因。
可以參考docker 的官方文檔中https://docs.docker.com/config/containers/resource_constraints/#configure-the-default-cfs-scheduler
是如何解釋 --cpus 選項(xiàng)的:Specify how much of the available CPU resources a container can use.
可以看到官方用的是 “how much”,不可數(shù)的,而不是how many。并且 --cpus 選項(xiàng)支持設(shè)為小數(shù)也從側(cè)面說(shuō)明了對(duì) CPU 的計(jì)量只能是百分比。
那么我們?yōu)槭裁催€要使用“CPU 個(gè)數(shù)”這種說(shuō)法呢?當(dāng)然是為了更好理解。有興趣的同學(xué)可以讀讀 --cpus 選項(xiàng)的由來(lái),看看人家對(duì)CPU 個(gè)數(shù)解釋。
使用 --cpu-period 即可設(shè)置調(diào)度周期,使用 --cpu-quota 即可設(shè)置在每個(gè)周期內(nèi)容器能使用的CPU時(shí)間。兩者可以配合使用。
–cpu-period 的數(shù)值范圍是 1000 ~1000000 (單位微秒)。默認(rèn)值為100000微秒,即100ms。而容器的–cpu-quota(CPU配額)必須不小于1ms,即 --cpu-quota 的值必須 >= 1000。默認(rèn)情況下–cpu-quota的值為-1,表示不進(jìn)行控制。
3、限制CPU相對(duì)份額(按比例共享)
由于我的服務(wù)器CPU個(gè)數(shù)比較多,不綁定cpu的話看不到效果,所以我單獨(dú)指定容器都使用某個(gè)CPU。
使用–cpu-shares,分配兩個(gè)容器使用CPU資源占用權(quán)重為1:2
默認(rèn)情況下,每個(gè)Docker容器的CPU份額都是1024,單獨(dú)一個(gè)容器的份額是沒(méi)有意義的,只有在同時(shí)運(yùn)行多個(gè)容器時(shí)且需要使用CPU資源時(shí),并且CUP資源比較緊缺的時(shí)候,容器CPU的加權(quán)效果才能體現(xiàn)出來(lái)。比如下面的兩個(gè)容器–cpu-shares比是1:2,在CPU進(jìn)行時(shí)間片分配時(shí),后者比前者多一倍的機(jī)會(huì)獲得CPU的時(shí)間片,但是分配的結(jié)果取決于當(dāng)時(shí)主機(jī)和其他容器的運(yùn)行狀態(tài)。實(shí)際上也無(wú)法保證該容器一定獲得相應(yīng)的CPU時(shí)間片,因?yàn)槿羰莄pu2沒(méi)有進(jìn)程需要大量使用CPU,那么cpu1也會(huì)獲取比cpu2更多的CPU時(shí)間片。
在極端情況下,例如主機(jī)上只運(yùn)行了一個(gè)容器,即使它的CPU份額很小,它也是可以獨(dú)占整個(gè)主機(jī)的CPU資源的,因?yàn)闆](méi)有其他容器需要共享CPU。Cgroups只有在容器分配的資源緊缺時(shí),即在需要對(duì)容器使用的資源進(jìn)行限制時(shí),才會(huì)生效,因此,無(wú)法根據(jù)某個(gè)容器的CPU份額來(lái)確定有多少CPU資源分給給它。
#先運(yùn)行一個(gè)容器,綁定到第一個(gè)CPU,份額為默認(rèn)的1024
[root@k8s-m1 ~]# docker run -it --name cpu1 --cpuset-cpus 0 --cpu-shares 1024 centos:stress /bin/bash
[root@0db26ce9c22a /]# stress -c 2 &
[1] 15
[root@0db26ce9c22a /]# stress: info: [15] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
[root@0db26ce9c22a /]# top
top - 01:09:23 up 1 day, 22:11, 0 users, load average: 4.26, 3.29, 1.80
Tasks: 5 total, 3 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.2 us, 0.7 sy, 0.0 ni, 91.4 id, 0.6 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 8007188 total, 293740 free, 2166228 used, 5547220 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 5259252 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16 root 20 0 7312 96 0 R 16.6 0.0 0:22.88 stress
17 root 20 0 7312 96 0 R 16.6 0.0 0:22.88 stress
1 root 20 0 11828 1932 1520 S 0.0 0.0 0:00.05 bash
15 root 20 0 7312 424 344 S 0.0 0.0 0:00.00 stress
18 root 20 0 56208 2012 1440 R 0.0 0.0 0:00.07 top
##第二個(gè)容器,也綁定到第一個(gè)CPU,份額設(shè)置為2028
[root@k8s-m1 cpu]# docker run -it --name cpu2 --cpuset-cpus 0 --cpu-shares 2048 centos:stress /bin/bash
[root@d33d2add52a9 /]#
[root@d33d2add52a9 /]#
[root@d33d2add52a9 /]#
[root@d33d2add52a9 /]# stress -c 2 &
[1] 14
[root@d33d2add52a9 /]# stress: info: [14] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
[root@d33d2add52a9 /]# top
top - 01:07:55 up 1 day, 22:10, 0 users, load average: 4.04, 2.92, 1.54
Tasks: 5 total, 3 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.4 us, 0.7 sy, 0.0 ni, 90.7 id, 1.2 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 8007188 total, 313908 free, 2146436 used, 5546844 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 5279044 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15 root 20 0 7312 96 0 R 33.2 0.0 0:50.25 stress
16 root 20 0 7312 96 0 R 33.2 0.0 0:50.26 stress
1 root 20 0 11828 1936 1524 S 0.0 0.0 0:00.06 bash
14 root 20 0 7312 424 344 S 0.0 0.0 0:00.00 stress
18 root 20 0 56208 2012 1440 R 0.0 0.0 0:00.01 top
通過(guò)上面兩個(gè)容器對(duì)第一個(gè)CPU的占用情況可以發(fā)現(xiàn)大致比例就為1:2 。滿足我們的預(yù)期。
4、綁定容器使用指定的CPU(如上)
四、內(nèi)存資源配額
1、限制容器可以使用的最大內(nèi)存
[root@k8s-m1 ~]# docker run -itd --name m12 -m 512m centos:7 /bin/bash
07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3
[root@k8s-m1 system.slice]# docker stats 07
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
07d168a1ef04 m12 0.00% 388KiB / 512MiB 0.07% 0B / 0B 0B / 0B 1
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
07d168a1ef04 m12 0.00% 388KiB / 512MiB 0.07% 0B / 0B 0B / 0B 1
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
對(duì)應(yīng)的cgroup配置文件查找,這些目錄下就是當(dāng)前容器的具體配置,可自行查看。
[root@k8s-m1 cgroup]# pwd
/sys/fs/cgroup
[root@k8s-m1 cgroup]# find . -name *07d168a1*
./perf_event/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./freezer/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./memory/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./pids/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./blkio/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./cpuset/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./devices/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./hugetlb/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./cpu,cpuacct/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./net_cls,net_prio/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
./systemd/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope
[root@k8s-m1 cgroup]# cat ./memory/system.slice/docker-07d168a1ef044e097e87d412e74d1544009f7b393455a6b319bfd93bfd5612b3.scope/memory.limit_in_bytes
536870912
##536870912即為512M(512M=512*1024K=512*1024*1024B)
2、 限制容器可以使用的最大swap
需要注意以下幾點(diǎn):
- –memory-swap需要與 --memory(或-m)一起使用的
- 正常情況下, --memory-swap 的值包含容器可用內(nèi)存和可用swap
- 所以 -m 200m --memory-swap=1g 的含義為:容器可以使用200M 的物理內(nèi)存,并且可以使用800M (1G - 300M)的swap ?
–memory-swap設(shè)置為0或者不設(shè)置,則容器可以使用的 swap 大小為 -m 值的兩倍。而如果 --memory-swap 的值和 -m 值相同,則容器不能使用swap。而如果 --memory-swap 值為 -1,它表示容器程序使用的內(nèi)存受限,而可以使用的swap空間使用不受限制(宿主機(jī)有多少swap 容器就可以使用多少) - swap分區(qū)的配置需要宿主支持swap
五、磁盤IO的資源配額
1、對(duì)讀寫權(quán)重進(jìn)行限制
默認(rèn)情況下,所有容器能平等地讀寫磁盤,可以通過(guò)設(shè)置–blkio-weight參數(shù)來(lái)改變?nèi)萜?block IO的優(yōu)先級(jí)。–blkio-weight 與–cpu-shares類似,設(shè)置的是相對(duì)權(quán)重值,默認(rèn)為500
[root@1623b417c1b0 /]# stressrun -it --name blkio1 --blkio-weight 500 centos:stress
#容器內(nèi)對(duì)應(yīng)的配置文件,對(duì)應(yīng)在宿主機(jī)上的配置文件通過(guò)上面的方法查看。
[root@83fca2f7ddef /]# cat /sys/fs/cgroup/blkio/blkio.weight
500
[root@83fca2f7ddef /]# stress --hdd 2 --hdd-bytes 1G --backoff 2000000
stress: info: [14] dispatching hogs: 0 cpu, 0 io, 0 vm, 2 hdd
#開啟新的窗口
[root@k8s-m1 ~]# docker run -it --name blkio2 --blkio-weight 1000 centos:stress
[root@1dcf72b08f88 /]# stress --hdd 2 --hdd-bytes 1G --backoff 2000000
stress: info: [14] dispatching hogs: 0 cpu, 0 io, 0 vm, 2 hdd
#開啟另一個(gè)窗口
[root@k8s-m1 cpu]# docker stats 83 1dc
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
83fca2f7ddef blkio1 0.03% 7.184MiB / 7.636GiB 0.09% 0B / 0B 1.98MB / 0B 4
1dcf72b08f88 blkio2 87.41% 7.965MiB / 7.636GiB 0.10% 0B / 0B 3.65MB / 0B 4
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
通過(guò)block I/O可以發(fā)現(xiàn)速度比例大概就為1:2
2、具體對(duì)讀寫速度的限制
參數(shù) | 作用 |
---|---|
–device-read-bps | byte per second,限制某個(gè)設(shè)備每秒讀的數(shù)據(jù)量 |
–device-write-bps | byte per second, 限制某個(gè)設(shè)備每秒寫的數(shù)據(jù)量 |
–device-read-iops | io per second,限制某個(gè)設(shè)備每秒讀IO的次數(shù) |
–device-write-iops | io per second,限制某個(gè)設(shè)備每秒寫IO的次數(shù) |
下面的示例是限制容器寫/dev/sda的速率為5MB/s,注意此次的/dev/sda是宿主機(jī)上的磁盤。具體寫什么看你服務(wù)器的磁盤規(guī)劃。
作為對(duì)比,先運(yùn)行一個(gè)沒(méi)有速度限制的容器:
[root@k8s-m1 cgroup]# docker run -it --name io1 centos:7 /bin/bash
[root@6be94b7b1ab5 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=3
3+0 records in
3+0 records out
31457280 bytes (31 MB) copied, 0.035242 s, 893 MB/s
#添加oflag參數(shù)以規(guī)避掉文件系統(tǒng)cache。可以看到生產(chǎn)一個(gè)30M的文件花了0.035242 s,速度很快。
[root@k8s-m1 cgrou docker run -it --name io2 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
[root@b84241970c32 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=3 oflag=direct
3+0 records in
3+0 records out
31457280 bytes (31 MB) copied, 30.0261 s, 1.0 MB/s
[root@b84241970c32 /]#
重新運(yùn)行一個(gè)速度限制為1M的容器,生成一個(gè)30M的文件化花了30.0261 s,速度大概就是1M/s。
通過(guò)上面的對(duì)比,發(fā)現(xiàn)設(shè)置的參數(shù)生效,其他參數(shù)請(qǐng)?jiān)诰唧w場(chǎng)景中測(cè)試使用。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-600747.html
更多關(guān)于docker容器和運(yùn)維方面的相關(guān)知識(shí),請(qǐng)前往博客主頁(yè)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-600747.html
到了這里,關(guān)于十七、Docker之Cgroup資源配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!