【发布时间】:2018-02-05 08:30:40
【问题描述】:
我知道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 和 --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 显示了 256 MB 的 RES 和 2000 MB 的 VIRT。但是,这实际上意味着什么?容器内的进程尝试使用超过允许的内存时会发生什么?在哪种意义上它受到-m的约束?
【问题讨论】: