1. 程式人生 > >限制容器對內存的使用 - 每天5分鐘玩轉 Docker 容器技術(27)

限制容器對內存的使用 - 每天5分鐘玩轉 Docker 容器技術(27)

upload 機制 性能 http tle war pac 啟動 物理內存

一個 docker host 上會運行若幹容器,每個容器都需要 CPU、內存和 IO 資源。對於 KVM,VMware 等虛擬化技術,用戶可以控制分配多少 CPU、內存資源給每個虛擬機。對於容器,Docker 也提供了類似的機制避免某個容器因占用太多資源而影響其他容器乃至整個 host 的性能。

內存限額

與操作系統類似,容器可使用的內存包括兩部分:物理內存和 swap。 Docker 通過下面兩組參數來控制容器內存的使用量。

  1. -m--memory:設置內存的使用限額,例如 100M, 2G。

  2. --memory-swap:設置 內存+swap 的使用限額。

當我們執行如下命令:

docker run -m 200M --memory-swap=300M ubuntu

其含義是允許該容器最多使用 200M 的內存和 100M 的 swap。默認情況下,上面兩組參數為 -1,即對容器內存和 swap 的使用沒有限制。

下面我們將使用 progrium/stress 鏡像來學習如何為容器分配內存。該鏡像可用於對容器執行壓力測試。執行如下命令:

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

--vm 1:啟動 1 個內存工作線程。

--vm-bytes 280M:每個線程分配 280M 內存。

運行結果如下:

技術分享

因為 280M 在可分配的範圍(300M)內,所以工作線程能夠正常工作,其過程是:

  1. 分配 280M 內存。

  2. 釋放 280M 內存。

  3. 再分配 280M 內存。

  4. 再釋放 280M 內存。

  5. 一直循環......

如果讓工作線程分配的內存超過 300M,結果如下:

技術分享

分配的內存超過限額,stress 線程報錯,容器退出。

如果在啟動容器時只指定 -m 而不指定 --memory-swap,那麽 --memory-swap 默認為 -m 的兩倍,比如:

docker run -it -m 200M ubuntu

容器最多使用 200M 物理內存和 200M swap。

內存限額就討論到這裏,下一節我們將學習如何限制容器對 CPU 資源的使用。

技術分享

限制容器對內存的使用 - 每天5分鐘玩轉 Docker 容器技術(27)