文章目录
- Namespace
- PID namespace
- 如何创建一个PID namespace
- Cgroups
- Reference List
Docker基于Linux内核特性,实现了轻量级的操作系统概念。所谓轻量级的操作系统,也就意味着进程ID,内存,网络等都是独立的,为了使容器(轻量级操作系统)能够在物理机上运行,需要在物理机上对这些容器做出资源做出规划,比如允许使用多少带宽,内存等。
为了对一组进程进行资源规划和资源隔离,看了这么多,Namespace(命名空间)是用来作资源隔离的,Cgroup(控制组)是用来做资源限制的。
Namespace
隔离的意义在于处于不同命名空间下的进程不能看到对方的信息。命名空间在Liunx内核中,不是一块分配,你可以定制隔离程度,比如只隔离网络,但不隔离进程ID空间。下面是命名空间可以隔离的七种类型:
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
- https://linux.die.net/man/1/cgcreate
- https://www.linuxidc.com/Linux/2015-01/111239.htm
- http://www.linuxdown.net/install/2018/0928/27272.html