docker限制cpu、内存使用

本文介绍了如何在Docker中通过CFS调度限制容器CPU使用,包括设置--cpus、--cpu-period、--cpu-quota等选项,以及如何使用实时调度。同时详细讲解了如何限制内存使用,如--memory、--memory-swap、--memory-reservation等参数的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.docker限制cpu使用

1.1 使用CFS调度

默认情况下,容器可以无限制地使用主机的cpu资源,可以通过设置参数来进行限制。一般都采用Linux默认的CFS调度法,当然也可以使用实时调度。CFS调度可以使用如下参数来进行限制:

  1. --cpus=<value>:限制容器可以使用多少cpu,可以设置为小数,例如可以设置--cpus=1.5。该选项代表使用cpu的百分比,而不是具体的个数。例如主机一共有四个cpu,设--cpus=2,不代表有两个cpu被100%占用,另外两个完全空闲,可能四个cpu各被占用50%。docker1.13版本开始支持该选项,之前的版本配合使用--cpu-period和--cpu-quota选项,设置--cpus=1.5相当于设置--cpu-period=100000和--cpu-quota=150000。
  2. --cpu-period=<value>:指定cpu CFS的周期,通常和--cpu-quota一起使用,单位是us。默认值是100毫秒,但是大多用户一般不会改变这个值,使用--cpus=<value>更加方便。
  3. --cpu-quota=<value>:指定容器在一个cpu CFS调度周期中可以使用cpu的时间,单位是us。通常和--cpu-period一起使用,一般使用--cpus=<value>更加方便。
  4. --cpuset-cpus=<value>:限制容器可以使用指定的cpu,如果有多个cpu,可以以逗号分隔或者使用连字符进行指定,比如1,3代表使用第1和第3个cpu,0-3代表使用编号为0,1,2,3的cpu。
  5. --cpu-shares=<value>:容器使用cpu的权重,默认值是1024,不设置或者将其设置为0都将使用默认值,数值越大权重越大。这是一个软限制,只有cpu资源不足时才生效。当cpu资源充足时,各个容器可以在不超过资源限制的条件下使用cpu资源;当cpu资源不足,并有多个容器竞争cpu资源时,系统会根据每个容器的权值和所有容器权值的比例来给容器分配 cpu使用时间,如果容器A设置为--cpu-shares=2048,容器B设置为--cpu-shares=1024,容器A会被分配大约66%的cpu时间,容器B被分配大约33%的cpu时间。

1.2 使用实时调度

对于某些不能使用CFS调度的任务,可以将容器配置成实时调度模式。首先要保证主机内核配置正确,然后才能配置docker守护进程和容器。通过运行zcat /proc/config.gz | grep CONFIG_RT_GROUP_SCHED命令或者检查是否存在/sys/fs/cgroup/cpu.rt_runtime_us文件来确定内核是否允许实时调度;然后在运行docker守护进程的时候,使用--cpu-rt-runtime=<value>参数来设置在一个运行周期内,分配给实时调度任务的时间,例如默认周期为1s,如果设置--cpu-rt-runtime=950000,可以确保使用实时调度配置的容器每1s内可以运行0.95s,留下0.05s给非实时任务,也可以使用systemd来进行永久有效的设置,可以参考https://docs.docker.com/config/daemon/systemd/。在运行容器时,可以使用如下参数进行限制:

  1. --cap-add=sys_nice:赋予容器CAP_SYS_NICE的能力,允许容器增加进程友好值、设置实时调度策略、设置cpu亲和性和其他操作。
  2. --cpu-rt-runtime=<value>:在docker守护进程的实时调度程序周期内,容器可以以实时优先级运行的最长时间,单位为us,必须设置了--cap-add=sys_nice参数才能使用。
  3. --ulimit rtprio=<value>:允许容器设置的最大实时优先级,必须设置了--cap-add=sys_nice参数才能使用。

例子:

docker run -it \

    --cpu-rt-runtime=950000 \

    --ulimit rtprio=99 \

    --cap-add=sys_nice \

debian:jessie

2.docker限制内存使用

  1. -m= <value>或--memory=<value>:内存限制,最小值为6m。
  2. --memory-swap =<value>:内存+交换分区的总限制,只有设置了-m之后,这个参数才有意义。如果--memory=300m,--memory-swap=1g,那么容器可以使用300m的内存和700m的交换分区;如果设置的数值和--memory一样,那么容器无法使用交换分区;如果该值没有设置,容器最多可以使用和--memory一样大的交换分区;如果该值设置为0,那么相当于没有设置;如果设置为-1,可以使用的交换分区大小无限制。此外,可以用docker stats containerID来查看某个容器的运行状态。
  3. --memory-swappiness=<value>:默认情况下,容器的内核可以交换出一定比例的匿名页,此参数用来设置可用的比例。数值在0-100之间,0代表关闭匿名页交换,100表示所有匿名页都可以交换。如果没有设置该值,该值默认从父进程继承而来。
  4. --memory-reservation=<value>:是一种软性限制,确保容器不会长时间占用超过--memory-reservation限制的内存大小,但是不保证时时刻刻都不超过该限制值。当该值比--memory小时,在主机内存资源紧张时,会强迫容器的内存占用不超过该值;没有设置时,该值和--memory的值相同;将其设置为0或者大于--memory时,相当于没有设置。
  5. --kernel-memory=<value>:容器可以使用的最大内核内存值,最小值为4m。
  6. --oom-kill-disable:默认情况下,OOM错误发生时,主机会杀死容器进程来获取更多内存。使用该选项,可以避免容器进程被杀死,但是应该在设置了-m/--memory参数之后才使用该选项,不然不限制容器内存使用,却禁止主机杀死容器进程,当出现OOM错误时,系统会杀死主机进程来获取内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值