国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Docker 運行時資源限制

設置容器磁盤大小限制為20G,這個需要在docker的配置文件里操作,比如ubuntu的應該是/etc/default/docker里,下面是我centos的docker配置,可以參考一下

[root@ip-10-10-125-7 ~]# cat /etc/sysconfig/docker-storageDOCKER_STORAGE_OPTIONS="--storage-opt dm.loopdatasize=2000G --storage-opt dm.loopmetadatasize=10G --storage-opt dm.fs=ext4 --storage-opt dm.basesize=20G"

Docker 運行時資源限制

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

內存限制

概述

Docker 提供的內存限制功能有以下幾點:

  • 容器能使用的內存和交換分區(qū)大小。
  • 容器的核心內存大小。
  • 容器虛擬內存的交換行為。
  • 容器內存的軟性限制。
  • 是否殺死占用過多內存的容器。
  • 容器被殺死的優(yōu)先級

一般情況下,達到內存限制的容器過段時間后就會被系統(tǒng)殺死。

內存限制相關的參數(shù)

執(zhí)行docker run命令時能使用的和內存限制相關的所有選項如下。

選項描述
-m,--memory內存限制,格式是數(shù)字加單位,單位可以為 b,k,m,g。最小為 4M
--memory-swap內存+交換分區(qū)大小總限制。格式同上。必須必-m設置的大
--memory-reservation內存的軟性限制。格式同上
--oom-kill-disable是否阻止 OOM killer 殺死容器,默認沒設置
--oom-score-adj容器被 OOM killer 殺死的優(yōu)先級,范圍是[-1000, 1000],默認為 0
--memory-swappiness用于設置容器的虛擬內存控制行為。值為 0~100 之間的整數(shù)
--kernel-memory核心內存限制。格式同上,最小為 4M

用戶內存限制

用戶內存限制就是對容器能使用的內存和交換分區(qū)的大小作出限制。使用時要遵循兩條直觀的規(guī)則:-m,--memory選項的參數(shù)最小為 4 M。--memory-swap不是交換分區(qū),而是內存加交換分區(qū)的總大小,所以--memory-swap必須比-m,--memory大。在這兩條規(guī)則下,一般有四種設置方式。

你可能在進行內存限制的實驗時發(fā)現(xiàn)docker run命令報錯:WARNING: Your kernel does not support swap limit capabilities, memory limited without swap.

這是因為宿主機內核的相關功能沒有打開。按照下面的設置就行。

step 1:編輯/etc/default/grub文件,將GRUB_CMDLINE_LINUX一行改為GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

step 2:更新 GRUB,即執(zhí)行$ sudo update-grub

step 3: 重啟系統(tǒng)。

1. 不設置

如果不設置-m,--memory--memory-swap,容器默認可以用完宿舍機的所有內存和 swap 分區(qū)。不過注意,如果容器占用宿主機的所有內存和 swap 分區(qū)超過一段時間后,會被宿主機系統(tǒng)殺死(如果沒有設置--00m-kill-disable=true的話)。

2. 設置-m,--memory,不設置--memory-swap

-m--memory設置一個不小于 4M 的值,假設為 a,不設置--memory-swap,或將--memory-swap設置為 0。這種情況下,容器能使用的內存大小為 a,能使用的交換分區(qū)大小也為 a。因為 Docker 默認容器交換分區(qū)的大小和內存相同。

如果在容器中運行一個一直不停申請內存的程序,你會觀察到該程序最終能占用的內存大小為 2a。

比如$ docker run -m 1G ubuntu:16.04,該容器能使用的內存大小為 1G,能使用的 swap 分區(qū)大小也為 1G。容器內的進程能申請到的總內存大小為 2G。

3. 設置-m,--memory=a,--memory-swap=b,且b > a

-m設置一個參數(shù) a,給--memory-swap設置一個參數(shù) b。a 時容器能使用的內存大小,b是容器能使用的 內存大小 + swap 分區(qū)大小。所以 b 必須大于 a。b -a 即為容器能使用的 swap 分區(qū)大小。

比如$ docker run -m 1G --memory-swap 3G ubuntu:16.04,該容器能使用的內存大小為 1G,能使用的 swap 分區(qū)大小為 2G。容器內的進程能申請到的總內存大小為 3G。

4. 設置-m,--memory=a,--memory-swap=-1

