容器技术主要包括Namespace和Cgroup这两个内核特性
Namespace又称为命名空间(也可翻译为名字空间),它主要做访问隔离,其原理是针对一类资源进行抽象,并将其封装在一起提供一个容器使用,对于这类资源,因为每个容器都有自己的抽象,而它们彼此之间是不可见的,所以就可以做到访问隔离。
Cgroup是contrl group简称,又称为控制组,它主是要做资源控制,其原理是将一组进程放在一个控制组里,通过给这个控制组分配指定的可用资源,达到控制这一组进程可用资源的目的。
容器组成
容器=cgroup+namespace+rootfs+容器引擎(用户太工具)
Cgroup:资源控制
Namesapce:访问隔离
rootfs:文件系统隔离
容器引擎:生命令周期控制
Cgroup介绍
Cgroup中实现的子系统及其作用如下
devices:设备权限控制
cpuset:分配指定的CPU和内存节点
cpu:控制CPU占用率
cpuacct:统计CPU使用情况
memory:限制内存的使用上限
freezer:冻结(暂停)Cgroup中的进程
net_cls:配合tc(traffic controller)限制网络带宽
net_prio:设置进程的网络流量优先级
huge_tlb:限HugeTLB的使用
perf_event:允许Perf工具基于Cgroup分组做性能监测
Cgroup的接口和使用
挂载cgroupfs
[root@localhost ~]# mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset/
查看cgroupfs
[root@localhost etc]# ls /sys/fs/cgroup/cpuset/
cgroup.clone_children cpuset.cpu_exclusive cpuset.mem_exclusive cpuset.memory_pressure_enabled cpuset.sched_load_balance tasks
cgroup.event_control cpuset.cpus cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_relax_domain_level
cgroup.procs cpuset.effective_cpus cpuset.memory_migrate cpuset.memory_spread_slab notify_on_release
cgroup.sane_behavior cpuset.effective_mems cpuset.memory_pressure cpuset.mems release_agent
创建cgroup
[root@localhost ~]# mkdir /sys/fs/cgroup/cpuset/child
通过mkdir创建一个新的目录,也创建了一个新的Cgroup
配置Cgroup
[root@localhost ~]# echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.cpus
[root@localhost ~]# echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.mems
使用能Cgroup
[root@localhost ~]# echo $$ > /sys/fs/cgroup/cpuset/child/tasks
通过将进程ID写入tasks文件就可以把进程移动到这个Cgroup中,并且这个进程产生的所有子进程也会自动放在Cgroup里,这时Cgroup才真正起作用了,
Cgroup子系统介绍
cpuset子系统可以为一组进程分配指定的CPU和内存节点。
cpuset的主要接口如下
cpuset.cpus:允许进程使用的CPU列表(例如0~4,9)
cpuset.mems:允许进程使用的内存节点列表(例如0~1)
cpu子系统用于限制进程的CPU利用率
CPU比重分配:这个特性
CPU带宽限制
实时进程的CPU带宽限制