Docker 內存限制;
docker run -d -i -t -m 256M --memory-swap 512M --name centos2.12 centos /bin/bash
查看容器實例 內存限制:
限制容器內存大小;
docker run -d -i -t -m 256M --memory-swap 512M --name centos centos /bin/bash
-m, --memory # 內存限制大小,單位可以為 b,k,M,g;最小為4M --memory-swap # 內存+交換分區大小總限制 --memory-reservation
# 預留內存大小;容器在宿主機最小占用內存; --oom-kill-disable # out-of-memory 內存溢出;限制kill容器進程,默認沒設置 --oom-score-adj # 容器被 OOM killer 殺死的優先級,范圍是[-1000, 1000],默認為 0 --memory-swappiness # 用於設置容器的虛擬內存控制行為。值為 0~100 之間的整數 --kernel-memory 核心內存限制,最小為 4M。
1、memory 設置容器內存大小;
--memory-swap 不是交換分區,而是 memory + swap 的大小;
容器的交換分區 swap = memory-swap - memory
2、Docker 默認容器交換分區的大小和內存相同
memory-swap 不設置 或者設置為 0 ; 容器的交換分區 swap 大小就是 memory 的小大; 容器的進程使用最大內存 = memory + swap
3、memory-swap 設置
當 memory-swap 設置為 -1 時; 容器內存大小為 memory 設置的大小; 交換分區大小為宿主機 swap 大小; 容器進程能使用的最大內存 = memory + 宿主機 swap 大小;
4、內存溢出
--oom-kill-disable 限制 kill 容器進程; (必須設置在 memory 之后才有限;) docker run -d -i -t -m 256M --oom-kill-disable --name Centos-1 centos /bin/bash
5、核心內存 & 用戶內存
核心內存和用戶內存不同的地方在於核心內存不能被交換出。
不能交換出去的特性使得容器可以通過消耗太多內存來堵塞一些系統服務。
核心內存包括:
stack pages(棧頁面)
slab pages
socket memory pressure
tcp memory pressure
可以通過設置核心內存限制來約束這些內存。
每個進程都要消耗一些棧頁面,通過限制核心內存,可以在核心內存使用過多時阻止新進程被創建。
docker run -d -i -t -m 500M --kernel-memory 128M --name Centos-2 centos /bin/bash 限制容器內存 256M;限制核心內存 128M 。 docker run -d -i -t --kernel-memory 128M --name Centos-3 centos /bin/bash 內存為宿主機memory大小, 限制核心內存 128M
6、Swappiness 內存回收頁
容器的內核可以交換出一定比例的匿名頁。
--memory-swappiness就是用來設置這個比例的。 --memory-swappiness可以設置為從 0 到 100。 # 0 表示關閉匿名頁面交換。 # 100 表示所有的匿名頁都可以交換。默認情況下,如果不適用--memory-swappiness,則該值從父進程繼承而來。 docker run -d -i -t --memory-swappiness=0 --name Centos-4 centos /bin/bash 將--memory-swappiness設置為 0 可以保持容器的工作集,避免交換代理的性能損失。
Swappiness 的值越大,表示越積極使用swap分區,越小表示越積極使用物理內存。默認值swappiness=60
sysctl vm.swappiness = 100 # cat /proc/sys/vm/swappiness