specify-memory-and-cpu-of-the-container
限制 Docker 容器所使用的 Memory、CPU 资源。
Memory
Memory 的控制主要涉及的选项为 memory 和 memory-swap。这两个选项的不同组合有着不同的含义。
注:如不特别说明,
memory和memory-swap均指正整数;[ a \ b ] 表示同时设置 a 和 b。
[ memory \ memory-swap,memory != memory-swap ]
memory-swap = memory + swapswap= memory-swap -memory
[ memory \ memory-swap,memory == memory-swap ]
容器将不能使用 swap,即 swap = 0。
[ memory ]
swap = memory * 2
[ memory-swap == 0 ]
memory-swap 的设置将被忽略,相当是没有设置 memory-swap。
[ memory-swap == -1 ]
容器的 swap 和宿主机的 swap 大小一样。
注意
不能直接在容器内部执行相关的查看命令(如 free)查看容器内存的“限制”信息,这类命令(如 free)在容器中得到数据是和宿主机上的数据是一样的。
可以使用 docker stats container 或者 docker inspect 查看容器的资源“限制”信息。
CPU
CPU 的控制(数量)主要涉及的选项为 cpu-period 和 cpu-quota,如果是 Docker 1.13 及以上,可以用更方便的 cpus 取代。另外还有 cpuset-cpus 用于指定容器进程使用哪个 CPU,有点类似于 taskset。
注意:这里的 CPU,指的是逻辑 CPU。
cpu-period、cpu-quota
cpu-period:The length of a CPU period in microseconds.cpu-quota:Microseconds of CPU time that the container can get in a CPU period.
cpu-period 的默认值为 100 毫秒(cpu-period 给的是 100000,应该是换算为微秒了),没什么特别需求不用更改。
实际 CPU 的使用量为 cpu-quota/cpu-period,cpu-quota 使用默认值 100000。
如果限制为一个 CPU 的 50%(半个 CPU),cpu-quota 则为 50000。
1 | # 更多例子 |
cpus
cpus:Number of CPUs.
虽然 cpus 可以很方便地达到和 cpu-period、cpu-quota 基本“一样”的效果,但是 cpus 并不是在内部(Docker Engine API 层)转换为 cpu-period、cpu-quota。cpus 选项实际上设置的是 API 里面的 NanoCPUs。
NanoCPUs:CPU quota in units of 1e-9 CPUs.
1 cpus = 1000000000 NanoCPUs
cpuset-cpus
cpuset-cpus:CPUs in which to allow execution (0-3, 0,1).
cpuset-cpus 的优先级要比 cpu-quota、cpu-period 和 cpus 高。cpuset-cpus 为 0-3 表示容器进程可以运行在 0 到 3 号 CPU 上,0,1 表示容器进程可以运行在 0 和 1 号 CPU 上。
如果 cpuset-cpus 为 0,则表示容器进程只可以运行在 0 号 CPU 上。
cpu-quota/cpu-period 或 cpus 的“有效值”永远是小于或者等于 cpuset-cpus 所涉及到的 CPU 数量。
即是说,当 cpu-quota/cpu-period 或 cpus 的值为 2 时,如果 cpuset-cpus 所涉及到的 CPU 数量只有一个,如 0 号 CPU。那么容器最多只能使用 0 号 CPU 100% 的资源(一个 CPU)。
注意
如果是使用 cpus 限制容器的 CPU 数量,当指定的数量大于宿主机的 CPU 数量时,会返回不能指定大于宿主机的 CPU 数量的提示。
而用 cpu-quota 和 cpu-period 时,当他们的比值大于宿主机的 CPU 数量时,是不会报错的。因为 cpu-quota 指定的是“上限配额”,如果 cpu-quota/cpu-period 大于宿主机的 CPU 数量时,则是表示可以使用所有的 CPU 资源。
注:关于 cpu-period 和 cpu-quota 更详细的信息,请看参考。
参考
- Blog Link: https://unihon.github.io/2019-08/specify-memory-and-cpu-of-the-container/
- Copyright Declaration: The author owns the copyright. Please indicate the source reproduced!