docker的容器调整
记一场由docker容器“ java.lang.OutOfMemoryError”引发的环境“雪崩”_西风未眠的技术博客_51CTO博客
限制docker内存。重新优化了docker容器,限制了docker内存的使用量,减少docker容器过度占用宿主机资源的风险
方法一:静态修改 -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
-
m
: 指定容器内存 -
--memory-swap
: 设置容器交换分区大小,设置交换分区必须要设置-m
:依赖前者
CPU的限制
--cpus= value
: 指定 cpu的核心数量,这种方式直接限定了容器可用的cpu资源-
docker run --name os1 -it -m 1g --cpus=2 centos:latest bash
docker-compose资源限制
docker-compose资源限制&docker资源监控_allen sue的博客-CSDN博客_docker-compose limit
> v2:pu_shares,cpu_quota,cpuset, mem_limit,memswap_limit,mem_swappines
version: '2'
services:
testservice:
image: image
container_name: container_name
ports:
- 'ports_out:ports'
privileged: True
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker:/var/lib/docker:ro
- /cgroup:/cgroup:ro
mem_limit: 512m
restart: always
networks:
default:
external:
name: br0
- start command:
docker-compose up -d
>v3:deploy
version: "3"
services:
test:
image: image
container_name: container_name
deploy:
resources:
limits:
cpus: '0.50'
memory: 500M
networks:
default:
external:
name: br0
- start command:
docker-compose --compatibility up -d
java微服务的jvm调整
JAVA_OPTS="-server -Xms6g -Xmx6g -XX:PermSize=256m -XX:MaxPermSize=512m -XX:-OmitStackTraceInFastThrow"
java -Xms1g -Xmx1g -jar $4 --spring.profiles.active=pro --server.port=$5 --server.ip=$6
问题:
docker 容器设置了 –restart always,此时 java 发生了 java.lang.OutOfMemoryError: Java heap space, 容器并没有重启
微服务启动已经设置了 -Xms -Xmx
Docker 容器内 Java 应用发生 OutOfMemoryError 堆内存空间不足时, 容器无法重启应用 - JoyLau's Blog | JoyLau
解释
JVM堆内存超出xmx限制,并抛java.lang.OutOfMemoryError: Java heap space异常。堆内存爆了之后,JVM和java进程会继续运行,并不会crash
解决
当JVM出现 OutOfMemoryError,要让 JVM 自行退出, 这样容器就会触发重启
添加新的 jvm 配置: ExitOnOutOfMemoryError and CrashOnOutOfMemoryError
该配置支持 jdk8u92 版本及其之后的版本
ExitOnOutOfMemoryError: 启用此选项时,JVM在第一次出现内存不足错误时退出。如果您希望重新启动JVM实例而不是处理内存不足错误,则可以使用它。
CrashOnOutOfMemoryError: 如果启用此选项,则在发生内存不足错误时,JVM崩溃并生成文本和二进制崩溃文件(如果启用了核心文件)。
JAVA_OPTS = “-XX:+ExitOnOutOfMemoryError”
JAVA_OPTS="-server -Xms6g -Xmx6g -XX:PermSize=256m -XX:MaxPermSize=512m -XX:-OmitStackTraceInFastThrow -XX:+ExitOnOutOfMemoryError"