Docker系列09—Docker的系統資源限制及驗證

来源:https://www.cnblogs.com/along21/archive/2019/01/15/10270596.html
-Advertisement-
Play Games

本文收錄在容器技術學習系列文章總目錄 1、限制容器的資源 預設情況下,容器沒有資源限制,可以使用主機內核調度程式允許的儘可能多的給定資源。Docker提供了控制容器可以使用多少記憶體或CPU的方法,設置docker run命令的運行時配置標誌。本篇提供有關何時應設置此類限制的詳細信息以及設置這些限制的 ...


本文收錄在容器技術學習系列文章總目錄

1、限制容器的資源

  預設情況下,容器沒有資源限制,可以使用主機內核調度程式允許的儘可能多的給定資源。Docker提供了控制容器可以使用多少記憶體或CPU的方法,設置docker run命令的運行時配置標誌。本篇提供有關何時應設置此類限制的詳細信息以及設置這些限制的可能含義。

  其中許多功能都要求您的內核支持Linux功能。要檢查支持,可以使用該 docker info命令。如果內核中禁用了某項功能,您可能會在輸出結尾處看到一條警告,如下所示:WARNING: No swap limit support,請參閱操作系統的文檔以啟用它們,瞭解更多

[root@along ~]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 43
Server Version: 17.03.2-ce
Storage Driver: overlay
 Backing Filesystem: xfs
 Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-514.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 976.5 MiB
Name: along
ID: KGWA:GDGT:PTK7:PAX4:A3JZ:LV6N:U5QD:UQCY:AGZV:P32E:V73T:JJHR
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: alongedu
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 docker2:80
 127.0.0.0/8
Registry Mirrors:
 https://registry.docker-cn.com
Live Restore Enabled: false

2、記憶體

2.1 記憶體不足的風險

  重要的是不要讓正在運行的容器占用太多的主機記憶體。在Linux主機上,如果內核檢測到沒有足夠的記憶體來執行重要的系統功能,它會拋出一個OOME 或者 Out Of Memory Exception,並開始查殺進程以釋放記憶體任何進程都會被殺死,包括Docker和其他重要的應用程式。如果錯誤的進程被殺死,這可以有效地降低整個系統。

  Docker嘗試通過調整Docker守護程式上的OOM優先順序來降低這些風險,以便它比系統上的其他進程更不可能被殺死。容器上的OOM優先順序未調整。這使得單個容器被殺死的可能性比Docker守護程式或其他系統進程被殺死的可能性更大。您不應試圖通過--oom-score-adj 在守護程式或容器上手動設置為極端負數或通過設置容器來繞過這些安全措施--oom-kill-disable

  有關Linux內核的OOM管理的更多信息,請參閱記憶體不足管理

  您可以通過以下方式降低OOME導致系統不穩定的風險:

  •  在將應用程式投入生產之前,請執行測試以瞭解應用程式的記憶體要求。
  •  確保您的應用程式僅在具有足夠資源的主機上運行。
  •  限制容器可以使用的記憶體量,如下所述。
  •  Docker主機上配置交換時要小心。交換比記憶體更慢且性能更低,但可以提供緩衝以防止系統記憶體耗盡。
  •  考慮將容器轉換為服務,並使用服務級別約束和節點標簽來確保應用程式僅在具有足夠記憶體的主機上運行

 

2.2 限制容器對記憶體設有的設置

  Docker可以強制執行硬記憶體限制,允許容器使用不超過給定數量的用戶或系統記憶體或軟限制,這允許容器使用儘可能多的記憶體,除非滿足某些條件,例如內核檢測到主機上的低記憶體或爭用。當單獨使用或設置了多個選項時,其中一些選項會產生不同的效果。

  大部分的選項取正整數,跟著一個尾碼bk mg,,表示位元組,千位元組,兆位元組或千兆位元組。

選項

描述

-m or --memory=

容器可以使用的最大記憶體量。如果設置此選項,則允許的最小值為4m

--memory-swap*

允許此容器交換到磁碟的記憶體量。

--memory-swappiness

預設情況下,主機內核可以交換容器使用的匿名頁面的百分比。您可以設置--memory-swappiness 0100之間的值,以調整此百分比。

--memory-reservation

允許您指定小於軟體限制的軟限制--memory,當Docker檢測到主機上的爭用或記憶體不足時,該限制將被激活。如果使用--memory-reservation,則必須將其設置為低於--memory 優先順序。因為它是軟限制,所以不保證容器不超過限制。

--kernel-memory

容器可以使用的最大內核記憶體量。允許的最小值是4m。由於內核記憶體無法換出,因此內核記憶體不足的容器可能會阻塞主機資源,這可能會對主機和其他容器產生副作用。

--oom-kill-disable

預設情況下,如果發生記憶體不足(OOM)錯誤,內核會終止容器中的進程。要更改此行為,請使用該--oom-kill-disable選項。僅在已設置-m/--memory 選項的容器上禁用OOM殺手。如果-m 未設置該標誌,則主機可能會耗盡記憶體,並且內核可能需要終止主機系統的進程才能釋放記憶體。

 