-m參數(shù)設置一個正常值,而給--memory-swap設置成 -1。這種情況表示限制容器能使用的內存大小為 a,而不限制容器能使用的 swap 分區(qū)大小。

這時候,容器內進程能申請到的內存大小為 a + 宿主機的 swap 大小。

Memory reservation

這種 memory reservation 機制不知道怎么翻譯比較形象。Memory reservation 是一種軟性限制,用于節(jié)制容器內存使用。給--memory-reservation設置一個比-m小的值后,雖然容器最多可以使用-m使用的內存大小,但在宿主機內存資源緊張時,在系統(tǒng)的下次內存回收時,系統(tǒng)會回收容器的部分內存頁,強迫容器的內存占用回到--memory-reservation設置的值大小。

沒有設置時(默認情況下)--memory-reservation的值和-m的限定的值相同。將它設置為 0 會設置的比-m的參數(shù)大 等同于沒有設置。

Memory reservation 是一種軟性機制,它不保證任何時刻容器使用的內存不會超過--memory-reservation限定的值,它只是確保容器不會長時間占用超過--memory-reservation限制的內存大小。

例如:

$ docker run -it -m 500M --memory-reservation 200M ubuntu:16.04 /bin/bash
  • 1

如果容器使用了大于 200M 但小于 500M 內存時,下次系統(tǒng)的內存回收會嘗試將容器的內存鎖緊到 200M 以下。

例如:

$ docker run -it --memory-reservation 1G ubuntu:16.04 /bin/bash
  • 1

容器可以使用盡可能多的內存。--memory-reservation確保容器不會長時間占用太多內存。

OOM killer

默認情況下,在出現(xiàn) out-of-memory(OOM) 錯誤時,系統(tǒng)會殺死容器內的進程來獲取更多空閑內存。這個殺死進程來節(jié)省內存的進程,我們姑且叫它 OOM killer。我們可以通過設置--oom-kill-disable選項來禁止 OOM killer 殺死容器內進程。但請確保只有在使用了-m/--memory選項時才使用--oom-kill-disable禁用 OOM killer。如果沒有設置-m選項,卻禁用了 OOM-killer,可能會造成出現(xiàn) out-of-memory 錯誤時,系統(tǒng)通過殺死宿主機進程或獲取更改內存。

下面的例子限制了容器的內存為 100M 并禁止了 OOM killer:

$ docker run -it -m 100M --oom-kill-disable ubuntu:16.04 /bin/bash
  • 1

是正確的使用方法。

而下面這個容器沒設置內存限制,卻禁用了 OOM killer 是非常危險的:

$ docker run -it --oom-kill-disable ubuntu:16.04 /bin/bash
  • 1

容器沒用內存限制,可能或導致系統(tǒng)無內存可用,并嘗試時殺死系統(tǒng)進程來獲取更多可用內存。

一般一個容器只有一個進程,這個唯一進程被殺死,容器也就被殺死了。我們可以通過--oom-score-adj選項來設置在系統(tǒng)內存不夠時,容器被殺死的優(yōu)先級。負值更教不可能被殺死,而正值更有可能被殺死。

核心內存

核心內存和用戶內存不同的地方在于核心內存不能被交換出。不能交換出去的特性使得容器可以通過消耗太多內存來堵塞一些系統(tǒng)服務。核心內存包括:

  • stack pages(棧頁面)
  • slab pages
  • socket memory pressure
  • tcp memory pressure

可以通過設置核心內存限制來約束這些內存。例如,每個進程都要消耗一些棧頁面,通過限制核心內存,可以在核心內存使用過多時阻止新進程被創(chuàng)建。

核心內存和用戶內存并不是獨立的,必須在用戶內存限制的上下文中限制核心內存。

假設用戶內存的限制值為 U,核心內存的限制值為 K。有三種可能地限制核心內存的方式:

  1. U != 0,不限制核心內存。這是默認的標準設置方式
  2. K < U,核心內存時用戶內存的子集。這種設置在部署時,每個 cgroup 的內存總量被過度使用。過度使用核心內存限制是絕不推薦的,因為系統(tǒng)還是會用完不能回收的內存。在這種情況下,你可以設置 K,這樣 groups 的總數(shù)就不會超過總內存了。然后,根據(jù)系統(tǒng)服務的質量自有地設置 U。
  3. K > U,因為核心內存的變化也會導致用戶計數(shù)器的變化,容器核心內存和用戶內存都會觸發(fā)回收行為。這種配置可以讓管理員以一種統(tǒng)一的視圖看待內存。對想跟蹤核心內存使用情況的用戶也是有用的。

