默认情况下容器可以无限制地使用主机的 CPU 和内存资源,可通过设置参数来进行限制。下面说说 Docker 如何限制 CPU 内存使用!
--cpus=VALUE
:限制容器可使用多少 CPU,可设置为小数,如可以设置--cpus=1.5
。该选项代表使用 CPU 的百分比,而不是具体的个数。例如主机一共有四个 CPU,设--cpus=2
,不代表两个 CPU 被 100%占用,另外两个完全空闲,可能四个 CPU 各被占用 50%。
--cpu-period=VALUE
:指定 CFS 的周期,通常和--cpu-quota=VALUE
一起使用,单位毫秒。默认是 100 毫秒,但大多用户一般不会改变这个值,使用--cpus=VALUE
更方便。
--cpu-quota=VALUE
:指定容器在一个 CFS 调度周期中可使用 CPU 的时间,单位毫秒。通常和--cpu-period=VALUE
一起使用,一般使用--cpus=VALUE
更方便。
--cpuset-cpus=VALUE
:限制容器可以使用指定的 CPU。如果有多个 CPU,可以以逗号分隔或者使用连字符进行指定。
--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 时间。
--cap-add=sys_nice
:赋予容器 CAP_SYS_NICE 的能力,允许容器增加进程的友好值、设置实时调度策略、设置 CPU 亲和性和其它的操作。
--cpu-rt-runtime=VALUE
:在 Docker 守护进程的实时调度程序周期内,容器可以实时优先级运行的最长时间,单位毫毛,必须设置了--cap-add=sys_nice
参数才能使用。
--ulimit rtprio=VALUE
:允许容器设置的最大实时优先级,必须设置了--cap-add=sys_nice
参数才能使用。
--memory=VALUE
:内存限制,最小值 6M。
--memory-swap=VALUE
:内存加交换分区的限制,只有设置了--memory=VALUE
之后,这个参数才有意义。如--memory=300m --memory-swap=1g
,那么容器可使用 300M 的内存和 700M 的交换分区;如设置的数值和--memory=VALUE
一样,那么容器无法使用交换分区;如果该值没有设置,容器最多可以使用和--memory=VALUE
一样大的交换分区;如果该值设置为 0,等于没有设置;如果设置为-1,可以使用的交换分区大小无限制。
--memory-swappiness=VALUE
:默认情况下容器的内核可交换出一定比例的匿名页,此参数用来设置可用的比例。数值在 0-100 之间,0 代表关闭匿名页交换,100 表示所有匿名页都可交换。如果没有设置该值,该值默认从父进程继承而来。
--memory-reservation=VALUE
:是种软性限制,确保容器不会长时间占用超过--memory-reservation=VALUE
限制内存大小,但不保证时时刻刻都不超过该限制值。该值比--memory=VALUE
小时,在主机内存资源紧张时,会强迫容器内存占用不超过该值;在没有设置时,该值和--memory=VALUE
的值相同;将其设置为 0 或者大于--memory=VALUE
时,等于没有设置。
--kernel-memory=VALUE
:容器可以使用的最大内核内存值,最小值 4M。
--oom-kill-disable
:默认情况下 OOM 错误发生时,主机会杀死容器进程来获取更多内存。使用该选项可以避免容器进程被杀死,但是应该在设置了--memory=VALUE
参数之后才能使用该选项,不然不会限制容器内存使用,却禁止主机杀死容器的进程,出现 OOM 错误时,系统会杀死主机进程来获取内存。