【DOCKER】-6 docker的資源限制與監控

文章目錄

  • 1、docker的資源限制
    • 1.1 容器資源限制的介紹
    • 1.2 OOM
    • 1.3 容器的內存限制
      • 1.3.1 內存限制的相關選項
    • 1.4 容器的CPU限制介紹
  • 2、docker的監控插件
    • 2.1 cadvisor
    • 2.2 portainer

1、docker的資源限制

1.1 容器資源限制的介紹

默認情況下,容器沒有資源的使用限制,可以使用主機內核調度程序允許的盡可能多的資源

Docker 提供了控制容器使用資源的方法,可以限制容器使用多少內存或 CPU等, 在docker run 命令的運行時配置標志實現資源限制功能。

其中許多功能都要求宿主機的內核支持,要檢查是否支持這些功能,可以使用docker info 命令 ,如果內核中的某項特性可能會在輸出結尾處看到警告, 如下所示:

WARNING: No swap limit support

1.2 OOM

對于 Linux 主機,如果沒有足夠的內存來執行其他重要的系統任務,將會拋出OOM (Out of Memory Exception,內存溢出、內存泄漏、內存異常 ),隨后系統會開始殺死進程以釋放內存, 凡是運行在宿主機的進程都有可能被 kill ,包括 Dockerd和其它的應用程序, 如果重要的系統進程被 Kill,會導致和該進程相關的服務全部宕機。通常越消耗內存比較大的應用越容易被kill,比如: MySQL數據庫,Java程序等

產生 OOM 異常時, Dockerd嘗試通過調整 Docker 守護程序上的 OOM 優先級來減輕這些風險,以便它比系統上的其他進程更不可能被殺死但是容器 的 OOM 優先級未調整, 這使得單個容器被殺死的可能性比 Docker守護程序或其他系統進程被殺死的可能性更大,不推薦通過在守護程序或容器上手動設置-- oom -score-adj為極端負數,或通過在容器上設置 – oom-kill-disable來繞過這些安全措施

OOM優先級機制:

linux會為每個進程算一個分數,最終將分數最高的kill

/proc/PID/oom_score_adj 
#范圍為 -1000 到 1000,值越高容易被宿主機 kill掉,如果將該值設置為 -1000 ,則進程永遠不會被宿主機 kernel kill /proc/PID/oom_adj 
#范圍為 -17 到+15 ,取值越高越容易被干掉,如果是 -17 , 則表示不能被 kill ,該設置參數的存在是為了和舊版本的 Linux 內核兼容。/proc/PID/oom_score 
#這個值是系統綜合進程的內存消耗量、 CPU 時間 (utime + 、存活時間 (uptime - start time) 和 oom_adj 計算出的進程得分 ,消耗內存越多得分越高,容易被宿主機 kernel 強制殺死

查看docker進程相關的oom的值

[root@localhost docker-compose]#cat /proc/24472/oom_score_adj 
-500
[root@localhost docker-compose]#cat /proc/24472/oom_adj 
-8
[root@localhost docker-compose]#cat /proc/24472/oom_score
0
[root@localhost docker-compose]#

1.3 容器的內存限制

Docker 可以強制執行硬性內存限制,即只允許容器使用給定的內存大小。

Docker 也可以執行非硬性內存限制,即容器可以使用盡可能多的內存,除非內核檢測到主機上的內存不夠用了

1.3.1 內存限制的相關選項

以下設置大部分的選項取正整數,跟著一個后綴 b , k , m , g ,,表示字節,千字節,兆字節或千兆字節