例如:

$ docker run -it -m 500M --kernel-memory 50M ubuntu:16.04 /bin/bash
  • 1

容器中的進程最多能使用 500M 內存,在這 500M 中,最多只有 50M 核心內存。

$ docker run -it --kernel-memory 50M ubuntu:16.04 /bin/bash
  • 1

沒用設置用戶內存限制,所以容器中的進程可以使用盡可能多的內存,但是最多能使用 50M 核心內存。

Swappiness

默認情況下,容器的內核可以交換出一定比例的匿名頁。--memory-swappiness就是用來設置這個比例的。--memory-swappiness可以設置為從 0 到 100。0 表示關閉匿名頁面交換。100 表示所有的匿名頁都可以交換。默認情況下,如果不適用--memory-swappiness,則該值從父進程繼承而來。

例如:

$ docker run -it --memory-swappiness=0 ubuntu:16.04 /bin/bash
  • 1

--memory-swappiness設置為 0 可以保持容器的工作集,避免交換代理的性能損失。

CPU 限制

概述

Docker 的資源限制和隔離完全基于 Linux cgroups。對 CPU 資源的限制方式也和 cgroups 相同。Docker 提供的 CPU 資源限制選項可以在多核系統(tǒng)上限制容器能利用哪些 vCPU。而對容器最多能使用的 CPU 時間有兩種限制方式:一是有多個 CPU 密集型的容器競爭 CPU 時,設置各個容器能使用的 CPU 時間相對比例。二是以絕對的方式設置容器在每個調度周期內最多能使用的 CPU 時間。

CPU 限制相關參數(shù)

docker run命令和 CPU 限制相關的所有選項如下:

選項描述
--cpuset-cpus=""允許使用的 CPU 集,值可以為 0-3,0,1
-c,--cpu-shares=0CPU 共享權值(相對權重)
cpu-period=0限制 CPU CFS 的周期,范圍從 100ms~1s,即[1000, 1000000]
--cpu-quota=0限制 CPU CFS 配額,必須不小于1ms,即 >= 1000
--cpuset-mems=""允許在上執(zhí)行的內存節(jié)點(MEMs),只對 NUMA 系統(tǒng)有效

其中--cpuset-cpus用于設置容器可以使用的 vCPU 核。-c,--cpu-shares用于設置多個容器競爭 CPU 時,各個容器相對能分配到的 CPU 時間比例。--cpu-period--cpu-quata用于絕對設置容器能使用 CPU 時間。

--cpuset-mems暫用不上,這里不談。

CPU 集

我們可以設置容器可以在哪些 CPU 核上運行。

例如:

$ docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash
  • 1

表示容器中的進程可以在 cpu 1 和 cpu 3 上執(zhí)行。

$ docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash
  • 1

表示容器中的進程可以在 cpu 0、cpu 1 及 cpu 3 上執(zhí)行。

在 NUMA 系統(tǒng)上,我們可以設置容器可以使用的內存節(jié)點。

例如:

$ docker run -it --cpuset-mems="1,3" ubuntu:14.04 /bin/bash
  • 1

表示容器中的進程只能使用內存節(jié)點 1 和 3 上的內存。

$ docker run -it --cpuset-mems="0-2" ubuntu:14.04 /bin/bash
  • 1

表示容器中的進程只能使用內存節(jié)點 0、1、2 上的內存。

CPU 資源的相對限制

默認情況下,所有的容器得到同等比例的 CPU 周期。在有多個容器競爭 CPU 時我們可以設置每個容器能使用的 CPU 時間比例。這個比例叫作共享權值,通過-c--cpu-shares設置。Docker 默認每個容器的權值為 1024。不設置或將其設置為 0,都將使用這個默認值。系統(tǒng)會根據(jù)每個容器的共享權值和所有容器共享權值和比例來給容器分配 CPU 時間。

假設有三個正在運行的容器,這三個容器中的任務都是 CPU 密集型的。第一個容器的 cpu 共享權值是 1024,其它兩個容器的 cpu 共享權值是 512。第一個容器將得到 50% 的 CPU 時間,而其它兩個容器就只能各得到 25% 的 CPU 時間了。如果再添加第四個 cpu 共享值為 1024 的容器,每個容器得到的 CPU 時間將重新計算。第一個容器的CPU 時間變?yōu)?33%,其它容器分得的 CPU 時間分別為 16.5%、16.5%、33%。

