Linux系统每个进程都可以自由竞争系统资源,有时会导致某个进程占用系统大部分资源,所以引入linux cgroups来控制进程资源。简单理解就是资源隔离。Linux cgroups是一种资源管理机制,用于限制、控制与分离进程组的资源。它通过控制组(cgroup)来实现资源的分配和限制,允许系统管理员对进程的CPU、内存、磁盘输入输出等资源进行管理。cgroups的层级结构使得资源控制更加灵活,可以对不同层级的资源进行不同的限制和管理。
(1)隔离一个进程集合(Nginx的所有进程),并限制它们消耗的资源,比如绑定CPU核数。(3)为这组进程分配相应的网络带宽和磁盘存储限制。[root@sjss-team-test-1 ~]# uname -r3.10.0-1160.el7.x86_64[root@sjss-team-test-1 ~]# cat /boot/config-3.10.0-1160.el7.x86_64 | grep CGROUPCONFIG_CGROUPS=y# CONFIG_CGROUP_DEBUG is not setCONFIG_CGROUP_FREEZER=yCONFIG_CGROUP_PIDS=yCONFIG_CGROUP_DEVICE=yCONFIG_CGROUP_CPUACCT=yCONFIG_CGROUP_HUGETLB=yCONFIG_CGROUP_PERF=yCONFIG_CGROUP_SCHED=yCONFIG_BLK_CGROUP=y# CONFIG_DEBUG_BLK_CGROUP is not setCONFIG_NETFILTER_XT_MATCH_CGROUP=mCONFIG_NET_CLS_CGROUP=yCONFIG_NETPRIO_CGROUP=y[root@sjss-team-test-1 ~]#
对应的CGROUP项为‘y’代表已经打开linux cgroups功能。(2)Cgroup:Cgroups中的资源控制都以cgroup为单位实现/cgroup安装某种资源控制标准划分任务组,包含一个或多个Subsystem。一个任务可以加入某个cgroup,也可以从一个cgroup迁移到另一个cgroup。(3)Subsystem:Cgroups中的subsystem就是一个资源调度控制器,利润也控制cpu时间分配,限制cgroup内存使用量。(4)Hierarchy:hierachy由多个cgroup以树状排列而成,每个hierarchy通过绑定对应的subsystem进行资源调度。6、Subsystems, Hierarchies,Control Group和Tasks之间组织结构和规则(1)规则一:一个 hierarchy 可附加多个 subsystem,例如 cpu 和 memory 可同时附加到同一个 hierarchy 上。
(2)规则二:一个 subsystem 可附加到多个 hierarchy,但前提是这些 hierarchy 都只有它这一个 subsystem。换句话说,已附加到某 hierarchy 的 subsystem,不能再附加到含有其他 subsystem 的 hierarchy 上。
(3)规则三:同一 hierarchy 内,一个 task 只能属于一个 cgroup;不同 hierarchy 间则互不影响。新建 hierarchy 时,系统所有 task 默认归入其 root cgroup。把 task 加入同一 hierarchy 的另一个 cgroup,会自动从原 cgroup 移除;但同一个 task 可以分别存在于多个不同 hierarchy 的 cgroup 中。
例:cpu + memory 附加到 cpu_mem_cg,net_cls 附加到 net_cls hierarchy;httpd 进程同时加入前者的 cg1 和后者的 cg2,即可分别受到 CPU、内存与网络带宽的限制。
(4)规则四:fork 出的 child task 默认与父进程同属一个 cgroup,但可被移出。fork 完成后,父子进程在 cgroup 归属上相互独立。
7、hierarchy和cgroup操作
1)新建hierarchymkdir cgroup/hy_cpu_mem 2)使用mount命令挂载hierarchy(hy_cpu_mem),并附加cpu、memory到该hierarchy上 mount -t cgroup -o cpu, cpuset,memory hy_cpu_mem cgroup/hy_cpu_mem3)在已挂载的 hierarchy 上重新指定 subsystem 集合 mount -t cgroup -o cpu,cpuset,hy_cpu_mem cgroup/hy_cpu_mem 4)卸载hierarchy umount cgroup/hy_cpu_mem
cgroup
1)创建cgroupmkdir cgroup/hy_cpu_mem/cgroup12)设置cgroup参数sudo echo 100000 > cpu.cfs_period_us3)移动task(进程)只要把对应的进程PID加入到新cgroup的task中即可,如:echo 30167 > newcgroup/tasks
8、 subsystem介绍
Linxu中为了方便用户使用cgroups,已经把其实现成了文件系统,其目录在/var/fs/cgroup下:
[root@sjss-team-test-1 ~]# ll /sys/fs/cgrouptotal 0drwxr-xr-x 5 root root 0 Jun 23 17:04 blkiolrwxrwxrwx 1 root root 11 Jun 23 17:04 cpu -> cpu,cpuacctlrwxrwxrwx 1 root root 11 Jun 23 17:04 cpuacct -> cpu,cpuacctdrwxr-xr-x 5 root root 0 Jun 23 17:04 cpu,cpuacctdrwxr-xr-x 3 root root 0 Jun 23 17:04 cpusetdrwxr-xr-x 5 root root 0 Jun 23 17:10 devicesdrwxr-xr-x 3 root root 0 Jun 23 17:04 freezerdrwxr-xr-x 3 root root 0 Jun 23 17:04 hugetlbdrwxr-xr-x 5 root root 0 Jun 23 17:04 memorylrwxrwxrwx 1 root root 16 Jun 23 17:04 net_cls -> net_cls,net_priodrwxr-xr-x 3 root root 0 Jun 23 17:04 net_cls,net_priolrwxrwxrwx 1 root root 16 Jun 23 17:04 net_prio -> net_cls,net_priodrwxr-xr-x 3 root root 0 Jun 23 17:04 perf_eventdrwxr-xr-x 5 root root 0 Jun 23 17:04 pidsdrwxr-xr-x 5 root root 0 Jun 23 17:04 systemd[root@sjss-team-test-1 ~]#
我们可以看到/sys/fs/cgroug目录下有多个子目录,这些目录都可以认为是收cgroups管理的subsystem资源。每个subsystem对应如下:
blkio — 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
cpu — 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
cpuacct — 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
cpuset — 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
devices — 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
freezer — 这个子系统挂起或者恢复 cgroup 中的任务。
memory — 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成内存资源使用报告。
net_cls — 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
net_prio — 这个子系统用来设计网络流量的优先级。
hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。