前面我们提到过,容器能够得以实现,主要依赖于内核的种的NameSpace,CCgroups
NameSpace(命名空间)

CCgroups(控制组)控制NameSpace(命名空间)来进行资源的分配
1、默认情况下一个Docker中的一个Container是没有资源限制的,调度器能够Container调度多少资源,它都能 吃掉
2、Docker provides 提供了控制Memory,CPU,block IO,从这三个维度来进行控制的,其实它正真能控制前两个Memory,CPU,【我们知道Memeory是不可压缩资源,当一个容器内的进程耗尽CPU时候再次申请CPU,有可能会因为OOM而被kill掉;而CPU没关系【可压缩资源】,你耗费的太多,内核使劲压缩,不会分配给你】
3、这些控制都依赖于LInux capabilites
Memory
Linux是如何执行OOME的?
在Linux主机上如果内核探测到当前宿主机,没有足够的内存可用,用于执行重要的功能就会抛出OOME (Out Of Memory Exception)就会去Kill掉这个程序以释放某些资源
- 一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内
- 为此,Docker特地调整了docker daemon 的OOME优选级,以免被内核杀死,但容器的优先级并未被调整

本文探讨了Docker如何通过NameSpace和CCgroups来控制容器的资源限制,特别是Memory和CPU方面。默认情况下,Docker容器没有资源限制,但可以通过参数如`--memory`、`--memory-swap`、`--cpu-shares`等进行控制。当内存不足时,Linux会触发OOME,Docker守护进程设定了较高的OOME优先级以避免被杀死。同时,介绍了`--memory-swappiness`、`--oom-kill-disable`和`--cpuset-cpus`等选项的用途,帮助管理和限制容器的资源使用。
最低0.47元/天 解锁文章
1343

被折叠的 条评论
为什么被折叠?