必須注意的是,這個比例只有在 CPU 密集型的任務執(zhí)行時才有用。在四核的系統(tǒng)上,假設有四個單進程的容器,它們都能各自使用一個核的 100% CPU 時間,不管它們的 cpu 共享權值是多少。

在多核系統(tǒng)上,CPU 時間權值是在所有 CPU 核上計算的。即使某個容器的 CPU 時間限制少于 100%,它也能使用各個 CPU 核的 100% 時間。

例如,假設有一個不止三核的系統(tǒng)。用-c=512的選項啟動容器{C0},并且該容器只有一個進程,用-c=1024的啟動選項為啟動容器C2,并且該容器有兩個進程。CPU 權值的分布可能是這樣的:

PID    container    CPU CPU share100    {C0}     0   100% of CPU0101    {C1}     1   100% of CPU1102    {C1}     2   100% of CPU2
  • 1
  • 2
  • 3
  • 4

CPU 資源的絕對限制

Linux 通過 CFS(Completely Fair Scheduler,完全公平調度器)來調度各個進程對 CPU 的使用。CFS 默認的調度周期是 100ms。

關于 CFS 的更多信息,參考CFS documentation on bandwidth limiting。

我們可以設置每個容器進程的調度周期,以及在這個周期內各個容器最多能使用多少 CPU 時間。使用--cpu-period即可設置調度周期,使用--cpu-quota即可設置在每個周期內容器能使用的 CPU 時間。兩者一般配合使用。

例如:

$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash
  • 1

將 CFS 調度的周期設為 50000,將容器在每個周期內的 CPU 配額設置為 25000,表示該容器每 50ms 可以得到 50% 的 CPU 運行時間。

$ docker run -it --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04 /bin/bash
  • 1

將容器的 CPU 配額設置為 CFS 周期的兩倍,CPU 使用時間怎么會比周期大呢?其實很好解釋,給容器分配兩個 vCPU 就可以了。該配置表示容器可以在每個周期內使用兩個 vCPU 的 100% 時間。

CFS 周期的有效范圍是 1ms~1s,對應的--cpu-period的數(shù)值范圍是 1000~1000000。而容器的 CPU 配額必須不小于 1ms,即--cpu-quota的值必須 >= 1000??梢钥闯鲞@兩個選項的單位都是 us。

正確的理解“絕對”

注意前面我們用--cpu-quota設置容器在一個調度周期內能使用的 CPU 時間時實際上設置的是一個上限。并不是說容器一定會使用這么長的 CPU 時間。比如,我們先啟動一個容器,將其綁定到 cpu 1 上執(zhí)行。給其--cpu-quota--cpu-period都設置為 50000。

$ docker run --rm --name test01 --cpu-cpus 1 --cpu-quota=50000 --cpu-period=50000 deadloop:busybox-1.25.1-glibc
  • 1

調度周期為 50000,容器在每個周期內最多能使用 50000 cpu 時間。

再用docker stats test01可以觀察到該容器對 CPU 的使用率在100%左右。然后,我們再以同樣的參數(shù)啟動另一個容器。

$ docker run --rm --name test02 --cpu-cpus 1 --cpu-quota=50000 --cpu-period=50000 deadloop:busybox-1.25.1-glibc
  • 1

再用docker stats test01 test02可以觀察到這兩個容器,每個容器對 cpu 的使用率在 50% 左右。說明容器并沒有在每個周期內使用 50000 的 cpu 時間。

使用docker stop test02命令結束第二個容器,再加一個參數(shù)-c 2048啟動它:

$ docker run --rm --name test02 --cpu-cpus 1 --cpu-quota=50000 --cpu-period=50000 -c 2048 deadloop:busybox-1.25.1-glibc
  • 1

再用docker stats test01命令可以觀察到第一個容器的 CPU 使用率在 33% 左右,第二個容器的 CPU 使用率在 66% 左右。因為第二個容器的共享值是 2048,第一個容器的默認共享值是 1024,所以第二個容器在每個周期內能使用的 CPU 時間是第一個容器的兩倍。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Docker 限制容器資源
容器技術之Docker資源限制
Docker: 限制容器可用的內存
Docker容器資源管理,你真的學會了嗎?
docker 容器資源限制
Docker 資源限制之內存
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服