云端:
subsystem实际上就是cgroups的资源控制系统。
- blkio: 这个subsystem可以为块设备设定输入/输出限制,比如物理驱动设备(包括磁盘、固态硬盘、USB等)。
- cpu: 这个subsystem使用调度程序控制task对CPU的使用。
- cpuacct: 这个subsystem自动生成cgroup中task对CPU资源使用情况的报告。
- cpuset: 这个subsystem可以为cgroup中的task分配独立的CPU(此处针对多处理器系统)和内存。
- devices 这个subsystem可以开启或关闭cgroup中task对设备的访问。
- freezer 这个subsystem可以挂起或恢复cgroup中的task。
- memory 这个subsystem可以设定cgroup中task对内存使用量的限定,并且自动生成这些task对内存资源使用情况的报告。
- perf_event 这个subsystem使用后使得cgroup中的task可以进行统一的性能测试。{![perf: Linux CPU性能探测器,详见https://perf.wiki.kernel.org/index.php/Main_Page]}
- *net_cls 这个subsystem Docker没有直接使用,它通过使用等级识别符(classid)标记网络数据包,从而允许 Linux 流量控制程序(TC:Traffic Controller)识别从具体cgroup中生成的数据包。
边端:
- cgroup.controllers展示了当前cgroup能限制的资源类型。
$ cat cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc
$ cat cgroup.subtree_control
cpuset cpu io memory hugetlb pids rdma misc
- cgroup.subtree_control限制了下层级可以设限的资源种类。
- cgroup.events:展示当前cgroup中是否有进程,以及当前cgroup是否为frozen状态。
- cgroup.type:当前cgroup类型,如默认类型domain;线程类型threaded等等。
- cgroup.threads:和cgroup.procs差不多,只是单位为线程,内容为tid。
- cgroup.max.descendants:当前cgroup允许的最大子cgroup个数。
- cgroup.max.depth:当前cgroup允许的最大子cgroup深度。 cgroup.stat:展示当前cgroup状态。
- cgroup.freeze:设置其是否为freeze状态。
cgroupfs驱动
cgroupfs驱动是指在不同操作系统中对cgroupfs的实现方式和特性不同。
在Linux操作系统中,cgroupfs驱动主要有以下几种:
-
cgroup v1:是最早实现的cgroupfs驱动,将cgroup目录结构以层级树的形式组织,使用文件系统的形式提供限制和控制接口。
-
cgroup v2:是对cgroup v1的改进版本,引入了新的目录结构和接口。cgroup v2使用单个虚拟文件系统,不再以层级树的形式组织,而是以分层的方式进行资源管理。它提供了更加灵活和细粒度的资源控制,支持更多的资源类型。
-
systemd cgroup:systemd 是一种使用cgroup实现的初始化系统,它对cgroup进行了一些自定义的修改和扩展,用于管理和控制系统服务和进程。
这些驱动之间的主要区别在于目录结构、接口和支持的功能。cgroup v2相比于cgroup v1提供了更强大的资源控制和管理能力,但在一些旧的系统中可能仍然使用cgroup v1。而systemd cgroup则是一种特殊的实现方式,适用于使用systemd作为初始化系统的系统。
Docker的cgroupfs驱动可以在Docker的配置文件中进行配置,具体路径为/etc/docker/daemon.json
。
如果该文件不存在,则可以创建该文件,并添加以下配置内容:
{"cgroupfs": "/path/to/cgroupfs"
}
其中,/path/to/cgroupfs
是cgroupfs驱动所在的路径。配置完成后,保存文件并重启Docker服务使其生效。