linux之cgroup简介

190 阅读3分钟

linux之cgroup简介

问题引入

  • cgroup对资源进行限制的配置有效的组织起来的?
通过cgroup层级结构组织在一起, 每个cgroup层级结构负责不同的系统资源
  • 内核如何把cgroup配置和进程关联在一起?

cgroup层级结构中的节点就是一个进程组
  • 内核如何通过cgroup文件系统把cgorups的功能暴露给用户态?

通过vfs,cgroups和vfs之间的衔接部分被称为cgroups文件系统vfs使用一种通用文件系统的设计,具体的文件系统只要实现vfs的设计接口, 就可以注册到vfs中, 从而可以使内核可以读写这种文件系统。  可以类比抽象类和子类的关系,一个负责定义接口, 一个负责对外的设计。

三个组件

  • cgroup: 对进程分组管理的机制
  • subsystem: 资源控制模块: 包含cpu, cpuset, cpuacct, devices, freezer, memoryx等
  • 层级树: 为了继承父节点属性,把一组cgroup节点串称一棵树 场景: 已经有控制组c1(这个控制组限制了cpu的核心数量为1个), 另外一个控制组既想实现限制cpu的核心数又想限制内存,那么就可以继承

三个组件的关系

  • 一个subsystem只能attach到一个层级树中
  • 一个层级树可以附加多个subsystem
  • 一个进程可以作为多个cgroup节点的成员,但是这些成员必须在不同的层级树中
  • 一个进程fork出子进程中, 子进程和父进程在同一个cgroup中, 也可以移动到其他cgroup中

cgroups和system

  • system(之前的init进程)作为pid为1的进程,是系统第一个进程, 负责产生其他所有的用户进程。
  • 通过cgroup层级系统和systemd捆绑, 可以把资源管理设置从进程级别移至应用程序级别,通过使用 systemd单位文件来管理系统资源

cgroups使用方法

  1. 挂载cgroups文件系统 格式为: mount -t cgroup -o {subsystems: cgroup子系统} {name:名字} {path:挂载点} 这条命令底层其实是在内核创建一个cgoups层级结构

查看目前挂载的情况: mount -t cgroup

具体含义说明:
fs_spec on fs_file type fs_vfstype (fs_mntopts)
fs_spec:挂载的块设备或远程文件系统
fs_file:文件系统的挂载点
fs_vfstype:文件系统的类型
fs_mntopts:与文件系统相关的更多选项,不同的文件系统其选项也不太一样
  1. 创建cgroups层级结构中的节点: cgcreate -t root:root -g {subsystem}:{节点name}

  2. 对test下的文件操作,来限制具体资源---具体参考cgroup手册:cgset -r {parmeter}={value} {cgroup_path}

  3. 删除cgroups节点: cgdelete -r {subsystem}:{节点名字}

  4. 将进程加入到cgroup节点

方法1: 写入pid到cgroups子节点的task文件
方法2: cgclassify -g {subsystems}:{cgroup_path} {pidlist}

简单实践

  • docket是如何实现不同container间资源隔离的?
其实就是这些container间使用不同的,cgroups节点(这些节点是在同一层次,不存在父子关系),同一contaner中的进程添加到同一个cgroups节点,以便做到进行同样的资源限制

参考