選項描述
-m , – --memory=容器可以使用的最大物理內存量,硬限制,此選項最小允許值為 4m (4 MB),此項較常用
–memory-swap允許此容器交換到磁盤的內存量,必須先用-m 對內存限制才可以使用,詳 細說明如下
–memory-swappiness設置容器使用交換分區的傾向性,值越高表示越傾向于使用swap分 區,范圍為0-100,0為能不用就不用,100為能用就用
–memory-reservation允許指定小于 --memory 的軟限制 ,當 Docker 檢測到主機上的爭用 或內存不足時會激活該限制,如果使-- memory-reservation,則必須 將其設置為低于 --memory 才能使其優先生效。 因為它是軟限制,所 以不能保證容器不超過限制
–kernel-memory容器可以使用的最大內核內存量,最小為 4m,由于內核內存與用戶空 間內存隔離,因此無法與用戶空間內存直接交換,因此內核內存不足的 容器可能會阻塞宿主機資源,這會對主機和其他容器或者其他服務進程 產生影響,因此不建議設置內核內存大小
–oom-kill-disable默認情況下,如果發生內存不足(OOM)錯誤,則內核將終止容器中 的進程。要更改此行為,請使用該 --oom-kill-disable 選項。僅在設 置了該 -m/–memory 選項的容器上禁用OOM。如果 -m 未設置該標志, 則主機可能會用完內存,內核可能需要終止主機系統的進程以釋放內存

例子:啟動容器不會被優化

docker run -e MYSQL_ROOT_PASSWORD=123456 -it --rm -m 1g --oom-kill-disable mysql:5.7.29

例子: 限制容器使用的最大內存 默認啟動容器是不會 限制的

[root@localhost ~]#docker run -itd --name test1 -m 512m centos:7 /bin/bash
#限制容器最大內存為  512m[root@localhost ~]#docker stats --no-stream  test1
# 查看容器的最大值
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O    PIDS
b6472ee1f67e   test8     0.00%     1.617MiB / 512MiB   0.32%     648B / 0B   9.3MB / 0B   1

例子: 限制使用swap 的大小

–memory-swap

[root@localhost ~]#  docker run -itd --name test10 -m 512m --memory-swap=1g centos:7強調一下,--memory-swap 是必須要與 --memory 一起使用的。正常情況下,--memory-swap 的值包含容器可用內存和可用 swap。
所以 -m 512m --memory-swap=1g 的含義為:容器可以使用 512M 的物理內存,
并且可以使用 700M(1G - 300)的 swap。如果 --memory-swap 設置為 0 或者 不設置,則容器可以使用的 swap 大小為 -m 值的兩倍。
如果 --memory-swap 的值和 -m 值相同,則容器不能使用 swap。
如果 --memory-swap 值為 -1,它表示容器程序使用的內存受限,
而可以使用的 swap 空間使用不受限制(宿主機有多少 swap 容器就可以使用多少)

1.4 容器的CPU限制介紹

一個宿主機,有幾十個核心的CPU,但是宿主機上可以同時運行成百上千個不同的進程用以處理不同的任務,多進程共用一個 CPU 的核心為可壓縮資源,即一個核心的 CPU 可以通過調度而運行多個進程,但是同一個單位時間內只能有一個進程在 CPU 上運行,那么這么多的進程怎么在 CPU 上執行和調度的呢?

Linux kernel 進程的調度基于CFS(Completely Fair Scheduler),完全公平調度

服務器資源密集型

  • CPU 密集型的場景: 優先級越低越好,計算密集型任務的特點是要進行大量的計算,消耗CPU 資源,比如計算圓周率、數據處理、對視頻進行高清解碼等等,全靠CPU 的運算能力。
  • IO 密集型的場景: 優先級值高點,涉及到網絡、磁盤IO 的任務都是IO 密集型任務,這類任務的特點是 CPU 消耗很少,任務的大部分時間都在等待 IO 操作完成(因為 IO 的速度遠遠低于 CPU 和內存的速度),比如 Web 應用,高并發,數據量大的動態網站來說,數據庫應該為IO 密集型

CFS原理

cfs定義了進程調度的新模型,它給cfs_rq(cfs的run queue)中的每一個進程安排一個虛擬時鐘vruntime。如果一個進程得以執行,隨著時間的增長,其vruntime將不斷增大。沒有得到執行的進程vruntime不變, 而調度器總是選擇vruntime跑得最慢的那個進程來執行。這就是所謂的“完全公平”。為了區別不同優先級的進程,優先級高的進程vruntime增長得慢,以至于它可能得到更多的運行機會。CFS的意義在于, 在一個混雜著大量計算型進程和IO交互進程的系統中,CFS調度器相對其它調度器在對待IO交互進程要更加友善和公平。

