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