最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker中Cgroup資源配置的實現(xiàn)

 更新時間:2023年09月21日 11:44:58   作者:margu_168  
Cgroup不僅可以限制被namespace?隔離起來的資源,還可以為資源設(shè)置權(quán)重、計算使用量、操控進程啟停等,本文主要介紹了Docker中Cgroup資源配置的實現(xiàn),感興趣的可以了解一下

其實在日常的工作中,我們一般都沒有對docker容器進行資源限制,也就是默認(rèn)情況下,可以使用宿主機的所有資源。但是如果你運行的服務(wù)有問題,就有可能對宿主機和宿主機上的其他業(yè)務(wù)造成影響,這還是有一定的風(fēng)險。那么本文會給大家介紹一下如何對容器進行資源配置管理。

一、Cgroup資源配置簡介

Cgroup,全稱Control Groups,是一個非常強大的linux內(nèi)核工具,它不僅可以限制被namespace 隔離起來的資源,還可以為資源設(shè)置權(quán)重、計算使用量、操控進程啟停等等。Docker通過Cgroup 來控制容器使用資源配額,包括CPU、內(nèi)存、磁盤三大方面,基本覆蓋了對常見的資源配額和使用量控制管理。

Cgroup是Linux 內(nèi)核提供的一種可以限制、記錄、隔離進程組所使用的物理資源(如CPU、內(nèi)存、磁盤lO等等)的機制,被LXC、Docker等很多項目用于實現(xiàn)進程資源控制。
Cgroup本身是提供將進程進行分組化管理的功能和接口 的基礎(chǔ)結(jié)構(gòu)。I/O或內(nèi)存的分配控制等具體的資潭管理是通過內(nèi)核功能來實現(xiàn)的。這些具體的資源管理功能稱為Cgroup子系統(tǒng),目前有如下幾大子系統(tǒng):

Cgroup子系統(tǒng)作用
blkio用于對塊設(shè)備的輸入輸出進行控制。例如:磁盤,光盤等。
CPU使用調(diào)度程序為Cgroup任務(wù)提供CPU的訪問。
cpuacct用于產(chǎn)生Cgroup任務(wù)的CPU資源報告。
cpuset如果是多核心的CPU,這個子系統(tǒng)用于為Cgroup任務(wù)分配單獨的CPU和內(nèi)存。
devices用于允許或拒絕Cgroup任務(wù)對設(shè)備的訪問。
freezer用于暫停和恢復(fù)Cgroup任務(wù)。
memory用于設(shè)置每個Cgroup的內(nèi)存限制以及產(chǎn)生內(nèi)存資源報告。
net_cls用于標(biāo)記每個網(wǎng)絡(luò)包以供Cgroup方便使用
ns用于命名空間子系統(tǒng)。
perf_event增加了對每個 group 的監(jiān)測跟蹤的能力,用于監(jiān)測屬于某個特定的group的所有線程以及運行在特定CPU上的線程。

二、CPU時間片的概念

時間片可以理解為CPU分配給各個程序的運行時間,每個線程被分配一個時間段,稱作它的時間片,即該進程允許運行的時間,使各個程序從表面上看是同時進行的。如果在時間片結(jié)束時進程還在運行,則CPU將被剝奪并分配給另一個進程。如果進程在時間片結(jié)束前阻塞或結(jié)束,則CPU當(dāng)即進行切換。而不會造成CPU資源浪費。

在宏觀上:我們可以同時打開多個應(yīng)用程序,每個程序并行不悖,同時運行。但在微觀上:假如只有一個CPU,一次只能處理要求的一部分程序,那么如何分配,一種方法就是引入時間片,每個程序在某個時間片段輪流執(zhí)行。

測試使用環(huán)境:centos7,docker-ce-19.03.15,2個物理CPU,總共16核

三、CPU的資源配額

1、資源準(zhǔn)備

先制作一個有stress命令的鏡像,方便進行壓測。并查看當(dāng)前版本的docker支持的關(guān)于cpu方便的配置。Linux通過CFS (Completely Fair Scheduler, 完全公平調(diào)度器)來調(diào)度各個進程對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)

解析:

