你可能不知道的Docker資源限制


本篇已加入《.NET Core on K8S學習實踐系列文章索引》,可以點擊查看更多容器化技術相關系列文章。

What is 資源限制?

  默認情況下,容器是沒有資源限制的,它會盡可能地使用宿主機能夠分配給它的資源。Docker提供了一種控制分配多少量的內存、CPU或阻塞I/O給一個容器的方式,即通過在docker run或docker create命令時設置運行時配置的標志。
其中許多功能都要求您的內核支持Linux功能,可以通過docker info命令來檢查是否支持,如果內核中禁用了某項功能,那你可能會在下邊收到一條Warning。
docker-info
  在Linux主機上,如果內核檢測到沒有足夠的內存來執行重要的系統功能,它會拋出一個OOME(Out Of Memory Exception),一旦發生OOME,Linux就會開始查殺進程以釋放內存。任何進程都有可能會被殺死,包括docker daemon和其他重要的應用程序。如果錯誤的進程被殺死,這可會降低整個系統的使用效果。

限制Docker使用內存

  在Docker中可以強行限制容器的資源使用的限制,即只允許容器使用不超過給定數量的系統內存或其他軟限制。下面介紹幾個最常用的選項,我們可以在docker run或docker create創建容器時指定,用以限制容器的資源使用限制。
選項
描述
-m 或 -memory=
容器可以使用的最大內存量。如果你設置了此選項,那么允許的最小值為4m(4MB)。
--memory-swap
允許此容器交換到磁盤的內存量。
--kernel-memory
容器可以使用的最大內核內存量,允許的最小值是4m(4MB)。由於內核內存無法換出,因此內核內存不足的容器可能會阻塞主機資源,這可能會對主機和其他容器產生副作用。

限制Docker使用CPU

  默認情況下,每個容器對主機CPU周期的訪問權限是不受限制的。我們可以設置各種約束來限制給定容器訪問主機的CPU周期。大多數用戶使用和配置CFS調度程序(默認)或實時調度程序。下面介紹幾個常用的選項,用於配置默認的CFS調度程序,以限制容器對於CPU的使用。
選項
描述
--cpus=<value>
指定容器可以使用的可用CPU資源量,例如宿主機有4個CPU,那你可以給容器設置--cpus="3.5",則限制容器最多使用3.5個CPU。
--cpuset-cpus
限制容器可以使用的特定CPU或核心,例如宿主機有4個CPU,那你可以給容器設置--cpuset-cpus="1,3",則限制容器只能使用第2個和第4個CPU。

驗證Docker資源限制

  (1)查看宿主機的資源信息
lscpu
free -h
可以看出,我是個窮逼,只買得起這個配置的雲服務器(個人用)
  (2)拉取用於壓測的鏡像
docker pull lorel/docker-stress-ng
  更多關於docker-stress-ng鏡像的說明請參考docker hub上的官方文檔: https://hub.docker.com/r/lorel/docker-stress-ng/
  (3)如果想要查看docker-stress-ng的用法,可以使用以下命令借助--help來獲取選項的含義
docker run --name stress --rm lorel/docker-stress-ng:latest stress --help
 
  在幫助文檔中,給出了一個Example:
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)測試內存使用限制
docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2
  說明:
  • 限制內存使用最多256M
  • 開啟壓測啟動2個進程,每個進程使用256M(默認值)
  驗證:
docker stats stress
 
  可以看到,無論啟動多少個使用256M的進程做壓測(這里啟動了2個進程,按理會使用512MB內存),stress容器的最大內存使用量始終維持在256MB。
  (5)測試CPU使用限制
docker run --name stress --rm --cpus 1 lorel/docker-stress-ng:latest stress --cpu 4
  這里由於我的宿主機只有2個CPU,因此這里限制stress容器只能使用最多1個CPU,但是壓測進程可以使用4個CPU。
  驗證:
docker stats stress
 
  可以看到,無論壓測的進程被允許使用多少個CPU,stress的CPU使用量始終在100%左右(存在一定誤差是正常的)。
那么,如果我們不限制CPU呢?
docker run --name stress --rm lorel/docker-stress-ng:latest stress --cpu 4
 
  從上圖可知,stress容器會盡可能地吃掉盡可能多的CPU資源,由於宿主機只有2個CPU,因此原則上不會使用超過200%的CPU(當然,也會存在一定的誤差,正常的)

小結

  本文探索了Docker的資源限制相關知識,在日常開發中應該給容器設置一個合理的資源限制值,以防出現OOME的情況導致Linux殺掉錯誤的進程。

參考資料

(1)馬哥,《Docker資源限制及驗證》
(2)阿龍,《 Docker的系統資源限制詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM