我已经明白了docker run -m 256m --memory-swap 256m
将限制容器,使其最多可以使用 256 MB 内存且无交换区。如果它分配更多,那么容器中的进程(不是“容器”)将被杀死。例如:
$ 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 杀手,那么当指定时会发生什么-m
and --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
?