[root@localhost ~]#cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 
選項描述
–cpus=指定一個容器可以使用多少個可用的CPU核心資源。例如,如果主機有兩個 CPU,如果設置了 --cpus=“1.5” ,則可以保證容器最多使用1.5個的CPU(如果 是4核CPU,那么還可以是4核心上每核用一點,但是總計是1.5核心的CPU)。這 相當于設置 --cpu-period=“100000” 和 --cpu-quota=“150000” 。此設置可在 Docker 1.13及更高版本中可用,目的是替代–cpu-period和–cpu-quota兩個參 數,從而使配置更簡單,但是最大不能超出宿主機的CPU總核心數(在操作系統 看到的CPU超線程后的數值),此項較常用
–cpu-period=過時選項,指定CPU CFS調度程序周期,必須與 --cpu-quota 一起使用 。默認為 100微秒。大多數用戶不會更改默認設置。如果使用Docker 1.13或更高版本, 請改用 --cpus
–cpu-quota=過時選項,在容器上添加 CPU CFS 配額,計算方式為 cpu-quota / cpu-period的 結果值,docker1.13 及以上版本通常使用–cpus 設置此值
–cpuset-cpus用于指定容器運行的 CPU 編號,也就是所謂的CPU綁定。如果一個或多個 CPU,則容器可以使用逗號分隔的列表或用連字符分隔的CPU范圍。第一個 CPU的編號為0。有效值可能是 0-3 (使用第一,第二,第三和第四CPU)或 1,3 (使用第二和第四CPU)
–cpu-shares用于設置 cfs 中調度的相對最大比例權重,cpu-share 的值越高的容器,將會分 得更多的時間片(宿主機多核 CPU 總數為 100%,假如容器 A 為1024,容器 B 為 2048,那么容器 B 將最大是容器 A 的可用 CPU 的兩倍 ),默認的時間片 1024,最大 262144。這是一個軟限制。

例子:設置CPU使用率上限

使用 --cpu-period 即可設置調度周期,使用 --cpu-quota 即可設置在每個周期內容器能使用的CPU時間。兩者可以配合使用。
CFS 周期的有效范圍是 1ms~1s,對應的 --cpu-period 的數值范圍是 1000~1000000。
而容器的 CPU 配額必須不小于 1ms,即 --cpu-quota 的值必須 >= 1000。

[root@localhost ~]#docker run -itd --name test5 centos:7 /bin/bash[root@localhost ~]#docker  ps  -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS                 NAMES
5f5ab75d9f1a   centos:7       "/bin/bash"               8 seconds ago    Up 7 seconds                                      test5[root@localhost ~]#cd /sys/fs/cgroup/cpu/docker/5f5ab75d9f1add29fd4441c88abc70f84cbc083d1fd5e77b99c94e5c8440d213/
[root@localhost 5f5ab75d9f1add29fd4441c88abc70f84cbc083d1fd5e77b99c94e5c8440d213]#
[root@localhost 5f5ab75d9f1add29fd4441c88abc70f84cbc083d1fd5e77b99c94e5c8440d213]#cat cpu.cfs_quota_us
-1
[root@localhost 5f5ab75d9f1add29fd4441c88abc70f84cbc083d1fd5e77b99c94e5c8440d213]#cat cpu.cfs_period_us 
100000cpu.cfs_period_us: 表示 CFS 調度周期的長度,以微秒為單位。
在每個周期內,容器可以使用指定比例的 CPU 時間。默認情況下,cpu.cfs_period_us 的值是 100000(即 100 毫秒)。cpu.cfs_quota_us: 表示容器在 cpu.cfs_period_us 周期內能夠使用的 CPU 時間量,同樣以微秒為單位。
它定義了一個相對于周期的配額。如果設置為 -1,表示沒有限制。如果設置為正值,表示在周期內的配額。
例如,如果 cpu.cfs_quota_us 設置為 50000,那么容器在一個周期內最多可以使用 50 毫秒的 CPU 時間。在 Linux 的 CFS 調度器中,cpu.cfs_period_us 參數定義了一個周期,
而這個周期實際上是用來調度任務(包括容器)的基本時間單位。
然而,具體的一次調度的時間是由調度器決定的,并且這個時間在一般情況下是動態變化的。