2.2.1 --memory-swap 設置

1)介紹

  --memory-swap 是一個修飾符標誌,只有在--memory 設置時才有意義。使用swap允許容器在容器耗盡可用的所有RAM時將多餘的記憶體需求寫入磁碟。對於經常將記憶體交換到磁碟的應用程式,性能會受到影響。

 

2)它的設置會產生複雜的效果:

  •  如果--memory-swap 設置為正整數,那麼這兩個--memory--memory-swap 必須設置。--memory-swap 表示可以使用的memory and swap,並--memory 控制非交換記憶體(物理記憶體)使用的量。所以如果--memory="300m" --memory-swap="1g",容器可以使用300米的記憶體和700米(1g - 300mswap
  •  如果--memory-swap 設置為0,則忽略該設置,並將該值視為未設置。
  •  如果--memory-swap 設置為與值相同的值--memory,並且--memory設置為正整數,則容器無權訪問swap。請參考下麵阻止容器使用交換。
  •  如果--memory-swap 未設置--memory 設置,則容器可以使用兩倍於--memory設置swap,主機容器需要配置有swap。例如,如果設置--memory="300m" --memory-swap 未設置,容器可以使用300米的記憶體和600米的swap
  •  如果--memory-swap 明確設置為-1,則允許容器使用無限制swap,最多可達宿主機系統上可用的數量
  •  在容器內部,工具如free 報告主機的swap,而不是容器內真正可用的記憶體。不要依賴free 或類似工具來確定是否存在swap

 

3)防止容器使用交換

  如果--memory --memory-swap設置為相同的值,則可以防止容器使用swap。這是因為--memory-swap 可以使用的memory and swap,而--memory只是可以使用的物理記憶體量。

 

2.2.2 --memory-swappiness 設置

  •  值為0將關閉匿名頁面交換。
  •  100將所有匿名頁面設置為可交換。
  •  預設情況下,如果未設置--memory-swappiness,則值將從主機繼承。

 

2.2.3 --kernel-memory 設置

1)介紹

內核記憶體限制以分配給容器的總記憶體表示。請考慮以下方案:

  •  無限記憶體,無限內核記憶體:這是預設設置。
  •  無限記憶體,有限的內核記憶體:當所有cgroup所需的記憶體量大於主機上實際存在的記憶體量時,這是合適的。您可以將內核記憶體配置為永遠不會覆蓋主機上可用的內容,而需要更多記憶體的容器需要等待它。
  •  有限的記憶體,無限的內核記憶體:整體記憶體有限,但內核記憶體不受限制。
  •  有限的記憶體,有限的內核記憶體:限制用戶和內核記憶體對於調試與記憶體相關的問題非常有用。如果容器使用意外數量的任一類型的記憶體,則記憶體不足而不會影響其他容器或主機。在此設置中,如果內核記憶體限制低於用戶記憶體限制,則內核記憶體不足會導致容器遇到OOM錯誤。如果內核記憶體限制高於用戶記憶體限制,則內核限制不會導致容器遇到OOM

 當您打開任何內核記憶體限制時,主機會根據每個進程跟蹤高水位線統計信息,因此您可以跟蹤哪些進程(在本例中為容器)正在使用多餘的記憶體。通過/proc/<PID>/status在主機上查看,可以在每個過程中看到這一點。

 

3CPU

  •  預設情況下,每個容器對主機CPU周期的訪問許可權是不受限制的
  •  您可以設置各種約束來限制給定容器訪問主機的CPU周期。
  •  大多數用戶使用和配置 預設CFS調度程式。
  •  Docker 1.13及更高版本中,您還可以配置 實時調度程式。

 

3.1 配置預設CFS調度程式

  CFS是用於普通Linux進程的Linux內核CPU調度程式。多個運行時標誌允許您配置容器具有的CPU資源訪問量。使用這些設置時,Docker會修改主機上容器的cgroup的設置。

選項

描述

--cpus=<value>

指定容器可以使用的可用CPU資源量。例如,如果主機有兩個CPU並且你已設置--cpus="1.5",則容器最多保證一個半CPU。這相當於設置--cpu-period="100000" --cpu-quota="150000"。可在Docker 1.13及更高版本中使用。

--cpu-period=<value>

指定CPU CFS調度程式周期,它與並用 --cpu-quota。預設為100微秒。大多數用戶不會更改預設設置。如果您使用Docker 1.13或更高版本,請--cpus 使用。

--cpu-quota=<value>

對容器施加CPU CFS配額。--cpu-period限制前容器限製為每秒的微秒數。作為有效上限。如果您使用Docker 1.13或更高版本,請--cpus改用。

--cpuset-cpus

限制容器可以使用的特定CPU或核心。如果您有多個CPU,則容器可以使用逗號分隔列表或連字元分隔的CPU範圍。第一個CPU編號為0.有效值可能是0-3(使用第一個,第二個,第三個和第四個CPU)或1,3(使用第二個和第四個CPU)。

--cpu-shares

