docker 部署项目抛出OOM异常 参数配置
1、docker限制内存,非常重要!
2、限制内存的方式(放一个别人写的修改内存的步骤):
方法一:静态修改 -m
-m参数:限制docker容器最大使用内存
例如:$ docker run -it -m 300M --memory-swap -1 --name con1 u-stress /bin/bash
上面的 docker run 命令中通过 -m 选项限制容器使用的内存上限为 300M。
同时设置 memory-swap 值为 -1,它表示容器程序使用内存的受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)。
方法二:动态修改 docker update
docker update 动态修改docker容器内存
例如:把一个运行着gitlab 的容器内存限制在2048M以内
docker update --memory 2048m --memory-swap -1 gitlab
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、核心内存 & 用户内存
核心内存和用户内存不同的地方在于核心内存不能被交换出。
不能交换出去的特性使得容器可以通过消耗太多内存来堵塞一些系统服务。