文章目录

  • Namespace
  • PID namespace
  • 如何创建一个PID namespace
  • Cgroups
  • Reference List


Docker基于Linux内核特性,实现了轻量级的操作系统概念。所谓轻量级的操作系统,也就意味着进程ID,内存,网络等都是独立的,为了使容器(轻量级操作系统)能够在物理机上运行,需要在物理机上对这些容器做出资源做出规划,比如允许使用多少带宽,内存等。

为了对一组进程进行资源规划和资源隔离,看了这么多,Namespace(命名空间)是用来作资源隔离的,Cgroup(控制组)是用来做资源限制的。

Namespace

隔离的意义在于处于不同命名空间下的进程不能看到对方的信息。命名空间在Liunx内核中,不是一块分配,你可以定制隔离程度,比如只隔离网络,但不隔离进程ID空间。下面是命名空间可以隔离的七种类型:

cgroup和namespace中的cgroup区别 linux cgroup和namespace_bash


PID namespace

linux进程中有namespace属性。linux中可以使用/proc/$PID/ns查看进程的所属命名空间。

$ ls -l /proc/27803/ns
total 0
lrwxrwxrwx 1 root root 0 May 11 22:02 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 May 11 22:02 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 May 11 22:02 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 May 11 22:02 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 May 11 22:02 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 May 11 22:02 uts -> uts:[4026531838]

父进程创建子进程时,子进程默认继承父进程的命名空间。所以就很好理解docker容器里所有进程共享同一命名空间

在容器里使用ps -ef只能看到容器里运行的进程,因为容器和宿主机不属于同一PID进程空间。

如何创建一个PID namespace

# --mount-proc 如何不带这个参数,ps aux 依然会读取主机其他进程
# -f --fork 让/bin/bash命令成为unshare的子进程
# -p --pid 代表pid命名空间
[root@bogon ~]# unshare --mount-proc -fp /bin/bash
[root@bogon ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0 115544  1992 pts/1    S    06:59   0:00 /bin/bash
root         10  0.0  0.0 155472  1844 pts/1    R+   06:59   0:00 ps aux

Cgroups

对资源进行限制的意义在于控制恶意进程大量占用其他进程的资源。这在容器环境下,意味着容器不可以超过它们的资源限定数量。Cgroup也不是内存什么的一块分配,而是分开分配,Cgroup中限制内存使用量的程序为内存子系统,此外,还有限制CPU等资源使用量的子系统 etc.

表2:子系统列表

子系统名称

描述

cpu 子系统

主要限制进程的 cpu 使用率。

cpuacct 子系统

可以统计 cgroups 中的进程的 cpu 使用报告。

cpuset 子系统

可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。

memory 子系统

可以限制进程的 memory 使用量。

blkio 子系统

可以限制进程的块设备 io。

devices 子系统

可以控制进程能够访问某些设备。

net_cls 子系统

可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。

net_prio 子系统

用来设计网络流量的优先级

freezer 子系统

可以挂起或者恢复 cgroups 中的进程。

ns 子系统

可以使不同 cgroups 下面的进程使用不同的 namespace

hugetlb

这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。


Reference List

  1. https://linux.die.net/man/1/cgcreate
  2. https://www.linuxidc.com/Linux/2015-01/111239.htm
  3. http://www.linuxdown.net/install/2018/0928/27272.html