我了解到docker run -m 256m --memory-swap 256m
会限制容器的内存使用量,最多只能使用256MB的内存和不包含交换空间。如果分配的内存超过了这个限制,那么容器中的一个进程(而不是“容器”)将被终止。例如:
$ sudo docker run -it --rm -m 256m --memory-swap 256m \
stress --vm 1 --vm-bytes 2000M --vm-hang 0
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (415) <-- worker 7 got signal 9
stress: WARN: [1] (417) now reaping child worker processes
stress: FAIL: [1] (421) kill error: No such process
stress: FAIL: [1] (451) failed run completed in 1s
显然,其中一个工作者分配的内存超过了允许的范围,因此收到了 SIGKILL
信号。请注意,父进程仍然在运行。
现在,如果指定 -m
的效果是在进程分配太多内存时调用 OOM killer,那么当同时指定 -m
和 --oom-kill-disable
时会发生什么?像上面这样尝试会产生以下结果:
$ sudo docker run -it --rm -m 256m --memory-swap 256m --oom-kill-disable \
stress --vm 1 --vm-bytes 2000M --vm-hang 0
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
(waits here)
在另一个终端中:$ docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f5e4c30d75c9 0.00% 256 MiB / 256 MiB 100.00% 0 B / 508 B 0 B / 0 B 2
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19391 root 20 0 2055904 262352 340 D 0.0 0.1 0:00.05 stress
我发现docker stats
显示内存消耗为256 MB,而top
显示RES
为256 MB,VIRT
为2000 MB。但这实际上意味着什么?如果容器内的进程尝试使用超过允许的内存,会发生什么?在哪些方面它受到-m
的限制?