進入容器模擬測試

[root@localhost ~]#docker exec -it test5  bash[root@5f5ab75d9f1a /]# vi cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@5f5ab75d9f1a /]# ./cpu.sh  &

加入選項 --cpu-quota 50000

docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash

或者直接修改 配置文件

cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.sh

例子: 設置容器 綁定cpu

docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash

2、docker的監控插件

2.1 cadvisor

docker自帶的監控組件,可以把cadvisor下載下來,以一個UI界面,輸出出來,方便資源管理

在監控的知識體系中cadvisor也稱為指標暴露器

docker run -d --name wxj -p 8080:8080 -v /:/rootfs:ro -v /var/run/:/var/run/:rw -v /sys/:/sys/:ro -v /var/lib/docker/:/var/lib/docker/:ro -v /dev/disk/:/dev/disk/:ro google/cadvisor:v0.32.0

在這里插入圖片描述

在這里插入圖片描述

2.2 portainer

docker run -p 9000:9000 -p 8000:8000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mydata/portainer/data:/data \
-d portainer/portainer

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914546.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gcc 源碼分析--gimple 關鍵數據結構

gimple 操作碼,支持這些:DEFGSCODE(GIMPLE_symbol, printable name, GSS_symbol). */ DEFGSCODE(GIMPLE_ERROR_MARK, "gimple_error_mark", GSS_BASE) DEFGSCODE(GIMPLE_COND, "gimple_cond", GSS_WITH_OPS) DEFGSCODE(GIMPLE_DEBU…

TDengine GREATEST 和 LEAST 函數用戶手冊

TDengine GREATEST 和 LEAST 函數用戶手冊 1. 需求背景 1.1 問題描述 在實際生產過程中,客戶經常需要計算三相電流、電壓的最大值和最小值。傳統的實現方式需要使用復雜的 CASE WHEN 語句,例如: -- 傳統方式:計算三相電流最大…

Redis 與數據庫不一致問題及解決方案

一、不一致的原因分析 1. 緩存更新策略不當 先更新數據庫后刪除緩存:刪除緩存失敗會導致不一致 先刪除緩存后更新數據庫:并發請求可能導致不一致 緩存穿透:大量請求直接打到數據庫,繞過緩存 2. 并發操作問題 讀寫并發:讀請求獲取舊緩存時,寫請求更新了數據庫但未更新緩存…

iOS 加固工具使用經驗與 App 安全交付流程的實戰分享

在實際開發中,iOS App不僅要安全,還要能被穩定、快速、無誤地交付。這在外包、B端項目、渠道分發、企業自用系統等場景中尤為常見。 然而,許多開發者在引入加固工具后會遇到以下困擾: 混淆后App運行異常、不穩定;資源路…

Windows 下 Visual Studio 開發 C++ 項目的部署流程

在Windows環境中使用Visual Studio(以下簡稱VS)開發C項目時,“部署”是確保程序能在目標設備上正常運行的關鍵環節。部署的核心目標是:將編譯生成的可執行文件(.exe)、依賴的動態鏈接庫(.dll&am…

yolo8+聲紋識別(實時字幕)

現在已經完成了人臉識別跟蹤 ?,接下來要: ? 加入「聲紋識別(說話人識別)」功能,識別誰在講話,并在視頻中“這個人”的名字旁邊加上「正在講話」。 這屬于多模態識別(視覺 音頻)&a…

DH(Denavit–Hartenberg)矩陣

DH 矩陣(Denavit-Hartenberg 矩陣)是 1955 年由 Denavit 和 Hartenberg 提出的一種機器人運動學建模方法,用于描述機器人連桿和關節之間的關系。該方法通過在機器人每個連桿上建立坐標系,并用 44 的齊次變換矩陣(DH 矩…

Vim的magic模式

在 Vim 中,magic 模式用于控制正則表達式中特殊字符的解析方式。它決定了哪些字符需要轉義才能發揮特殊作用,從而影響搜索和替換命令的寫法。以下是詳細介紹: 一、三種 magic 模式 Vim 提供三種 magic 模式,通過在正則表達式前添加…

Git 使用技巧與原理(一)—— 基礎操作

1、起步 1.1 版本控制 版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。 版本控制系統(VCS,Version Control System)通常可以分為三類: 本地版本控制系統:大多都是采用某…

軟件測試之自動化測試

目錄 1.什么是自動化測試 2.web?動化測試 2.1驅動 WebDriverManager 3. Selenium 3.1selenium驅動瀏覽器的?作原理 4.常用函數 4.1元素的定位 4.1.1cssSelector選擇器 4.2.2xpath 4.2操作測試對象 4.3窗? 4.4等待 4.5瀏覽器導航 4.6彈窗 4.7文件上傳 4.8設置…

sqlserver遷移日志文件和數據文件

sqlserver安裝后沒有指定日志存儲路徑或者還原庫指定的日志存儲位置不理想想要更改,都可以按照這種方式來更換;1.前提準備:數據庫的備份bak文件2.查看自己當前數據庫的日志文件和數據文件存儲路徑是否理想選中當前數據庫,右鍵屬性…

MFC UI表格制作從專家到入門

文章目錄CListCtrl常見問題增強版CGridCtrl(第三方)第三方庫ReoGridCListCtrl 默認情況下,CListCtrl不支持直接編輯單元格,需通過消息處理實現。 1.添加控件到資源視圖 在對話框資源編輯器中拖入List Control控件,設…

數字后端APR innovus sroute到底是如何選取寬度來鋪power rail的?

吾愛IC社區新一期IC訓練營將于7月初開班(07.06號晚上第一次直播課)!社區所有IC后端訓練營課程均為直播課!全網唯一一家敢開后端直播課的(口碑不好招生一定存在困難,自然就無法開直播課)&#xf…

LVS集群技術

LVS(Linux Virtual Server)是一種基于Linux內核的高性能、高可用性服務器集群技術,它通過負載均衡將客戶端請求分發到多臺后端真實服務器,實現 scalability 和 fault tolerance。LVS工作在傳輸層(OSI Layer 4&#xff…

git項目,有idea文件夾,怎么去掉

要從Git項目中排除.idea文件夾(IntelliJ IDEA的配置文件目錄),可以通過以下步驟操作: 1. 添加.gitignore規則 在項目根目錄創建或編輯.gitignore文件,添加以下內容: .idea/2. 從Git緩存中刪除已跟蹤的.idea…

springboot+swagger2文檔從swagger-bootstrap-ui更換為knife4j及文檔接口參數不顯示問題

背景 已有springboot項目,且使用的是swagger2+swagger-bootstrap-ui的版本 1.pom依賴如下 <!-- Swagger接口管理工具 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9…

mysql數據庫表只能查詢,對于插入、更新、刪除操作一直卡住,直到報錯Lost connection to MySQL server during query

診斷步驟1. 查看阻塞進程SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;SELECT * FROM sys.schema_table_lock_waits;2. 查看當前活動事務SELECT * FROM information_schema.INNODB_TRX;3. 查看進程列表SHOW PROCESSLIST;通過SELECT * FROM in…

Redis BigKey 深度解析:從原理到實戰解決方案

引言&#xff1a;什么是 BigKey&#xff1f;在 Redis 的使用場景中&#xff0c;BigKey&#xff08;大鍵&#xff09;是指那些數據量異常龐大的鍵值&#xff0c;通常表現為&#xff1a;String 類型&#xff1a;值大小超過 10KBHash/Set 等&#xff1a;元素數量超過 5000List/ZSe…

Qt 實現新手引導

Qt實現新手引導 對于一個新安裝的軟件或者一個新的功能&#xff0c;提供一個新手引導步驟&#xff0c;能夠讓用戶快速熟悉。這是最終效果&#xff0c;每一個按鈕都會有一個簡單引導&#xff0c;通過點擊上一步、下一步來切換不同的指導。當前引導的功能&#xff0c;會有一個高光…

Maven+Spring

一、Maven 相關- 本地倉庫設置&#xff1a;- 在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中可以設置 Maven 的本地倉庫路徑&#xff0c;本地倉庫用于存儲從遠程倉庫下載的依賴庫&#xff0c;方便項目重復使用。- 倉庫關系&#xff1a;- 項目&#xff1a;開發中的項目&…