Docker容器资源怎么限制
更新:HHH   时间:2023-1-7


这篇文章主要介绍“Docker容器资源怎么限制”,在日常操作中,相信很多人在Docker容器资源怎么限制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Docker容器资源怎么限制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Memory

--memory可以单独使用,但是--memory-swap是必须要与--memory一起使用的。

正常情况下,--memory-swap的值包含容器可用内存和可用swap。所以--memory="300m" --memory-swap="1g" 的含义为:容器可以使用300M的物理内存,并且可以使用700M(1G -300M)的swap。--memory-swap 是容器可以使用的物理内存和可以使用的swap之和!

把--memory-swap设置为0和不设置是一样的,此时如果设置了--memory,容器可以使用的swap大小为--memory值的两倍。

如果--memory-swap的值和--memory相同,则容器不能使用swap。

如果--memory-swap没有设置,--memory设置了,则容器可以使用两倍--memory容量的swap。--memory="300m" --memory-swap没有设置,相当于可以使用300m内存+600m的swap  

如果--memory-swap设置为-1,相当于不限制swap的容量,但是会受限于host主机的swap容量  

在容器内部,free看到的swap是host的swap,并不是容器可用的swap容量  

--oom-kill-disable  当OOM发生的时候,内核会kills掉容器内的进程,为了改变这种行为,可以在设置--memory的时候,同时设置--oom-kill-disable。如果没有设置--memory,则host可能会OOM,这时候内核会kill host的系统进程来释放memory

    Java内存分配,由于java程序可以在程序启动的时候设置自己的jvm堆栈大小,所以怎么处理容器的内存限制和jvm本身的内存限制是一个问题。java最近几年更新也很快,有版本帝的气质了,不同的jdk版本对容器的支持程度还不一样。

java8u131-
在容器内部通过设置-Xmx参数来指定堆栈大小


java8u131+  java9
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap


java10
-XX:-UseContainerSupport

CPU

    Docker的CPU调度分为两种,一种是CFS调度,一种是realtime调度。

        CFS:CFS是linux内核默认的普通进程的调度cpu调度策略

        Realtime:docker1.13之后还支持realtime调度,还需要更高版本的内核。

    CFS

docker-1.13+  --cpus个数,可以是小数,表示容器可以使用的cpu个数 
docker-1.13-  --cpu-period和--cpu-quota单位是毫秒,组合起来表示容器可以使用的cpu个数,cpus是这两个命令的整合
--cpuset-cpus 绑定cpu,可以让容器在固定的host cpu上运行
--cpu-shares  设置每个容器占cpu的权重,默认值是1024,设置为0表示使用默认值1024

    Realtime

        需要看内核是否支持CONFIG_RT_GROUP_SCHED,Docker守护进程启动时,是否添加--cpu-rt-runtime参数。    

--cap-add=sys_nice
--cpu-rt-runtime=<value>
--ulimit rtprio=<value>

到此,关于“Docker容器资源怎么限制”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注天达云网站,小编会继续努力为大家带来更多实用的文章!

返回云计算教程...