選項描述
–cpu-period指定CPU CFS調(diào)度程序周期,該周期與–cpu-quota一起使用。默認(rèn)為100000微妙,以微秒表示。大多數(shù)用戶不會從默認(rèn)值更改此設(shè)置。如果您使用Docker 1.13或更高版本,建議使用–cpus。
–cpu-quota在容器上添加CPU CFS配額。每個–cpu-period允許CPU訪問的容器數(shù)微秒數(shù)。換句話說,cpu-quota / cpu-period。如果您使用Docker 1.13或更高版本,請改用–cpus。
–cpu-rt-period指定CPU實時周期(微秒)
–cpu-rt-runtime指定CPU實時周期(微秒),CPU動態(tài)調(diào)度是內(nèi)核的高級功能,一般不需要更改這些值,如果配置不當(dāng),可能使主機系統(tǒng)將變得不穩(wěn)定或者無法使用。該功能默認(rèn)未開啟,具體怎么使用請自行查閱。
-c,–cpu-shares將此標(biāo)志設(shè)置為大于或小于默認(rèn)值1024的值,以增加或減少容器的重量,并使其能夠訪問主機CPU周期的更大或更小比例。這僅在CPU周期受到限制時才會執(zhí)行。當(dāng)大量CPU周期可用時,所有容器都使用盡可能多的CPU。這樣,這是一個軟限制。–cpu-shares不會阻止容器在群集模式下進行調(diào)度。它優(yōu)先考慮容器CPU資源的可用CPU周期。它不保證或保留任何特定的CPU訪問權(quán)限。
–cpus指定容器可以使用多少可用CPU資源。例如,如果主機有兩個CPU,并且您設(shè)置了–cpus =“1.5”,那么該容器將保證最多可以訪問一個半的CPU。這相當(dāng)于設(shè)置–cpu-period =“100000”和–cpu-quota =“150000”。在Docker 1.13和更高版本中可用。
–cpuset-cpus限制容器可以使用的特定CPU或核心。如果有多個CPU,則容器可以使用的逗號分隔列表或連字符分隔的CPU范圍。第一個CPU編號為0.設(shè)置為0-3(表示使用第一,第二,第三和第四個CPU)或1,3(表示使用第二個和第四個CPU)。
–cpuset-mems通過cpuset-mems設(shè)置NUMA架構(gòu)的CPU的內(nèi)存使用。很少使用

2、限制可用的cpu個數(shù)

1)通過–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的使用率加起來在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
補充:可以看到,如果我們?nèi)绻业奖镜氐年P(guān)于cpu配置的文件,是可以實現(xiàn)手動修改文件對CPU進行限制
本地對應(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,不能通過vi打開修改。

2)通過–cpu限制

在 docker 1.13 及更高的版本上,能夠更方便限制容器可以使用的宿主機 CPU的個數(shù)。只需要通過 --cpus 選項可用很簡單設(shè)定容器可以使用的 CPU 個數(shù),并且可以設(shè)定如1.5 之類的小數(shù)。

[root@k8s-m1 docker]# docker run -it --cpus=1.5  centos:stress  /bin/bash
##-c 用于指定進程數(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的使用率加起來在150%左右

或者新重新打開一個窗口,使用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
#看起來更直觀,大概就在150%左右
#直接在宿主機執(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%,它的含義為單個 CPU 負(fù)載的1.5倍。我們也可以把它理解為有1.5個 CPU 的100%時間都在為它工作。我們通過 top 命令也看到主機 CPU 的真實負(fù)載情況,總共16核的服務(wù)器,我們設(shè)置使用了1.5個CPU,大概就在10%左右,所以id 大概就在90%左右(上面顯示的88.4%)。后面150%也是大致平均分在兩個cpu上,而不是一個100%+另一個50%??磥硭詫τ谶M程來說是沒有 CPU個數(shù)這一概念的,內(nèi)核只能通過進程消耗的 CPU 時間片來統(tǒng)計出進程占用 CPU 的百分比。這也是我們看到的各種工具中都使用百分比來說明CPU 使用率的原因。

可以參考docker 的官方文檔中https://docs.docker.com/config/containers/resource_constraints/#configure-the-default-cfs-scheduler是如何解釋 --cpus 選項的:
Specify how much of the available CPU resources a container can use.

