前面我们提到过,容器能够得以实现,主要依赖于内核的种的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
MemoryLinux是如何执行OOME的?
在Linux主机上如果内核探测到当前宿主机,没有足够的内存可用,用于执行重要的功能就会抛出OOME (Out Of Memory Exception)就会去Kill掉这个程序以释放某些资源
- 一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内
- 为此,Docker特地调整了docker daemon 的OOME优选级,以免被内核杀死,但容器的优先级并未被调整
--menory-swappiness:设置使用容器使用交换分区的倾向性【0-100:0能不用就不用,100:不得不用的时候就用,一般是40-60】
--memory-reservation:预留的空间的
--oom-kill-disable:禁止发生OOM后被kill掉
--memory-swap设定之前一定要先设置--memory;没有设置物理内存大小,是不能设置交换分区的
--memory-swap和--memory组合起来的表现设定 CPU容器如果不加以限制的话,是可以使用宿主机上所有的CPU资源的;我们可以进行不同的设置,不过大多数进程调度的时候是使用CFS scheduler 算法的;Docker 1.13版本后,还支持的realtime scheduler
--cups=
--cpu-shares:按照比列分配CPU资源【你需要就按照比例进行分配,如果不需要就会全部吃掉】
--cpuset--cpus:设置CPU的在那个核心上面【0-4】



