docker 中 jvm 参数设置的坑

docker 中 jvm 参数设置的坑,第1张

将Docker安装到内存通常称为“内存驻留Docker”或“内存驻留容器”。这意味着Docker将容器和镜像完全加载到内存中,而不是保存在磁盘上。这可以提高Docker容器的性能和响应速度,但是需要足够的内存。极空间是一个虚拟现实游戏平台,我不确定你是想要将什么样的极空间Docker安装到内存中。如果你需要更具体的帮助,请提供更多的详细信息,我会尽力回答。

默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源,Docker 提供了控制容器可以限制容器使用多少内存或CPU 的方法,设置 docker run 命令的运行时配置标志。

其中许多功能都要求宿主机的内核支持Linux 功能,要检查支持,可以使用 docker info 命令,如果内核中禁用了某项功能,可能会在输出结尾处看到警告,如下所示:

对于Linux 主机,如果没有足够的内存来执行其他重要的系统任务,将会抛出OOM (Out of Memory Exception,内存溢出、内存泄漏、内存异常), 随后系统会开始杀死进程以释放内存,凡是运行在宿主机的进程都有可能被kill,包括Dockerd和其它的应用程序,如果重要的系统进程被Kill,会导致和该进程相关的服务全部宕机。

linux 会为每个进程算一个分数,最终它会将分数最高的进程kill。

Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。

Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了。

这些选项中的大多数采用正整数,后跟 b、k、m、g 后缀,以表示字节、千字节、兆字节或千兆字节。

--memory-swap , 只有在设置了 --memory 后才会有意义。使用Swap,可以让容器将超出限制部分的内存置换到磁盘上,

不同的 --memory-swap 设置会产生不同的效果:

假如一个容器未做内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制。

启动两个工作进程,每个工作进程最大允许使用内存256M,且宿主机不限制当前容器最大内存:

接着宿主机限制容器最大内存使用:

宿主机cgroup 验证:

--memory-reservation

宿主机cgroup 验证:

一个宿主机,有几十个核的CPU,但是宿主机上可以同时运行成百上千个不同的进程用以处理不同的任务,多进程共用一个CPU 的核心依赖计数就是为可压缩资源,即一个核心的CPU 可以通过调度而运行多个进程,但是同一个单位时间内只能有一个进程在CPU 上运行,那么这么多的进程怎么在CPU 上执行和调度的呢?

Linux kernel 进程的调度基于CFS(Completely Fair Scheduler),完全公平调度

默认情况下,每个容器对主机CPU 周期的访问权限是不受限制的,但是我们可以设置各种约束来限制给定容器访问主机的CPU周期,大多数用户使用的是默认的CFS 调度方式,在Docker 113 及更高版本中,还可以配置实时优先级。

参数

对于一台2核的服务器,如果不做限制,容器会把宿主机的CPU 全部占完:

在宿主机使用 dokcer stats 命令查看容器运行状态:

在宿主机查看CPU 限制参数:

宿主机CPU 利用率:

只给容器分配最多1核宿主机CPU 利用率

宿主机cgroup 验证:

当前容器状态:

宿主机CPU利用率:

容器运行状态:

宿主机CPU利用率:

启动两个容器,stress1 的 --cpu-shares 值为1000 , stress2 的 --cpu-shares 为500,观察最终效果, --cpu-shares 值为1000 的 stress1的CPU 利用率基本是 --cpu-shares 为500 的 stress1的 2 倍:

验证容器运行状态:

宿主机cgroups验证:

动态修改CPU shares的值

--cpu-shares 的值可以在宿主机cgroup 动态修改,修改完成后立即生效,其值可以调大也可以减小。

验证修改后的容器运行状态:

在默认情况下,docker容器并不会对容器内部进程使用的内存大小进行任何限制。对于PaaS系统而言,或者对于直接使用docker的用户而言,这非常危险。如果哪个业务容器,出现了内存泄漏;那么它可能会危害到整个主机系统,导致业务app容器所在的主机出现oom。本文将介绍着眼于docker对内存资源的使用,解释背后的原理。同时也给出k8s上如何配置内存限制的方法。

通过下面参数可以为容器设置一个内存使用量硬大小,当超出这个大小时刻,linux系统会根据配置设置决定是否进入oom-killer状态。

docker run --name zxy-docker -m 1g -it busybox bash

单位为:b,k,m和g