可以看到官方用的是 “how much”,不可數(shù)的,而不是how many。并且 --cpus 選項支持設(shè)為小數(shù)也從側(cè)面說明了對 CPU 的計量只能是百分比。
那么我們?yōu)槭裁催€要使用“CPU 個數(shù)”這種說法呢?當(dāng)然是為了更好理解。有興趣的同學(xué)可以讀讀 --cpus 選項的由來,看看人家對CPU 個數(shù)解釋。

使用 --cpu-period 即可設(shè)置調(diào)度周期,使用 --cpu-quota 即可設(shè)置在每個周期內(nèi)容器能使用的CPU時間。兩者可以配合使用。
–cpu-period 的數(shù)值范圍是 1000 ~1000000 (單位微秒)。默認(rèn)值為100000微秒,即100ms。而容器的–cpu-quota(CPU配額)必須不小于1ms,即 --cpu-quota 的值必須 >= 1000。默認(rèn)情況下–cpu-quota的值為-1,表示不進行控制。

3、限制CPU相對份額(按比例共享)

由于我的服務(wù)器CPU個數(shù)比較多,不綁定cpu的話看不到效果,所以我單獨指定容器都使用某個CPU。

使用–cpu-shares,分配兩個容器使用CPU資源占用權(quán)重為1:2

默認(rèn)情況下,每個Docker容器的CPU份額都是1024,單獨一個容器的份額是沒有意義的,只有在同時運行多個容器時且需要使用CPU資源時,并且CUP資源比較緊缺的時候,容器CPU的加權(quán)效果才能體現(xiàn)出來。比如下面的兩個容器–cpu-shares比是1:2,在CPU進行時間片分配時,后者比前者多一倍的機會獲得CPU的時間片,但是分配的結(jié)果取決于當(dāng)時主機和其他容器的運行狀態(tài)。實際上也無法保證該容器一定獲得相應(yīng)的CPU時間片,因為若是cpu2沒有進程需要大量使用CPU,那么cpu1也會獲取比cpu2更多的CPU時間片。

在極端情況下,例如主機上只運行了一個容器,即使它的CPU份額很小,它也是可以獨占整個主機的CPU資源的,因為沒有其他容器需要共享CPU。Cgroups只有在容器分配的資源緊缺時,即在需要對容器使用的資源進行限制時,才會生效,因此,無法根據(jù)某個容器的CPU份額來確定有多少CPU資源分給給它。

#先運行一個容器,綁定到第一個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                                                                   
##第二個容器,也綁定到第一個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

通過上面兩個容器對第一個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
對應(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

需要注意以下幾點:

  • –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空間使用不受限制(宿主機有多少swap 容器就可以使用多少)
  • swap分區(qū)的配置需要宿主支持swap

五、磁盤IO的資源配額

1、對讀寫權(quán)重進行限制

默認(rèn)情況下,所有容器能平等地讀寫磁盤,可以通過設(shè)置–blkio-weight參數(shù)來改變?nèi)萜?block IO的優(yōu)先級。–blkio-weight 與–cpu-shares類似,設(shè)置的是相對權(quán)重值,默認(rèn)為500

