更新时间:2026-08-13 GMT+08:00
分享

cgroup v1与cgroup v2接口对比

背景信息

目前cgroup有两个主要版本:cgroup v1和cgroup v2。cgroup v1与cgroup v2之间存在较多差异,如果从cgroup v1切换到cgroup v2需要参考接口资料进行适配。本文介绍cgroup v1cgroup v2接口的主要区别。

框架接口

表1 cgroup v1框架接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

cgroup.procs

可读可写。

设置/查看cgroup组中运行的线程群组。如果向procs接口写入一个TGID,那么此线程组群将被移至新的cgroup中。显示的TGID列表中,TGID不一定是有序排列的,且可能存在重复的TGID。

cgroup.procs

  • cgroup v2版本中为杜绝子cgroup与父节点内部进程竞争资源的情况启用了层级结构控制器后,进程只能出现在叶子节点(根 cgroup 不受此限制
  • cgroup v2版本中的cgroup.procs不对进程排序输出。

tasks

可读可写。

设置/查看cgroup组中运行的线程。如果向tasks接口写入一个TID,但该线程已经在另一个cgroup中,那么它将从原来的cgroup中移除,并被添加到新的cgroup中。显示的TID列表中,TID不一定是有序排列的,且可能存在重复的TID。

cgroup.threads

cgroup v2版本中的cgroup.threads不对线程排序输出,且是否使能线程化cgroup与控制器cgroup.type有关。

notify_on_release

可读可写。

默认值为0。设置/查看是否启动和禁用release_agent的指令。对于所有非root cgroup,它们将从其父cgroup继承notify_on_release的值。当notify_on_release启用,且cgroup不再包含任何任务时,kernel会执行release_agent中的指令。

NA

cgroup v2版本中的cgroup.events可以监听到cgroup有无进程的状态变化,实现类似功能。

release_agent

可读可写。

默认为空。设置/查看当“notify on release”被触发时要执行的指令。

NA

cgroup.clone_children

可读可写。

默认值为0。只影响cpuset控制器。若在某个 cgroup 中启用了clone_children标志(设为 1),则新的cpuset cgroup在初始化期间将从其父级复制配置。

NA

  
表2 cgroup v2框架接口

cgroup v2接口

作用

是否自研

对应cgroup v1接口

备注

cgroup.controllers

只读。

存在于所有cgroup上的文件,以空格分隔的值。它显示了一个以空格分隔的可用于该cgroup的所有控制器的列表。控制器的顺序不固定。

NA

  

cgroup.events

只读。

非根cgroup都有一个cgroup.events文件,包含以下字段:

  • populated:如果该cgroup或其子cgroup包含任何活动进程,则为1;否则为0。
  • frozen:如果该cgroup已冻结,则为1;否则为0。

NA

  • cgroup v1版本中的notify_on_release和release_agent可以监听到cgroup释放,实现类似功能。
  • cgroup v1版本中的freezer.state也可以获取当前cgroup的冻结状态。

cgroup.freeze

可读可写。

默认值为0。一个存在于非根cgroup上的单值文件。允许的值为0和1。向该文件写入1会导致该cgroup及其所有子cgroup被冻结。这意味着所有属于该cgroup的任务将被停止,并且直到显式解冻该cgroup之前将不会运行。

freezer.state

  • cgroup v2的cgroup.freeze字段:写1/0表示冻结/解冻。
  • cgroup v1的freezer.state字段:FROZEN表示冻结,THAWED表示解冻。

cgroup.kill

只写。

一个存在于非根cgroup上的单值文件。唯一允许的值是1。向该文件写入1会导致该cgroup及其所有子cgroup被终止。这意味着位于受影响cgroup树中的所有进程将通过SIGKILL信号被终止。

NA

  

cgroup.max.depth

可读可写。

默认值为max。范围(0,max]。当前cgroup下允许的最大子层次深度。如果实际的子层次深度相等或更大,则尝试创建新的子cgroup将失败。

NA

  

cgroup.max.descendants

可读可写。

默认值为max。范围(0,max]。允许的最大子cgroup数量。如果实际的子cgroup数量相等或更大,则尝试在层次结构中创建新的cgroup将失败。

NA

  

cgroup.procs

可读可写。

一个存在于所有cgroup上的文件,值以换行符分隔。当读取时,它逐行列出属于该cgroup的所有进程的PID。PID的顺序不固定,并且如果进程被移动到另一个cgroup然后再返回,或者在读取时PID被重新分配,同一个PID可能会出现多次。

cgroup.procs

  • cgroup v2版本中为杜绝子cgroup与父节点内部进程竞争资源的情况启用了层级结构控制器后,进程只能出现在叶子节点(根 cgroup 不受此限制
  • cgroup v2版本中的cgroup.procs不对进程排序输出。

cgroup.stat

只读。

包含以下字段:

  • nr_descendants:可见的子cgroup的总数。
  • nr_dying_descendants:垂死的子cgroup的总数。当用户删除一个cgroup后,该cgroup将变为垂死状态。在完全销毁之前,垂死的cgroup将保持一段时间的未定义时间。

NA

  

cgroup.subtree_control

可读可写。

一个存在于所有cgroup上的文件,以空格分隔的值。初始为空。当读取时,它显示了一个以空格分隔的列表,其中包含启用用于从当前cgroup指定给其子cgroup的资源分配的控制器。可以写入以“+”或“-”为前缀的以空格分隔的控制器列表,以启用或禁用控制器。以“+”为前缀的控制器名称表示启用该控制器,“-”表示禁用。

NA

  

cgroup.threads

可读可写。

一个存在于所有cgroup上的文件,值以换行符分隔。当读取时,它逐行列出属于该cgroup的所有线程的TID。TID的顺序不固定,并且如果线程被移动到另一个cgroup然后再返回,或者在读取时TID被重新分配,同一个TID可能会出现多次。可以将TID写入该文件,以将与该TID关联的线程迁移到目标cgroup。

tasks

cgroup v2版本中的cgroup.threads不对线程排序输出,且是否使能线程化cgroup与控制器cgroup.type有关。

cgroup.type

可读可写。

表示当前cgroup的类型,cgroup类型包括:

  • domain:默认类型。
  • domain threaded:作为threaded类型cgroup的根节点。
  • domain invalid:无效状态cgroup。
  • threaded:threaded类型的cgoup组。

设置的输入只能:threaded。

NA

  

cpu.stat

只读。

用于查看CPU及限流相关的统计数据。

NA

  

cpu.stat.local

只读。

用于本cgroup CPU限流相关的统计数据,字段如下:

  • throttled_usec:任务被限流的总时间。

NA

  

io.pressure

可读可写。

监控io相关的压力指标(需要使能全局PSI)。

io.pressure

cgroup v1 PSI的接口位于cpuacct子系统所在目录下。

memory.pressure

可读可写。

监控内存相关的压力指标(需要使能全局PSI)。

memory.pressure

cpu.pressure

可读可写。

监控CPU相关的压力指标(需要使能全局PSI)。

cpu.pressure

memory接口

表3 cgroup v1 memory接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

memory.usage_in_bytes

只读。

用于查看cgroup组中当前所有进程使用的内存(memory)资源总量,单位为字节。

memory.current

  

memory.memsw.usage_in_bytes

只读。

用于查看cgroup组中所有进程当前使用“内存资源(memory)+ 交换分区资源(swap)”的总量,单位为字节。

memory.swap.current

cgroup v1:memory.memsw.usage_in_bytes统计的是内存与swap一共使用了多少。cgroup v2:memory.swap.current单独统计swap的使用。

注意:memory.memsw.usage_in_bytes统计使用内存资源(memory)+交换分区资源(swap)的总量,但是并非v2中memory.current和memory.swap.current严格意义上的二者之和。

存在一种情况:v1在换入的时候,swap数据没有删除,内存也有数据,memory.memsw.usage_in_bytes只统计一次,即换入后memory.memsw.usage_in_bytes不变。但是在v2是分开统计的,所以memory.swap.current不变,memory.current增加。

memory.limit_in_bytes

可读可写。

用于设置/查看cgroup组可使用内存(memory)资源的限额值,单位为字节。

memory.max

  

memory.memsw.limit_in_bytes

可读可写。

用于设置/查看cgroup组可使用“内存资源(memory)+ 交换分区资源(swap)”的限额值,单位为字节。

memory.swap.max

cgroup v1的memory.memsw.limit_in_bytes是使用内存资源(memory)+交换分区资源(swap)的限额值,因此对应v2中memory.max和memory.swap.max二者之和。

memory.failcnt

可读可写。

用于设置/查看cgroup中所有进程使用内存资源的总量达到 memory.limit_in_bytes 的次数。

NA

  

memory.memsw.failcnt

可读可写。

用于设置/查看cgroup中所有进程使用“内存资源(memory)+ 交换分区资源(swap)”的总量达到memory.memsw.limit_in_bytes的次数。

NA

  

memory.max_usage_in_bytes

可读可写。

用于查看cgroup创建以来使用内存(memory)资源的的峰值,单位为字节。

memory.peak

cgroup v1的memory.max_usage_in_bytes可读写,cgroup v2的memory.peak是只读的。

memory.memsw.max_usage_in_bytes

可读可写。

用于记录cgroup创建以来使用“内存资源(memory)+ 交换分区资源(swap)”总和的峰值,单位为字节。

memory.swap.peak

  • cgroup v1的memory.memsw.max_usage_in_bytes可读写,cgroup v2的memory.swap.peak是只读的。
  • memory.memsw.max_usage_in_bytes统计内存+swap使用的峰值,memory.swap.peak只统计swap使用的峰值。

memory.soft_limit_in_bytes

可读可写。

用于设置/查看内存资源的软限制的限额值,单位为字节。

NA

  

memory.stat

只读。

用于查看当前cgroup组的内存资源的详细统计数据。

memory.stat

字段存在差异。

memory.use_hierarchy

可读可写。

默认值为1,表示子cgroup中的内存会统计到父cgroup中。用于设置/查看是否将子cgroup的内存使用情况统计到当前cgroup里面。该文件内容为0时,表示不使用继承,即父子cgroup之间没有关系;当该文件内容为1时,子cgroup所占用的内存会统计到所有祖先cgroup中。

NA

该接口在6.6 kernel的cgroup v1已经被弃用了,只支持true。cgroup v2相当于true。

memory.force_empty

只写。

用于触发强制内存页回收操作。当设置为0时,cgroup中所有任务使用的内存页会被回收,只有在cgroup中没有进程时才会生效。

NA

  

memory.pressure_level

不支持命令行直接读写操作该文件,这个文件主要用来监控当前cgroup的内存压力,当cgroup组内存使用量达到某种压力状态的时候,内核可以通过eventfd的机制来通知用户程序,这个通知是通过cgroup.event_control和memory.pressure_level来实现。

NA

  

cgroup.event_control

可写。

用于配置cgroup的事件通知,允许cgroup的变更状态通知被发送。

NA

  

memory.swappiness

可读可写。

默认值为60,用于设置/查看控制换出运行时内存到交换分区(swap)的相对权重。值越小,表示让内核交换越少内存页到交换空间,值越大,表示让内核更多地使用交换空间。

NA

  

memory.move_charge_at_immigrate

可读可写。

默认值为1,用于设置/查看当移动cgroup中的进程到其它cgroup组时,是否同时移动该进程使用内存页的统计信息。当memory.move_charge_at_immigrate文件的值设置为0的时候表示关闭这个功能,相当于不累计之前的信息,进程进入的新cgroup中记录的内存使用量是重新从0累计;当memory.move_charge_at_immigrate文件的值为1时,迁移的时候要在新的cgroup中累积(charge)原来信息,并把旧group中的信息给uncharge掉。

NA

  

memory.oom_control

可读可写。

用于设置/查看cgroup组内存超限之后oom相关的处理行为。

NA

cgroup v1查询memory.oom_control中的oom_kill字段可以在cgroup v2的memory.events中获取。

memory.numa_stat

只读。

用于查看NUMA内存节点相关的内存统计信息。

memory.numa_stat

  

memory.high

可读可写。

设置、查看cgroup可使用内存资源的软限制,默认值为max,单位为字节。更多信息请参考:内核memory的多级内存回收策略

memory.high

  

memory.low

可读可写。

设置、查看cgroup内存资源的软保护阈值,默认值为0,单位为字节。更多信息请参考:内核memory的多级内存回收策略

memory.low

  

memory.min

可读可写。

设置、查看cgroup内存资源的硬保护阈值,默认值为0,单位为字节。更多信息请参考:内核memory的多级内存回收策略

memory.min

  

memory.high_async_ratio

可读可写。

异步内存回收功能中配合memory.high一起使用,表示cgroup的警戒水位线与安全水位线的值。更多信息请参考:cgroup异步内存回收

memory.high_async_ratio

  

memory.reclaim

只写。

触发一次内存回收,回收目标值是设置值。

memory.reclaim

  

memory.wb_blkio_ino

可读可写。

表示cgroup回写功能memcg与blkio的绑定关系。

NA

cgroup v2支持cgroup回写功能。

memory.ksm

可读可写。

存在于非root memcg中。写该接口时控制memcg的KSM使能,默认不使能。

NA

  

memory.memfs_files_info

只读。

支持OOM时统计文件内存占用。查询记账到该memcg的rootfs和tmpfs文件的信息。需要用户向/sys/kernel/mm/memcg_memfs_info/enable接口写入1,使能该特性。只打印占用内存大于/sys/kernel/mm/memcg_memfs_info/size_threshold的文件。

NA

  

memory.qos_level

可读可写。

混合部署场景下使用,配置cgroup的内存资源优先级。更多信息请参考:内核memory的OOM进程控制策略

memory.qos_level

  

memory.skip_reclaim_exec_threshold_in_mb

可读可写。

用于设置在内存回收过程中跳过内存回收操作的阈值。

NA

  

memory.zram_usage_in_bytes

只读。

显示绑定到该memcg上的zram设备占用的内存大小。

NA

  

swap_ahead.delay_enable_msec

可读可写。

用于配置开启内存压缩功能后,延时一段时间后进行扫描。

NA

  

swap_ahead.enable

可读可写。

swap增强功能开关,0表示关闭,1表示开启。

NA

  

swap_ahead.enable_swap_default

可读可写。

配置memcg下拉起的进程默认是否允许swap,配置为0时,该memcg下拉起进程的/proc/<pid>/enable_swap为0,表示该进程使用的内存不能swap。

NA

  

swap_ahead.scan_cpu_limit

可读可写。

swap增强功能cpu使用率上限(包括zram压缩使用的cpu在内),单位为1%vcpu。比如配置为3代表限制本功能cpu使用率在3%以下。设置为0表示不进行扫描。

NA

  

swap_ahead.scan_interval_msec

可读可写。

swap增强功能扫描LRU链表间隔时间,代表两次扫描LRU链表之间间隔的时间,单位为毫秒。

NA

  

swap_ahead.scan_len_ratio

可读可写。

用于配置swap增强功能单次扫描LRU链表长度,配置的数值为每次扫描长度占LRU链表总长度比例的倒数。

NA

  

swap_ahead.scan_task

只读。

用于读取当前memcg下swap_memcg扫描线程的pid。

NA

  

swap_ahead.scan_trigger_ratio

可读可写。

swap增强功能使能的内存比例阈值。

NA

  
表4 cgroup v2 memory接口

cgroup v2接口

作用

是否自研

对应cgroup v1接口

备注

memory.current

只读。

用于查看cgroup中当前所有进程使用的内存资源总量,单位为字节。

memory.usage_in_bytes

  

memory.swap.current

只读。

用于查看cgroup中当前所有进程使用的交换分区资源总量,单位为字节。

memory.memsw.usage_in_bytes

cgroup v1:memory.memsw.usage_in_bytes统计的是内存与swap一共使用了多少。cgroup v2:memory.swap.current单独统计swap的使用。

注意:memory.memsw.usage_in_bytes统计使用内存资源(memory)+交换分区资源(swap)的总量,但是并非v2中memory.current和memory.swap.current严格意义上的二者之和。

存在一种情况:v1在换入的时候,swap数据没有删除,内存也有数据,memory.memsw.usage_in_bytes只统计一次,即换入后memory.memsw.usage_in_bytes不变。但是在v2是分开统计的,所以memory.swap.current不变,memory.current增加。

memory.max

可读可写。

用于设置、查看cgroup可使用内存资源的限额值,默认值为max,单位为字节。cgroup使用的内存资源达到限额值后,会触发内存回收,如果无可回收内存,将触发OOM Killer。

memory.limit_in_bytes

  

memory.swap.max

可读可写。

用于设置、查看cgroup可使用交换分区资源的限额值,默认值为max,单位为字节。

memory.memsw.limit_in_bytes

cgroup v1的memory.memsw.limit_in_bytes是使用内存资源(memory)+交换分区资源(swap)的限额值,因此对应v2中memory.max和memory.swap.max二者之和。

memory.min

可读可写。

设置、查看cgroup内存资源的硬保护阈值,默认值为0,单位为字节。更多信息请参考:内核memory的多级内存回收策略

memory.min

  

memory.low

可读可写。

设置、查看cgroup内存资源的软保护阈值,默认值为0,单位为字节。更多信息请参考:内核memory的多级内存回收策略

memory.low

  

memory.high

可读可写。

设置、查看cgroup可使用内存资源的软限制,默认值为max,单位为字节。更多信息请参考:内核memory的多级内存回收策略

memory.high

  

memory.swap.high

可读可写。

设置、查看cgroup可使用交换分区资源的软限制,默认值为max,单位为字节。当cgroup的交换分区资源使用量到达high后,触发本次记账的进程会触发短暂阻塞。

NA

  

memory.reclaim

只写。

用于回收cgroup中指定大小的内存资源,单位为字节。

memory.reclaim

  

memory.peak

只读。

用于查看cgroup自从创建以来最大的内存资源使用量,单位为字节。

memory.max_usage_in_bytes

cgroup v1的memory.max_usage_in_bytes可读写,cgroup v2的memory.peak是只读的。

memory.swap.peak

只读。

用于查看cgroup自从创建以来最大的交换分区资源使用量,单位为字节。

memory.memsw.max_usage_in_bytes

  • cgroup v1的memory.memsw.max_usage_in_bytes可读写,cgroup v2的memory.swap.peak是只读的。
  • memory.memsw.max_usage_in_bytes统计内存+swap使用的峰值,memory.swap.peak只统计swap使用的峰值。

memory.events

只读。

用于查询cgroup及子cgroup的内存资源使用事件的发生次数。

memory.events

cgroup v1查询memory.oom_control中的oom_kill字段可以在cgroup v2的memory.events中获取。

memory.events.local

只读。

类似memory.events,但只统计当前cgroup的事件,不统计子cgroup的事件。

memory.events.local

  

memory.swap.events

只读。

用于查询cgroup及子cgroup的交换分区资源使用事件的发生次数。

NA

  

memory.oom.group

可读可写。

用于查看/设置cgroup是否启用group OOM,默认不开启。当cgroup开启group OOM后,如果cgroup中的任何一个进程因OOM被杀死,cgroup中的全部进程都被杀死。

NA

  

memory.stat

只读。

用于查看cgroup的内存资源使用的详细统计数据,统计数据包含该cgroup及其子cgroup。

memory.stat

字段差异较大。

memory.numa_stat

只读。

用于查看cgroup的各NUMA Node的内存资源使用的详细统计数据,统计数据包含该cgroup及其子cgroup。

memory.numa_stat

  

memory.high_async_ratio

可读可写。

异步内存回收功能中配合memory.high一起使用,表示cgroup的警戒水位线与安全水位线的值。更多信息请参考:cgroup异步内存回收

memory.high_async_ratio

  

memory.qos_level

可读可写。

混部场景使用,配置cgroup的内存资源优先级。更多信息请参考:内核memory的OOM进程控制策略

memory.qos_level

  

cpu/cpuacct接口

表5 cgroup v1 cpu/cpuacct接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

cpu.cfs_quota_us

可读可写。

只对CFS调度器调度的进程有效。默认值为-1,表示CPU使用时间不受cgroup限制,单位为微秒。进程在设置的时间周期长度内,可以使用的CPU时间上限。

cpu.max

cgroup v2版本中cpu.max一个接口可以同时设置quota和period。

cpu.cfs_period_us

可读可写。

只对CFS调度器调度的进程有效。默认值为100ms,表示重新分配CPU资源的时间周期长度,单位为us。

cpu.max

cgroup v2版本中cpu.max一个接口可以同时设置quota和period。

cpu.cfs_burst_us

可读可写。

只对CFS调度器调度的进程有效。表示上一个cfs_period周期中未被使用完的份额可以累计到下一个cfs_period周期中使用的最大值,默认为0,表示不开启cpu burst的功能。

cpu.max.burst

  

cpu.shares

可读可写。

设置cgroup组中进程在CPU资源竞争时的相对权重。

cpu.weight

cgroup v1和v2权重的取值范围不一样。cgroup v1:cpu.shares默认值为1024,值范围[2,262144];cgroup v2:cpu.weight默认值为100,值范围[1,10000]。

cpu.rt_runtime_us

可读可写。

只对RT调度器调度的进程有效。表示cgroup组中实时进程在设置的时间周期长度内,可连续使用的cpu时间上限,单位为微秒,默认值为0,表示不做限制。

NA

cgroup v2没有对应接口。可以通过/proc/sys/kernel/sched_rt_runtime_us设置。

cpu.rt_period_us

可读可写。

只对RT调度器调度的进程有效。表示重新分配CPU资源的时间周期长度,单位为微秒,只对实时调度进程有效,默认值为1000000微秒。

NA

cgroup v2没有对应接口。可以通过/proc/sys/kernel/sched_rt_period_us设置。

cpu.stat

只读。

显示关于CPU使用情况的统计信息。

cpu.stat

  

cpu.qos_level

可读可写。

混合部署场景下使用,配置CPU资源优先级。更多信息请参考:内核cpu cgroup的多级混部调度

cpu.qos_level

cgroup v1接口将任务调度级别扩展到5个级别;cgroup v2目前只支持-1和0两级优先级。

cpuacct.usage

可读可写。

此cgroup中(包括子cgroup)中所有进程使用的cpu总时间,单位是纳秒。

cpu.stat

cgroup v2版本中cpu.stat的 usage_usec字段,单位为us;cgroup v1 cpuacct.usage中的时间则以ns为单位。

cpuacct.usage_sys

只读。

统计此cgroup中(包括子cgroup)所有进程在内核态使用cpu资源的总时间,单位为纳秒。

cpu.stat

  

cpuacct.usage_user

只读。

统计此cgroup中(包括子cgroup)所有进程在用户态使用cpu资源的总时间,单位为纳秒。

cpu.stat

  

cpuacct.usage_percpu

只读。

统计此cgroup中(包括子cgroup)所有进程在每个CPU使用CPU的时间,单位为纳秒。

NA

cgroup v2不再统计单个cpu的数据。

cpuacct.usage_percpu_sys

只读。

统计此cgroup中(包括子cgroup)所有进程在每个CPU在内核态使用CPU的时间,单位为纳秒。

NA

cgroup v2不再统计单个cpu的数据。

cpuacct.usage_percpu_user

只读。

统计此cgroup中(包括子cgroup)所有进程在每个CPU在用户态使用CPU的时间,单位为纳秒。

NA

cgroup v2不再统计单个cpu的数据。

cpuacct.usage_all

只读。

查看每个CPU在用户态和内核态各自消耗的时间。

NA

cgroup v2不再统计单个cpu的数据。

cpuacct.stat

只读。

显示用户态和内核态的 CPU 时间统计。

cpu.stat

cgroup v2 cpu.stat中的user_usec和system_usec字段单位为us。cgroup v1 cpuacct.stat中的时间则以USER_HZ为单位。

cpuacct.normalize_usage

只读。

算力归一化场景下使用。统计cgroup级别的任务归一化的CPU运行时间。

NA

  

cpuacct.nr_select_allowed_cpus

只读。

CPU软绑定功能开启时,统计cgroup组内的任务在唤醒选核时,选择共享核的次数。更多信息请参考:CPU软绑定

cpu.nr_select_allowed_cpus

  

cpuacct.nr_select_prefer_cpus

只读。

CPU软绑定功能开启时,统计cgroup组内的任务在唤醒选核时,选择优先核的次数。更多信息请参考:CPU软绑定

cpu.nr_select_prefer_cpus

  

cpuacct.nr_smoothed_prefer_cpus

只读。

CPU软绑定功能开启时,统计cgroup组内的任务在唤醒选核时,由于平滑算法没有从优先核切换到共享核的次数。更多信息请参考:CPU软绑定

cpu.nr_smoothed_prefer_cpus

  

io.pressure

可读可写。

监控io相关的压力指标(需要使能全局PSI和cgroupv1 PSI)

io.pressure

cgroup v2 PSI的接口位于通用框架目录下。

memory.pressure

可读可写。

监控内存相关的压力指标(需要使能全局PSI和cgroupv1 PSI)

memory.pressure

cpu.pressure

可读可写。

监控CPU相关的压力指标(需要使能全局PSI和cgroupv1 PSI)

cpu.pressure

表6 cgroup v2 cpu接口

cgroup v2接口

作用

是否自研

对应cgroup v1接口

备注

cpu.max

可读可写。

只对CFS调度器调度的进程有效。存在于非根cgroup中,用于限制cgroup中的进程使用cpu带宽,默认值为 "max 100000",单位为微秒,表示cpu的时间周期为100000微秒,且使用时间不受限制。

参数格式:${quota} ${period}

  • ${quota}:表示进程在设置的时间周期内,可以使用的cpu带宽的上限,默认值为max,表示不受限制。
  • ${period}:表示分配cpu资源的时间周期长度,默认值为100000,单位为微秒。

可以仅设置一个值,此时表示对“${quota}”参数进行修改。

cpu.cfs_quota_us和cpu.cfs_period_us

  

cpu.max.burst

可读可写。

只对CFS调度器调度的进程有效。存在于非根cgroup中,表示上一个cfs_period周期中未被使用完的cpu份额可以累计到下一个cfs_period周期中使用的最大值,默认值为0,表示不开启该功能。

cpu.cfs_burst_us

  

cpu.weight

可读可写。

只对CFS调度器调度的进程有效。存在于非根cgroup中,表示cgroup中进程可以使用的cpu时间份额,默认值为100。

cpu.shares

cgroup v1和v2权重的取值范围不一样。cgroup v1:cpu.shares默认值为1024,值范围[2,262144];cgroup v2:cpu.weight默认值为100,值范围[1,10000]。

cpu.idle

可读可写。

存在于非根cgroup中,默认值为0。设置该值为1时,表示其优先级较低,被分配的时间片较少,易被普通任务抢占。

NA

  

cpu.qos_level

可读可写。

混合部署场景下使用,配置CPU资源优先级。更多信息请参考:内核cpu cgroup的多级混部调度

cpu.qos_level

cgroup v1接口将任务调度级别扩展到5个级别;cgroup v2目前只支持-1和0两级优先级。

cpu.nr_select_allowed_cpus

只读。

CPU软绑定功能开启时,统计cgroup组内的任务在唤醒选核时,选择共享核的次数。更多信息请参考:CPU软绑定

cpuacct.nr_select_allowed_cpus

  

cpu.nr_select_prefer_cpus

只读。

CPU软绑定功能开启时,统计cgroup组内的任务在唤醒选核时,选择优先核的次数。更多信息请参考:CPU软绑定

cpuacct.nr_select_prefer_cpus

  

cpu.nr_smoothed_prefer_cpus

只读。

CPU软绑定功能开启时,统计cgroup组内的任务在唤醒选核时,由于平滑算法没有从优先核切换到共享核的次数。更多信息请参考:CPU软绑定

cpuacct.nr_smoothed_prefer_cpus

  

cpuset接口

表7 cgroup v1 cpuset接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

cpuset.cpus

可读可写。

设定该cgroup任务可以访问的CPU。

cpuset.cpus

cgroup v1:

  • 不会自动继承父节点的节点;
  • 如果下线,再上线,对应的cpu不会出现在cpus;
  • 如果要迁入进程,首先需要配置cpus mems,否则迁入失败。
  • 如果cgroup组cpu全部下线,对应的cgroup任务会被迁移至可用的父节点。往里面迁移不可迁移。

cgroup v2:

  • 如果不设置,默认继承最近祖先的节点。
  • 下线的仍然在cpus显示,effective不会显示。
  • 如果没有配置cpus,迁入进程是可以的,使用的最近祖先的有效配置。

cpuset.mems

可读可写。

设定该cgroup中任务可以访问的NUMA内存节点。

cpuset.mems

cpuset.mems规则与cpuset.cpus类似。

注意:内存迁移有一定的消耗,迁移有可能是不完整,有些内存也可能还在原节点上。所以一般在cgroup迁入进程之前,应该把内存节点配置好。避免做迁移。

cpuset.effective_cpus

只读。

表示实际可使用的cpus。

cpuset.cpus.effective

cgroup v1:

  • 如果设置了cpuset.cpus,但是当前cgroup设置在cpuset.cpus的cpu都下线了,则cpuset.effective_cpus为空;

例如:cg2的cpuset.cpus为0-1,当CPU 0-1下线后,cg2的cpuset.effective_cpus将显示空。

cgroup v2:

  • 显示最终有效的cpus。如果设置了cpuset.cpus,但是当前cgroup设置在cpuset.cpus的cpu都下线了,则cpuset.cpus.effective显示不是当前cgroup cpuset.cpus子集,而是当前cgroup继承父节点的、有效的cpus。

例如:cg1的cpuset.cpus为0-3,cg2的cpuset.cpus为0-1,cg1是cg2的父节点,当CPU 0-1下线后,cg2的cpuset.cpus.effective将显示2-3。

cpuset.effective_mems

只读。

表示有效的NUMA内存节点(正常情况下等于cpuset.mems,不同的是该接口感知内存热插拔事件,会显示实际的有效内存节点)。

cpuset.mems.effective

与cpuset.effective_cpus规则类似。

cpuset.cpu_exclusive

可读可写。

值为0或者1。设置其它cpuset及其父、子cpuset是否可共享该cpuset.cpus的特定CPU。默认情况下(0),CPU不会专门分配给某个cpuset。

cpuset.cpus.exclusive

  • 都是表示独占,但设置方法不一样。cgroup v1表示是否独占;cgroup v2设置独占编号。

cgroup v1:

echo 1 > cpuset.cpu_exclusive表示独占cpus,echo 0 > cpuset.cpu_exclusive表示非独占cpus,不能设置编号。

cgroup v2:

echo 0-1 > cpuset.cpus.exclusive表示该cgroup独占0-1核。

  • cgroup v2的cpuset.cpus.exclusive需要需要与cpuset.cpus.partition配合使用。

cpuset.mem_exclusive

可读可写。

值为0或者1。设置其它cpuset是否可共享该cpuset的特定内存节点。默认情况下(0),内存节点不会专门分配给某个cpuset。设置1表示为某个cpuset保留其专用内存节点。

NA

  

cpuset.mem_hardwall

可读可写。

值为0或者1,表示kernel分配内存页和缓冲数据的是否受到cpuset指定的内存节点限制。默认情况下(0),cpuset.mems 只限制用户态内存申请,内核态内存申请不受其限制,但如果设置了mem_hardwall,内核态的内存申请也会受到限制。

NA

  

cpuset.sched_load_balance

可读可写。

值为0或者1。表示是否在cgroup做负载均衡。默认情况下 1,kernel将超载CPU中的进程移动到负载较低的CPU中以便平衡负载。

NA

  

cpuset.sched_relax_domain_level

可读可写。

它代表kernel应尝试平衡负载的CPU宽度范围。必须cpuset.sched_load_balance设置为1才有意义。

NA

  

cpuset.memory_migrate

可读可写。

值为0或者1。用来指定当cpuset.mems的值更改时,是否应该将内存中的页迁移到新节点。默认情况下(0)禁止内存迁移,并且页就保留在原来分配的节点中,即使此节点不再是cpuset.mems指定的节点。如果启用(1),系统会将页迁移到cpuset.mems指定的新参数的内存节点中,如果可能的话会保留其相对位置。

NA

  

cpuset.memory_pressure

只读。

包含该cpuset进程生成的运行平均“内存压力”,用于衡量cpuset中的任务试图释放节点上正在使用的内存的速率,以满足额外的内存请求。

NA

  

cpuset.memory_pressure_enabled

可读可写。

值为0或者1。设定系统是否计算该cgroup进程生成的“内存压力”。计算出的值会输出到cpuset.memory_pressure,代表进程试图释放被占用内存的速率,报告值为:每秒尝试回收内存的整数值再乘以1000。

NA

  

cpuset.memory_spread_page

可读可写。

值为0或者1。设定内存页面是否应在该cpuset的内存节点中均匀分布。默认情况下0,系统不会平均分配内存页面,优先在生成它们的进程所运行的同一节点中分配。

NA

  

cpuset.memory_spread_slab

可读可写。

值为0或者1。设定是否在cpuset中平均分配slab对象。默认情况下0,slab对象不被平均分配,slab对象被置于生成它们的进程所运行的同一节点中。

NA

  

cpuset.preferred_cpus

可读可写。

默认为空。设置cgroup优先使用的CPU范围。根据负载大小动态调节使用CPU范围。具体来说,当负载低于阈值时,调度preferred_cpus集上,负载高时调度到cpuset.cpus范围上。更多信息请参考:CPU软绑定

cpuset.preferred_cpus

  
表8 cgroup v2 cpuset接口

cgroup v2接口

作用

是否自研

对应cgroup v1接口

备注

cpuset.cpus

可读可写。

在非根cgroup。描述了这个cgroup进程申请的CPU列表,逗号隔开:范围是[0,cpu个数)。但是最终真正分配给这个cgroup的CPU列表,可能不同于申请的列表, 因为还要受parent的限制(比如申请了CPU 4但是parent列表里没有4)。这个文件为空时,表示这个cgroup使用离它最近的、非空的祖先cgroup的配置; 如果所有的祖先都为空,那就意味着使用所有可用的CPU。热插拔不影响这个值。

cpuset.cpus

cgroup v1:

  • 不会自动继承父节点的节点;
  • 如果下线,再上线,对应的cpu不会出现在cpus;
  • 如果要迁入进程,首先需要配置cpus mems,否则迁入失败。
  • 如果cgroup组cpu全部下线,对应的cgroup任务会被迁移至可用的父节点。往里面迁移不可迁移。

cgroup v2:

  • 如果不设置,默认继承最近祖先的节点。
  • 下线的仍然在cpus显示,effective不会显示。
  • 如果没有配置cpus,迁入进程是可以的,使用的最近祖先的有效配置。

cpuset.cpus.effective

只读。

列出了所有parent分配给cgroup的且在线的有效cpu。如果cpuset.cpus是空,那么列出所有parent的可用的cpus。cpuset.cpus不为空,cpuset.cpus.effective必须是它的子集。热插拔影响这个值。

cpuset.effective_cpus

cgroup v1:

  • 如果设置了cpuset.cpus,但是当前cgroup设置在cpuset.cpus的cpu都下线了,则cpuset.effective_cpus为空。

例如:cg2的cpuset.cpus为0-1,当CPU 0-1下线后,cg2的cpuset.effective_cpus将显示空。

cgroup v2:

  • 显示最终有效的cpus。如果设置了cpuset.cpus,但是当前cgroup设置在cpuset.cpus的cpu都下线了,则cpuset.cpus.effective显示不是当前cgroup cpuset.cpus子集,而是当前cgroup继承父节点的、有效的cpus。

例如:cg1的cpuset.cpus为0-3,cg2的cpuset.cpus为0-1,cg1是cg2的父节点,当CPU 0-1下线后,cg2的cpuset.cpus.effective将显示2-3。

cpuset.mems

可读可写。

在在非根cgroup。描述了这个cgroup进程申请的mem列表,逗号隔开,有效值[0,mem节点个数)。这个文件为空时,表示这个cgroup使用离它最近的、非空的祖先mem的配置; 如果所有的祖先都为空,那就意味着使用所有可用的mem。热插拔不影响这个值。

cpuset.mems

cpuset.mems规则与cpuset.cpus类似。

注意:内存迁移有一定的消耗,迁移有可能是不完整,有些内存也可能还在原节点上。所以一般在cgroup迁入进程之前,应该把内存节点配置好。避免做迁移。

cpuset.mems.effective

只读。

列出了所有parent分配给cgroup的切在线的有效mem。如果cpuset.mems是空,那么列出所有parent的可用的mems。cpuset.mems不为空,cpuset.mems.effective必须是它的子集。

cpuset.effective_mems

与cpuset.cpus.effective规则类似。

cpuset.cpus.exclusive

可读可写。

存在于非根cpuset的多值文件。它列出了所有允许用于创建新的cpuset分区的独占CPU。除非cgroup成为一个有效的分区根,否则它的值不会被使用。有关cpuset分区的描述,需要与cpuset.cpus.partition配合使用。

cpuset.cpu_exclusive

  • 都是表示独占,但设置方法不一样。cgroup v1表示是否独占;cgroup v2设置独占编号。

cgroup v1:

echo 1 > cpuset.cpu_exclusive表示独占cpus,echo 0 > cpuset.cpu_exclusive表示非独占cpus,不能设置编号。

cgroup v2:

echo 0-1 > cpuset.cpus.exclusive表示该cgroup独占0-1核。

  • cgroup v2的cpuset.cpus.exclusive需要需要与cpuset.cpus.partition配合使用。

cpuset.preferred_cpus

可读可写。

默认为空,设置cgroup优先使用的CPU范围。根据负载大小动态调节使用CPU范围。具体来说,当负载低于阈值时,调度preferred_cpus集上,负载高时调度到cpuset.cpus范围上。更多信息请参考:CPU软绑定

cpuset.preferred_cpus

  

io接口

表9 cgroup v1 io接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

blkio.bfq.weight

可读可写。

默认值为100,在没有单独指定设备权重覆盖的情况下,这是所有设备上该组策略的默认权重,仅存在于非root cgroup。

io.bfq.weight

  

blkio.bfq.weight_device

可读可写。

默认值为100,指定cgroup在每个设备的权重。这些权重覆盖由blkio.bfq.weight指定的组权重,仅存在于非root cgroup。

io.bfq.weight

  

blkio.throttle.read_bps_device

可读可写。

默认值为空,设置cgroup从设备读取的最大字节速度。

io.max

对应cgroup v2的io.max接口中rbps字段。

blkio.throttle.write_bps_device

可读可写。

默认值为空,设置cgroup向设备写入的最大字节速度。

io.max

对应cgroup v2的io.max接口中wbps字段。

blkio.throttle.read_iops_device

可读可写。

默认值为空,设置cgroup从设备读操作的每秒最大操作次数。

io.max

对应cgroup v2的io.max接口中riops字段。

blkio.throttle.write_iops_device

可读可写。

默认值为空,设置cgroup向设备写操作的每秒最大操作次数。

io.max

对应cgroup v2的io.max接口中wiops字段。

blkio.throttle.io_service_bytes

只读。

查看cgroup在设备中传送的字节数。

NA

参考blkio.throttle.io_service_bytes_recursive,cgroup v2设计的cgroup只有叶子cgroup对任务起作用,因此中间cgroup节点不再单独统计io.stat,直接包含了所有子目录cgroup的统计总和。

blkio.throttle.io_service_bytes_recursive

只读。

查看本cgroup及所有子cgroup在设备中传送的字节数。

io.stat

  • cgroup v2的每个目录下io.stat统计值包含了子目录下的io.stat,相当于v1的blkio.throttle.io_service_bytes_recursive。
  • cgroup v1的blkio.throttle.io_service_bytes_recursive中的total字段在v2中没有统计,但是可以根据v2的io.stat的数据进行累积计算得到;另外,v2的io.stat中没有区分sync/async。

blkio.throttle.io_serviced

只读。

查看cgroup在设备中执行 I/O 请求的数量。

NA

参考blkio.throttle.io_serviced_recursive,cgroup v2设计的cgroup只有叶子cgroup对任务起作用,因此中间cgroup节点不再单独统计io.stat,直接包含了所有子目录cgroup的统计总和。

blkio.throttle.io_serviced_recursive

只读。

查看本cgroup及所有子cgroup在设备中执行 I/O 请求的数量。

io.stat

  • cgroup v2的每个目录下io.stat统计值包含了子目录下的io.stat综合,相当于v1的blkio.throttle.io_serviced_recursive。
  • cgroup v1的blkio.throttle.io_serviced_recursive中的total字段在v2中没有统计,但是可以根据v2的io.stat的数据进行累积计算得到;另外,v2的io.stat中没有区分sync/async。

blkio.cost.model

可读可写。

设置指定磁盘的设备模型,只在根cgroup设置。

io.cost.model

  

blkio.cost.qos

可读可写。

设置指定磁盘的QOS(Quality of Service)参数,只在根cgroup设置。

io.cost.qos

  

blkio.cost.weight

可读可写。

设置cgroup的IO下发权重,默认值为100。

io.weight

  

blkio.reset_stats

只写。

向这个文件写入一个整数会导致重置cgroup所有I/O相关统计信息。

NA

  

blkio.bfq.io_service_bytes

只读。

按设备显示BFQ调度器的I/O服务字节数。

NA

cgroup v2只统计cgroup相关的IO,不区分控制策略。

blkio.bfq.io_service_bytes_recursive

只读。

查看本cgroup及所有子cgroup的BFQ I/O服务字节数。

NA

cgroup v2只统计cgroup相关的IO,不区分控制策略。

blkio.bfq.io_serviced

只读。

查看BFQ调度器的I/O操作次数。

NA

cgroup v2只统计cgroup相关的IO,不区分控制策略。

blkio.bfq.io_serviced_recursive

只读。

查看本cgroup及所有子cgroup的BFQ I/O操作次数。

NA

cgroup v2只统计cgroup相关的IO,不区分控制策略。

表10 cgroup v2 io接口

cgroup v2接口

作用

是否自研

对应cgroup v1接口

备注

io.max

可读可写。

设置读写最大值,包括读写字节数和读写IO数,默认为空。

blkio.throttle.read_bps_device

blkio.throttle.read_iops_device

blkio.throttle.write_bps_device

blkio.throttle.write_iops_device

  

io.weight

可读可写。

设置cgroup的IO下发权重,默认值为100。

blkio.cost.weight

  

io.stat

只读。

当前cgroup的io统计。

blkio.throttle.io_service_bytes_recursive

blkio.throttle.io_serviced_recursive

  

io.cost.qos

可读可写。

设置指定磁盘的QOS(Quality of Service)参数,只在根cgroup设置。

blkio.cost.qos

  

io.cost.model

可读可写。

设置指定磁盘的设备模型,只在根cgroup设置。

blkio.cost.model

  

io.bfq.weight

可读可写。

设置基于bfq的IO下发权重。

blkio.bfq.weight_device

  

hugetlb接口

表11 cgroup v1 hugetlb接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

hugetlb.<hugepagesize>.limit_in_bytes

可读可写。

设置和查看此cgroup可使用的hugepagesize类型大页内存资源的大小,单位为字节。

hugetlb.<hugepagesize>.max

  

hugetlb.<hugepagesize>.max_usage_in_bytes

可读可写。

记录此cgroup创建以来hugepagesize类型大页内存资源使用的峰值,默认值为0,单位为字节。

NA

  

hugetlb.<hugepagesize>.usage_in_bytes

只读。

查看此cgroup组中当前使用的hugepagesize类型大页内存资源总量大小,单位为字节。

hugetlb.<hugepagesize>.current

  

hugetlb.<hugepagesize>.failcnt

可读可写。

设置/查看此cgroup中所有进程使用内存资源的总量达到 hugetlb.<hugepagesize>.limit_in_bytes的次数。

hugetlb.<hugepagesize>.events

  

hugetlb.<hugepagesize>.rsvd.limit_in_bytes

可读可写。

设置和查看此cgroup可预留的hugepagesize类型大页内存资源的限额值,单位为字节。

hugetlb.<hugepagesize>.rsvd.max

  

hugetlb.<hugepagesize>.rsvd.max_usage_in_bytes

可读可写。

记录此cgroup创建以来预留的hugepagesize类型大页内存资源的峰值,默认值为0,单位为字节。

NA

  

hugetlb.<hugepagesize>.rsvd.usage_in_bytes

只读。

查看cgroup中当前预留的hugepagesize类型大页内存资源总量,单位为字节。

hugetlb.<hugepagesize>.rsvd.current

  

hugetlb.<hugepagesize>.rsvd.failcnt

可读可写。

记录由于HugeTLB预留限制导致大页内存分配失败的次数。

NA

  
表12 cgroup v2 hugetlb接口

cgroup v2接口

作用

是否自研

对应cgroup v1接口

备注

hugetlb.<hugepagesize>.current

只读。

用于查看cgroup中当前使用的hugepagesize类型大页内存资源总量,单位为字节。

hugetlb.<hugepagesize>.usage_in_bytes

  

hugetlb.<hugepagesize>.events

只读。

当前只有max一项事件。max事件用于查看cgroup中hugepagesize类型大页内存由于限制而分配失败的次数,单位为次数。

hugetlb.<hugepagesize>.failcnt

  

hugetlb.<hugepagesize>.max

可读可写。

用于设置、查看cgroup可使用的hugepagesize类型大页内存资源的限额值,单位为字节。

hugetlb.<hugepagesize>.limit_in_bytes

  

hugetlb.<hugepagesize>.rsvd.current

只读。

用于查看cgroup中当前预留的hugepagesize类型大页内存资源总量,单位为字节。

hugetlb.<hugepagesize>.rsvd.usage_in_bytes

  

hugetlb.<hugepagesize>.rsvd.max

可读可写。

用于设置、查看cgroup可预留的hugepagesize类型大页内存资源的限额值,单位为字节。

hugetlb.<hugepagesize>.rsvd.limit_in_bytes

  

freezer接口

表13 cgroup v1 freezer接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

freezer.state

可读可写。

表示当前 freezer 子系统的状态。可以通过读取该文件来获取当前的冻结状态,也可以通过写入特定的值来改变状态。

cgroup.freeze

  • cgroup v2的cgroup.freeze字段:写1/0表示冻结/解冻。
  • cgroup v1的freezer.state字段:FROZEN表示冻结,THAWED表示解冻。

freezer.self_freezing

只读。

查看该cgroup是否自身被显式设置为冻结状态。

NA

  

freezer.parent_freezing

只读。

查看当前cgroup的父cgroup 是否处于冻结状态。

NA

  

pids接口

cgroup pids子系统可以限制cgroup及其所有子孙cgroup里面能创建的task数总量。目前cgroup v1和v2的pids接口没有差别。

表14 cgroup pids接口

cgroup 接口

作用

是否自研

pids.current

只读。

当前cgroup的任务个数。

pids.events

只读。

显示触发超过max被限制次数。

pids.max

可读可写。

设置cgroup最大的任务个数,默认值为max,表示不限制。

net_cls,net_prio接口

cgroup v2中移除了net_cls,net_prio相关的接口文件, 建议使用ebpf对流量进行过滤和整形。

表15 cgroup v1 net_cls,net_prio接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

net_cls.classid

可读可写。

为 cgroup 中的网络流量设置分类标识符(classid)。

NA

  

net_prio.prioidx

只读。

显示 cgroup 的优先级索引号,为只读索引,用于内核内部管理

NA

  

net_prio.ifpriomap

可读可写。

用于设置或查看网络接口的优先级映射。

NA

  

devices接口

cgroup v2中devices控制器不再提供传统接口文件,而是基于 cgroup BPF 机制实现。

表16 cgroup v1 devices接口

cgroup v1接口

作用

是否自研

对应cgroup v2接口

备注

devices.allow

只写。

设置允许 cgroup 中的进程访问特定的设备。

NA

  

devices.list

只读。

列出 cgroup 中的进程当前可以访问的所有设备。

NA

  

devices.deny

只写。

设置拒绝 cgroup 中的进程访问特定的设备。

NA

  

misc接口

使用misc子系统可以对多种杂项资源进行资源限制和跟踪,在使用之前需要确保已将资源添加到控制器并设置了资源容量。例如:在HCE 3.0系统中增加启动参数filecg_misc,可以对cgroup中进程打开的文件句柄数进行控制,接口中用于对文件句柄的限制是fd开头的。目前cgroup v1和v2的misc接口没有差别。

表17

cgroup 接口

作用

是否自研

misc.max

可读可写。

设置cgroup最大的资源数量。

misc.current

只读。

当前cgroup使用的资源数量。

misc.events

只读。

存在非根目录下。目前只定义了max事件,表示超过资源限制的次数。

相关文档