你可能不知道的Docker资源限制
本篇內容涉及Docker的內存與CPU限制,可以用于在實際開發中為指定容器設置限制最大使用的資源量,預計閱讀時間為5分鐘。
01
—
What is 資源限制?
默認情況下,容器是沒有資源限制的,它會盡可能地使用宿主機能夠分配給它的資源。Docker提供了一種控制分配多少量的內存、CPU或阻塞I/O給一個容器的方式,即通過在docker run或docker create命令時設置運行時配置的標志。
其中許多功能都要求您的內核支持Linux功能,可以通過docker info命令來檢查是否支持,如果內核中禁用了某項功能,那你可能會在下邊收到一條Warning。
02
—
關于OOME
在Linux主機上,如果內核檢測到沒有足夠的內存來執行重要的系統功能,它會拋出一個OOME 或者 Out Of Memory Exception,一旦發生OOME,Linux就會開始查殺進程以釋放內存。任何進程都有可能會被殺死,包括docker daemon和其他重要的應用程序。如果錯誤的進程被殺死,這可會降低整個系統的使用效果。
03
—
限制Docker使用內存
在Docker中可以強行限制容器的資源使用的限制,即只允許容器使用不超過給定數量的系統內存或其他軟限制。
下面介紹幾個最常用的選項,我們可以在docker run或docker create創建容器時指定,用以限制容器的資源使用限制。
選項 | 描述 |
-m 或 -memory= | 容器可以使用的最大內存量。如果你設置了此選項,那么允許的最小值為4m(4MB)。 |
--memory-swap | 允許此容器交換到磁盤的內存量。 |
--kernel-memory | 容器可以使用的最大內核內存量,允許的最小值是4m(4MB)。由于內核內存無法換出,因此內核內存不足的容器可能會阻塞主機資源,這可能會對主機和其他容器產生副作用。 |
04
—
限制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。 |
05
—
驗證Docker資源限制
(1)查看宿主機的資源信息
(2)拉取用于壓測的鏡像
更多關于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下面是它的重要選項的說明:
(4)測試內存使用限制
docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2說明:
驗證:
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(當然,也會存在一定的誤差,正常的)
06
—
小結
參考資料:
(1)馬哥,《Docker資源限制及驗證》
(2)阿龍,《Docker的系統資源限制詳解》
恰童鞋騷年,風華不再正茂,仍想揮斥方遒
點個在看少個bug??
總結
以上是生活随笔為你收集整理的你可能不知道的Docker资源限制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软解释为什么Rust是系统编程的最佳选
- 下一篇: 东南亚的IT公司,我劝你善良!