1.Namespace
用来做容器的隔离, 有了 namespace,在 docker container 里头看来,就是一个完整的 linux的世界。在 host 看来, container 里的进程,就是一个普通的 host 进程
namespace 包括: pid namespace、ipc namespace、 mnt namespace、 uts
namespace、 user namespace
例子:首先运行一个容器
再创建一个容器,网络模式为 container
从上面可以看出两个容器的 net namespace 编号相同, 说明他们在同一个 net namespace 下,共用一个网络。
Docker 使用了 pid、 network、 mnt、 ipc、 uts 等命名空间来隔离进程、 网络、文件系统等资源。注意,由于 Linux 并不是 namespace 了所有东西,仅靠这几个 namespace 是无法实现像 KVM 那样的完全资源隔离的。
2.Cgroups
他是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups( Control groups) 实现了对资源的配额和度量。
作用:
cgroups有四大功能:
1. 资源限制
2. 定应用运行时使用内存的上限
3.资源的统计
4.进程控制
例子:cgroup 如何做到内存, cpu 和 io 速率的隔离
yum -y install libcgroup-tools
启动Cgroups
systemctl start cgconfig
cgroups如何管理进程cpu资源
在容器里面做个耗cpu的脚本
在宿主机top就可以看到这个脚本占了很多的cpu资源
将 cpu.cfs_quota_us 设为 50000,相对于 cpu.cfs_period_us 的 100000 是 50%
cpu占用率接近50%,cgroups对cpu的控制起了效果
CPU 资源的控制也有两种策略,一种是完全公平调度策略,提供了限额和按比例分配两种方式进行资源控制;另一种是实时调度策略,针对实时进程按周期分配固定的运行时间。配置时间都以微秒为单位,文件名中用 us 表示。
Docker 通过--cpu-shares 指定 CPU 份额
运行一个容器指定 cpu 份额为 1024
例子:
--cpu-shares 为 512。
可以看到 container1 的 CPU 占比为 1024/(1024+512)=2/3, container2 的 CPU 占比为
512/(1024+512)=1/3
可以看到两个容器的cpu占比趋于平均
设定 CPU 使用周期使用时间上限
cpu.cfs_period_us: 设定时间周期(单位为微秒(μs)), 必须与 cfs_quota_us 配合使用。
cpu.cfs_quota_us : 设定周期内最多可使用的时间(单位为微秒(μs))。 这里的配置指 task对单个 cpu 的使用上限。
例子:
则最终生成的 cgroup 的 cpu 周期配置cpu.cfs_period_us:100000 cpu.cfs_quota_us :200000
修改cpu.cfs_period_us;cpu.cfs_quota_us
占了基本50%的cpu资源
内存配额控制
默认情况下, 除了 –memory 指定的内存大小以外, docker 还为容器分配了同样大小的 swap分区,也就是说,上面的命令创建出的容器实际上最多可以使用 256MB 内存,而128MB
内存。 如果需要自定义 swap 分区大小, 则可以通过联合使用 –memory–swap 参数来实现控制。
例子:
可以发现,使用 256MB 进行压力测试时,由于超过了内存上限(128MB 内存+128MB swap),
进程被 OOM(out of memory)杀死
使用 250MB 进行压力测试时,进程可以正常运行
通过 docker stats 可以查看到容器的内存已经满负载了
磁盘io配额控制
blkio-weight使用下面的命令创建两个–blkio-weight 值不同的容器:
在容器中同时执行下面的 dd 命令,进行测试
--blkio-weight:容器默认磁盘 IO 的加权值,有效值范围为 10-1000。