[root@1623b417c1b0 /]# stressrun -it --name blkio1  --blkio-weight 500 centos:stress 
#容器內(nèi)對應(yīng)的配置文件,對應(yīng)在宿主機上的配置文件通過上面的方法查看。
[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
#開啟另一個窗口
[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
通過block I/O可以發(fā)現(xiàn)速度比例大概就為1:2

2、具體對讀寫速度的限制

參數(shù)作用
–device-read-bpsbyte per second,限制某個設(shè)備每秒讀的數(shù)據(jù)量
–device-write-bpsbyte per second, 限制某個設(shè)備每秒寫的數(shù)據(jù)量
–device-read-iopsio per second,限制某個設(shè)備每秒讀IO的次數(shù)
–device-write-iopsio per second,限制某個設(shè)備每秒寫IO的次數(shù)

下面的示例是限制容器寫/dev/sda的速率為5MB/s,注意此次的/dev/sda是宿主機上的磁盤。具體寫什么看你服務(wù)器的磁盤規(guī)劃。
作為對比,先運行一個沒有速度限制的容器:

[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??梢钥吹缴a(chǎn)一個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 /]# 
重新運行一個速度限制為1M的容器,生成一個30M的文件化花了30.0261 s,速度大概就是1M/s。

通過上面的對比,發(fā)現(xiàn)設(shè)置的參數(shù)生效,其他參數(shù)請在具體場景中測試使用。

到此這篇關(guān)于Docker中Cgroup資源配置的實現(xiàn)的文章就介紹到這了,更多相關(guān)Docker Cgroup資源配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用jib打包docker鏡像實戰(zhàn)

    使用jib打包docker鏡像實戰(zhàn)

    這篇文章主要介紹了使用jib打包docker鏡像實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • docker常用命令總結(jié)(推薦)

    docker常用命令總結(jié)(推薦)

    這篇文章主要介紹了docker常用命令總結(jié)(推薦),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • docker中使用opwrt詳解

    docker中使用opwrt詳解

    本文主要介紹了在Docker中配置OpenWRT的詳細(xì)步驟,首先需要配置Docker網(wǎng)絡(luò),包括開啟網(wǎng)卡混雜模式和創(chuàng)建Docker的虛擬網(wǎng)絡(luò);然后需要準(zhǔn)備OpenWRT鏡像,包括獲取相應(yīng)鏡像和解壓導(dǎo)入Docker網(wǎng)絡(luò);接著生成并開啟配置好的容器,修改容器內(nèi)的網(wǎng)絡(luò)設(shè)置
    2024-10-10
  • Docker deamon.json文件修改之后重啟不生效的問題解決

    Docker deamon.json文件修改之后重啟不生效的問題解決

    修改了Docker的配置文件daemon.json,但重啟Docker服務(wù)后發(fā)現(xiàn)配置沒有生效,下面就來解決這個問題,感興趣的可以了解一下
    2025-05-05
  • Docker之蘋果Mac安裝Docker的兩種方式小結(jié)

    Docker之蘋果Mac安裝Docker的兩種方式小結(jié)

    這篇文章主要介紹了Docker之蘋果Mac安裝Docker的兩種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 樹莓派安裝Docker的方法步驟

    樹莓派安裝Docker的方法步驟

    這篇文章主要介紹了樹莓派安裝Docker的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • docker-compose部署gitlab的詳細(xì)過程

    docker-compose部署gitlab的詳細(xì)過程

    文章介紹了GitLab作為開源版本控制系統(tǒng)的核心功能(代碼托管、CI/CD、項目管理等)及適用場景,詳細(xì)說明了使用docker-compose部署GitLab 18.2.4-ce的步驟,并指導(dǎo)配置Nginx反向代理實現(xiàn)便捷訪問,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • 從編寫到管理詳解Docker鏡像與Dockerfile基礎(chǔ)指南

    從編寫到管理詳解Docker鏡像與Dockerfile基礎(chǔ)指南

    Docker?容器化已成為現(xiàn)代應(yīng)用交付的事實標(biāo)準(zhǔn),而鏡像則是容器的源代碼,這篇文章主要介紹了Docker鏡像操作的核心技巧與常用指令,希望對大家有所幫助
    2026-05-05
  • docker拷貝文件到主機及導(dǎo)入導(dǎo)出容器及運行導(dǎo)出容器方式

    docker拷貝文件到主機及導(dǎo)入導(dǎo)出容器及運行導(dǎo)出容器方式

    這篇文章主要介紹了docker拷貝文件到主機及導(dǎo)入導(dǎo)出容器及運行導(dǎo)出容器方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • docker配置國內(nèi)源全過程

    docker配置國內(nèi)源全過程

    這篇文章主要介紹了docker配置國內(nèi)源全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

大余县| 定陶县| 洛隆县| 夏邑县| 客服| 太仆寺旗| 遂平县| 昆山市| 阳东县| 安顺市| 丁青县| 浙江省| 和顺县| 阿合奇县| 阜新市| 澎湖县| 沁源县| 客服| 临夏县| 县级市| 清河县| 连云港市| 本溪| 中江县| 米脂县| 东城区| 南宁市| 克东县| 西和县| 荔浦县| 东兴市| 九龙县| 孝义市| 济南市| 兴文县| 达拉特旗| 永仁县| 临城县| 饶阳县| 新宁县| 大庆市|