Namespace
概念
Linux namespace是Kernel的一个功能,可以将一些系统资源进行隔离。Namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
用户可以创建指定类型的namespace,并将程序放入该namespace中,表示从前的系统中隔离出一个进程的运行环境,在此运行环境中的进程将认为自己拥有该namespace中的独立资源。 实际即使没有手动创建namespace,Linux系统开机后也会创建一个默认的namespace,称为 root namespace,所有进程默认都运行在root namespace中,每个进程都认为自己拥有该namespace中所有的全局资源。
每一个namespace都是基于当前内核,root namespace直接基于内核,用户创建的namespace运行环境基于当前所在的namespace,不直接基于内核是因为namespace可能会修改某些运行时内核参数。
namespace资源类型
每种资源都是随着Linux内核版本更新逐渐加入的,所以有些内核版本可能不具备某种namespace
namespace类型 |
隔离的资源 |
IPC |
SystemV IPC(信号量、消息队列、共享内存)和POSIX消息队列 |
Network |
网络设备、网络栈、端口 |
Mount |
文件系统挂载点 |
PID |
进程编号 |
User |
用户和用户组 |
UTS |
主机名和NIS域名 |
Cgroup |
Cgroup的根目录 |
查看进程所在的namespace
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ]# ll /proc/$$/ns && ll /proc/1/ns total 0 lrwxrwxrwx 1 root root 0 Jul 4 12:08 ipc -> ipc:[4026531839] lrwxrwxrwx 1 root root 0 Jul 4 12:08 mnt -> mnt:[4026531840] lrwxrwxrwx 1 root root 0 Jul 4 11:35 net -> net:[4026531956] lrwxrwxrwx 1 root root 0 Jul 4 11:35 pid -> pid:[4026531836] lrwxrwxrwx 1 root root 0 Jul 4 12:08 user -> user:[4026531837] lrwxrwxrwx 1 root root 0 Jul 4 12:08 uts -> uts:[4026531838] total 0 lrwxrwxrwx 1 root root 0 Jul 4 11:18 ipc -> ipc:[4026531839] lrwxrwxrwx 1 root root 0 Jul 4 11:18 mnt -> mnt:[4026531840] lrwxrwxrwx 1 root root 0 Jun 30 23:28 net -> net:[4026531956] lrwxrwxrwx 1 root root 0 Jun 30 23:28 pid -> pid:[4026531836] lrwxrwxrwx 1 root root 0 Jul 4 11:18 user -> user:[4026531837] lrwxrwxrwx 1 root root 0 Jul 4 11:18 uts -> uts:[4026531838]
|
路径下的文件都是软连接,指向的文件名中的数字表示namespace的inode,如果不同进程对应的文件的inode相同说明两个进程是在同一个namespace中。
Cgroup
Cgroups(Control Groups) 是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。可以对一组进程及将来的子进程的资源的限制、控制和统计的能力,这些资源包括CPU,内存,存储,网络等。通过Cgroups,可以方便的限制某个进程的资源占用,并且可以实时的监控进程的监控和统计信息。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC (Linux Container)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ]# ll /sys/fs/cgroup/ total 0 drwxr-xr-x 2 root root 0 Jun 30 23:27 blkio #定输入/输出限制 lrwxrwxrwx 1 root root 11 Jun 30 23:27 cpu -> cpu,cpuacct #使用调度程序提供对CPU的cgroup任务访问 lrwxrwxrwx 1 root root 11 Jun 30 23:27 cpuacct -> cpu,cpuacct #自动生成cgroup中任务所使用的CPU报告 drwxr-xr-x 3 root root 0 Jun 30 23:27 cpu,cpuacct drwxr-xr-x 2 root root 0 Jun 30 23:27 cpuset #为cgroup中的任务分配独立CPU(在多核系统)和内存节点 drwxr-xr-x 2 root root 0 Jun 30 23:27 devices #允许或者拒绝 cgroup 中的任务访问设备 drwxr-xr-x 2 root root 0 Jun 30 23:27 freezer #挂起或者恢复 cgroup 中的任务 drwxr-xr-x 2 root root 0 Jun 30 23:27 hugetlb #主要针对于HugeTLB系统进行限制,这是一个大页文件系统 drwxr-xr-x 3 root root 0 Jun 30 23:27 memory #设定 cgroup 中任务使用的内存限制,并自动生成内存资源使用报告 lrwxrwxrwx 1 root root 16 Jun 30 23:27 net_cls -> net_cls,net_prio drwxr-xr-x 2 root root 0 Jun 30 23:27 net_cls,net_prio lrwxrwxrwx 1 root root 16 Jun 30 23:27 net_prio -> net_cls,net_prio drwxr-xr-x 2 root root 0 Jun 30 23:27 perf_event drwxr-xr-x 2 root root 0 Jun 30 23:27 pids drwxr-xr-x 4 root root 0 Jun 30 23:27 systemd
|
Cgroup分配限制资源
拿menory为例,进入/sys/fs/cgroup/memory
下创建test
,这样就相当创建一个menory的控制组,进入到test下会发现自动创建了许多文件,每个文件对应不同的限制条件,再将需要进行限制进程的PID添加到tasks中,这样就对这个进程的menory进行了限制,需要删除的话将这个目录删除即可