如果设置了-m参数,通常情况下如果容器使用内存量超过了设置的硬水线,那么linux的oom-killer触发,它将根据oom-score对容器内部进程进行oom kill。但是不影响宿主机上其他进程。

这个参数设置一定需要在容器run或者create过程中使用了-m参数才可以设置。设置了-m参数,如果容器使用内存超限了,那么oom-kill将触发。如果设置了--oom-kill-disable, 那么容器不会oom,但是此时容器内部申请内存的进程将hang,直到他们可以申请到内存(容器内其他进程释放了内存)

绝对不要在没有使用-m的时候设置--oom-kill-disable 因为这会影响到宿主机的oom-killer

docker 设置容器的-m是通过设置memory cgoup的memorylimit_in_bytes实现的。在没有设置-m的时候这个值为-1,表示容器使用的内存不受限制。

例如:

`bash>docker run --name zxy-memorylimit -it -m 1g docker-build:1206 bash

bash>docker inspect zxy-memorylimit|grep -i pid

“Pid”:24360

bash>cat /proc/24360/cgroup|grep memory

9:memory:/docker/xxxxx

bash>cd /sys/fs/cgroups/memory/docker/xxxx

bash> cat memorylimit_in_bytes

1073741824`

--oom-kill-disable参数实际设置的就是这是了同级目录之下的memoryoom_control,设置此参数就相当于做了如下动作

bash> echo 1 >memoryoom_control

对linux memory cgroup感兴趣的朋友可以参考:

>

在docker下搭建pxc集群,直接拉取的镜像,创建了5个pxc容器,但是当测试负载均衡,挂掉一个节点的时候,没重新启动节点,等第二天接着来的时候,启动这个节点,却出现docker容器闪退的问题。

看了日志,并没有提示什么

1)内存问题,调整了内存到4G,然后问题没有解决。。。

2)Docker占用的磁盘空间不足,执行了命令docker system df,查看了Docker的磁盘使用情况,还算可以,然后对磁盘进行清理,删除关闭的容器、无用的数据卷和网络,清理了日志,日志占用了好大空间啊,然后然后,问题还是没有解决。。。

3)看到网上大部分都是关于 Docker容器后台运行,就必须有一个前台进程,

容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

刚开始看没明白这说的是个啥,我没涉及到前后台呢

然后就利用自己创建的容器,观察里面的进程

就是:

当创建一个Docker容器的时候,就会新建一个PID namespace。容器启动进程在该名空间内PID为1。当PID1进程结束之后,Docker会销毁对应的PID名空间,并向容器内所有其它的子进程发送SIGKILL。

使用命令

你会看见

使用命令

使用docker exec命令进入容器PID名空间,并执行应用。通过ps -ef命令,可以看到容器里包含一个PID为1的进程,CMD里,它是容器的启动进程

利用docker top命令,可以让我们从宿主机看到容器的进程信息。容器node1是一个独立的进程,父进程 Docker Daemon。所以Docker可以父子进程的方式在Docker Daemon和容器之间进行交互。

docker exec命令可以进入指定的容器内部执行命令。由于它启动的进程属于容器的namespace和相应的cgroup。但是这些进程的父进程是Docker Daemon而非容器的PID1进程。

大家可以去再了解了解关于PID的问题,我这就不说了~

因为我这个只是简单的拉取镜像创建的容器,所以,不会这么复杂需要处理那些“孤儿”进程和“僵尸”进程,或者像采用网上的前台开启一个进程的方式,这个原因我也给pass掉了。。。

❤折腾了好几天,坚持就是好滴~~

❤因为是初创容器,所以里面没有重要的东西,每天我没事就来一遍,把容器删掉,重新拉取镜像几次后,终于日志有反应了,在日志里发现了问题

按照提示信息需要编辑文件grastatedat ,并设置 safe_to_bootstrap=1

1)退到根目录下

2)修改下面每一个grastatedat 里面的safe_to_bootstrap=0改为 :

保存

3)重新启动容器node1

4)查看 docker ps -a 就启动起来了

其他节点也重新设置了一下,

过一会在看的时候,也没有出现闪退情况。

❤至于为啥刚开始日志没有显示,我也不清楚,

估计是镜像拉取和我的机器之间的数据跑偏了吧~哈哈哈哈哈,愁人

为了这一个问题打扰到好多人,谢谢大家啦~

以上就是关于docker 中 jvm 参数设置的坑全部的内容,包括:docker 中 jvm 参数设置的坑、如何设置Docker容器中Java应用的内存限制、极空间docker安装到内存等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9449548.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存