將此標誌設置為大於或小於預設值1024的值,以增加或減少容器的重量,並使其可以訪問主機的CPU周期的較大或較小比例。僅在CPU周期受限時才會強制執行此操作。當有足夠的CPU周期時,所有容器都會根據需要使用儘可能多的CPU。這樣,這是一個軟限制。--cpu-shares不會阻止容器以群集模式進行調度。它為可用的CPU周期優先考慮容器CPU資源。它不保證或保留任何特定的CPU訪問許可權。

 

4、操作演示

4.1 準備工作

1)先查詢宿主機的資源:

[root@docker ~]# lscpu   CPU資源
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             4
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Model name:            Intel(R) Xeon(R) CPU E3-1231 v3 @ 3.40GHz
Stepping:              3
CPU MHz:               3395.854
BogoMIPS:              6792.17
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-3
[root@docker ~]# free -h   記憶體、swap資源
              total        used        free      shared  buff/cache   available
Mem:           7.8G        193M        7.2G        8.6M        438M        7.3G
Swap:          2.0G        400K        2.0G

  

2)在dockerhub 下載一個用於壓測的鏡像

[root@docker ~]# docker pull lorel/docker-stress-ng

  

3)該壓測鏡像的使用方法

[root@docker ~]# docker run --name stress --rm lorel/docker-stress-ng:latest stress --help

使用--help 可以查詢此壓測鏡像的用法

例:

    stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s

語法:

  •  -c N, --cpu N 啟動N個子進程(cpu
  •  --vm N 啟動N個進程對記憶體進行壓測
  •  --vm-bytes 128M 每個子進程使用多少記憶體(預設256M

 

4.2 測試記憶體限制

1)現在最大使用記憶體啟動容器

[root@docker ~]# docker run --name stress --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 2 vm

[root@docker ~]# docker stats stress
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
e1fdb0520bad        stress              8.22%               254MiB / 256MiB     99.22%              648B / 0B           46.9MB / 3.63GB     5

註釋:

  •  -m 256m 限制此容器最大隻能使用256m 記憶體;
  •  --vm 2    啟動壓測容器,使用256x2=512m的記憶體;
  •  docker stats 結果查詢,容器實際使用記憶體不能超過256m

 

4.3 測試CPU限制

1)限制最大使用2CPU

[root@docker ~]# docker run --name stress --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 8 cpu

[root@docker ~]# docker stats stress
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
ca86c0de6431        stress              199.85%             15.81MiB / 7.781GiB   0.20%               648B / 0B           0B / 0B             9

  

2)不限制使用CPU核數

[root@docker ~]# docker run --name stress --rm lorel/docker-stress-ng:latest stress --cpu 8
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 8 cpu

[root@docker ~]# docker stats stress
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
167afeac7c97        stress              399.44%             15.81MiB / 7.781GiB   0.20%               508B / 0B           0B / 0B             9

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux中常用的特殊符號 通配符 正則表達式 正則與統配符的區別 正則表達式的分類 基礎正則 擴展正則 + | () {} ? 正則總結 練習題 1、請執行命令取出linux中eth0的IP地址(請用cut,有能力者也可分別用awk,sed命令答) 2、如何取得/etc/hosts文件的許可權對應的 ...
  • 保持更新,轉載請註明出處。 ...
  • 從第一篇博客出來之後就沒再更新過博客,這一次再更新博客的時候已經是換了項目了,現在在搞雙目視覺方面。剛開始接觸這一方面,前幾天一直在研究相機原本的庫函數的調用問題 網上這一方面的很少,而且很多都是在ubunto環境下的配置環境庫的,在window下配置的很少,而且資料很亂。於是我決定將這幾天的經驗總 ...
  • 使用man 命令可以查看 dumpe2fs 命令具體的使用的方法: 使用方法: 查看磁碟inode和block信息: 保持更新,轉載請註明出處。 ...
  • 快捷鍵 作用 ctrl+A 把游標移動到命令行開頭。如果我們輸入的命令過長,想要把游標移動到命令行開頭時使用。 ctrl+E 把游標移動到命令行結尾。 ctrl+C 強制終止當前的命令。 ctrl+L 清屏,相當於clear命令。 ctrl+U 刪除或剪切游標之前的命令。我輸入了一行很長的命令,不用... ...
  • 什麼是Windows To Go? https://en.wikipedia.org/wiki/Windows_To_Go 微軟為瞭解決企業用戶的需求而推出,可以在u盤或者移動硬碟啟動window系統,顧名思義,移動的windows。 那這個東西有啥用呢? 1.移動辦公 比如程式員,有時候公司pc開 ...
  • 通過yum等軟體倉庫都可以直接安裝RabbitMQ,但版本一般都較為保守。 RabbitMQ官網提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是安裝的時候會提示需要erlang版本>=19.3,然而預設yum倉庫中的版本較低。 其實Rabbit ...
  • 在下載文件時,如果遇到重覆文件,windows的預設做法時 文件名(數字) 這樣的方式重命名的。那麼我們在排除重覆文件時,可以使用 windows文件瀏覽器提供的查找功能, 用通配符 ~="(1)" 來將重覆的文件找出來,然後刪掉。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...