cgroup v1与cgroup v2的区别

更新时间:
复制 MD 格式

在Linux系统中,cgroup(Control Groups)是一种资源管理和限制的机制,用于限制、记录和隔离进程组使用的物理资源(如CPU、内存、I/O等),通过cgroup,父进程可以控制子进程组的资源使用。cgroup v1和cgroup v2是cgroup机制的两个主要版本,它们在设计理念和使用方法上存在一些显著差异。本文介绍cgroup v1与cgroup v2的主要区别。

通用接口差异

cgroup v1接口

接口名称

作用

是否自研

对应cgroup v2接口

cgroup.procs

写入进程PID即可把进程迁移到该cgroup。

否

cgroup.procs

cgroup.clone_children

如果为1,子cgroup会继承自己的cpuset的配置。

说明

只对cpuset子系统生效,历史遗留因素在通用接口里。

否

不涉及

cgroup.sane_behavior

v2的实验特性的接口,v2正式发布后为了向后兼容而存在

否

不涉及

notify_on_release

如果为1,当前cgroup变空时会执行release_agent内的进程。

说明

只在根组存在。

否

可以通过cgroup.events实现类似功能

release_agent

否

tasks

写入线程tid即可把线程迁移到该cgroup。

否

cgroup.threads

pool_size

控制cgroup缓存池的大小,在高并发场景下可以加速cgroup的创建和绑定。

说明

依赖cgroup_rename,在cgroup v2中暂无法使用。

是

不涉及

cgroup v2接口

接口名称

作用

是否自研

对应cgroup v1接口

cgroup.procs

写入进程PID即可把进程迁移到该cgroup。

否

cgroup.procs

cgroup.type

写入threaded可以开启线程粒度的控制。

说明

只支持CPU、pids和perf_event。

否

不涉及

cgroup.threads

写入线程tid即可把线程迁移到该cgroup。

说明

需要cgroup.type为threaded。

否

tasks

cgroup.controllers

展示当前cgroup开启了哪些子系统。

否

不涉及

cgroup.subtree_control

控制子cgroup开启哪些子系统。

说明

需要是cgroup.controllers的子系统。

否

不涉及

cgroup.events

记录了当前cgroup是否管控进程,以及当前cgroup是否被冻结,可以用fsnotify监听状态是否变化。

说明

根组中不存在。

否

可以通过notify_on_release和 release_agent实现类似功能

cgroup.max.descendants

控制最大子孙cgroup的数量。

否

不涉及

cgroup.max.depth

控制子孙cgroup的最大深度。

否

不涉及

cgroup.stat

展示当前cgroup有多少个子孙cgroup和处于dying状态(销毁中)的子孙cgroup。

否

不涉及

cgroup.freeze

控制进程冻结。

说明

根组中不存在。

否

freezer子系统中的freezer.state

cpu.stat

展示CPU使用的统计信息。

否

不涉及

io.pressure

展示PSI信息,支持poll。更多信息,请参见:

否

在cgroup v1接口开启PSI功能后,cpuacct子系统下的io.pressure、memory.pressure、cpu.pressure来实现该功能

memory.pressure

否

cpu.pressure

否

子系统接口差异

CPU

cgroup v1接口

接口名称

作用

是否自研

对应cgroup v2接口

cpu.shares

控制权重,根据权重占比来分配CPU的时间片,默认值为1024。

否

cpu.weight,cpu.weight.nice,单位不一样

cpu.idle

控制当前cgroup组的调度策略类型是否为idle类型,idle类型会根据最小的CPU share分配时间片,且不再有最小运行时间的保障,更容易把CPU让给非idle类型的进程。

说明

cpu.idle为1时,cpu.shares不再可写,cpu.shares值变为3。

否

cpu.idle

cpu.priority

细粒度抢占优先级,时钟中断/唤醒时判断抢占,根据优先级的差值进行调整,使高优先级更容易抢占低优先级。

是

cpu.priority

cpu.cfs_quota_us

cpu cfs带宽控制,在 cpu.cfs_period_us的周期内,组内的进程最多运行时间为 cpu.cfs_quota_us。

否

cpu.max

cpu.cfs_period_us

否

cpu.cfs_burst_us

在cpu.cfs_period_us的周期内,允许进程突发运行的时间。更多信息,请参见在cgroup v1接口开启CPU Burst功能。

否

cpu.max.burst

cpu.cfs_init_buffer_us

刚启动时,允许进程突发运行的时间。

是

cpu.max.init_buffer

cpu.stat

展示CPU带宽控制相关统计信息,例如经历了多少个period,被throttle了多少次等。

否

cpu.stat

cpu.rt_runtime_us

cpu rt带宽控制,对于rt进程,在 cpu.rt_period_us的周期内,组内的进程最多运行的时间为cpu.rt_runtime_us。

否

不涉及

cpu.rt_period_us

否

不涉及

cpu.bvt_warp_ns

控制group identity属性,区分在离线进程,给在线进程更好的CPU QoS保障。更多信息,请参见Group Identity功能说明。

是

cpu.bvt_warp_ns

cpu.identity

是

cpu.identity

cpu.ht_stable

控制是否制造SMT对端噪音,用于控制SMT算力稳定。

是

不涉及

cpu.ht_ratio

控制是否因为SMT对端空闲额外计算使用的quota,用于控制SMT算力稳定。

是

cpu.ht_ratio

cgroup v2接口

说明

由于cgroup v2中不再支持cpuacct子系统,原cpuacct部分接口或相关功能在CPU子系统下实现。

接口名称

作用

是否自研

对应cgroup v1接口

cpu.weight

控制权重,根据权重占比来分配CPU的时间片,默认值为100。

否

cpu.shares,单位不一样

cpu.weight.nice

控制权重,根据权重占比来分配CPU的时间片,默认值为0。

否

cpu.shares,单位不一样

cpu.idle

控制当前cgroup组的调度策略类型是否为idle类型,idle类型的会根据最小的CPU share分配时间片,且不再有最小运行时间的保障,更容易把CPU让给非idle类型的进程。

说明

cpu.idle 为1时,cpu.weight、cpu.weight.nice不再可写,变为最小权重(0.3),同时cpu.weight会因为取整的原因,读取的值为0。

否

cpu.idle

cpu.priority

细粒度抢占优先级,时钟中断/唤醒时判断抢占,根据优先级的差值进行放缩,让高优先级更容易抢占低优先级。

是

cpu.priority

cpu.max

CPU cfs带宽控制,包含两个值,对应quota和period,在 period内组内进程最多运行quota的时间。

否

cpu.cfs_quota_us, cpu.cfs_period_us

cpu.max.burst

在cpu.max的period周期内,允许进程突发运行的时间。

否

cpu.max.burst

cpu.max.init_buffer

刚启动时,允许进程突发运行的时间。

是

cpu.cfs_init_buffer_us

cpu.bvt_warp_ns

控制group identity属性,区分离线进程,给在线进程更好的CPU QoS保障。

是

cpu.bvt_warp_ns

cpu.identity

是

cpu.identity

cpu.sched_cfs_statistics

cfs相关数据统计,例如运行时间,等待同级/非同级cgroup的时间等。

说明

需要打开 kernel.sched_schedstats。

是

cpuacct.sched_cfs_statistics

cpu.wait_latency

进程在队列中等待的延迟分布。

说明

需要打开kernel.sched_schedstats和/proc/cpusli/sched_lat_enabled。

是

cpuacct.wait_latency

cpu.cgroup_wait_latency

进程组在队列中等待的延迟分布,与wait_latency的区别在于,wait_latency统计task se,cgroup_wait_latency统计group se。

说明

需要打开kernel.sched_schedstats和/proc/cpusli/sched_lat_enabled。

是

cpuacct.cgroup_wait_latency

cpu.block_latency

进程因非I/O原因导致的阻塞的延迟分布。

说明

需要打开kernel.sched_schedstats和/proc/cpusli/sched_lat_enabled。

是

cpuacct.block_latency

cpu.ioblock_latency

进程因I/O原因导致的阻塞的延迟分布。

说明

需要打开kernel.sched_schedstats和/proc/cpusli/sched_lat_enabled

是

cpuacct.ioblock_latency

cpu.ht_ratio

控制是否因为SMT对端空闲额外计算使用的quota,用于控制SMT算力稳定。

说明

需要开启core scheduling才会生效。

是

cpu.ht_ratio

cpuset

cgroup v1接口

接口名称

作用

是否自研

对应cgroup v2接口

cpuset.cpus

控制进程运行的CPU范围。

说明

为空时cgroup不允许绑定进程。

否

cpuset.cpus

cpuset.mems

控制进程分配内存的NUMA节点范围。

说明

为空时cgroup不允许绑定进程。

否

cpuset.mems

cpuset.effective_cpus

展示进程运行具体生效的CPU范围,受CPU热插拔影响。

否

cpuset.cpus.effective

cpuset.effective_mems

展示进程分配内存具体生效的NUMA节点范围,受内存热插拔影响。

否

cpuset.mems.effective

cpuset.cpu_exclusive

控制独立使用的CPU范围,不能与同级其他组的有交集。

否

可以通过cpuset.cpus.partition实现类似功能

cpuset.mem_exclusive

控制独立使用的NUMA节点范围,不能与同级其他组的有交集。

否

不涉及

cpuset.mem_hardwall

当设置为1,表示内存只能从cpuset所属的内存node中分配。

否

不涉及

cpuset.sched_load_balance

控制是否在cpuset.cpus的范围内进行新建调度域并负载均衡,默认开启。

否

不涉及

cpuset.sched_relax_domain_level

控制负载均衡迁移任务时搜索的范围,默认值为-1。

  • -1:表示无要求,使用系统默认策略。

  • 0:表示不进行搜索。

  • 1:表示搜索同一个core内的ht。

  • 2:表示搜索同一个package内的core。

  • 3:表示同一个node内的CPU。

  • 4:表示搜索同一个chunk内的node。

  • 5:表示搜索整个系统。

否

不涉及

cpuset.memory_migrate

当设置为非零值时,它允许在重新配置cpuset时自动迁移已分配的内存页面。

否

不涉及

cpuset.memory_pressure

计算当前cpuset的内存换页压力。

否

不涉及

cpuset.memory_spread_page

当设置为1,将该cpuset中进程上下文申请的page cache平均分布到cpuset中的各个节点。

否

不涉及

cpuset.memory_spread_slab

当设置位1,将该cpuset中进程上下文申请到的slab对象平均分布到cpuset中的各个内存节点。

否

不涉及

cpuset.memory_pressure_enabled

当设置为1,使能cpuset的内存压力统计。

否

不涉及

cgroup v2接口

接口名称

作用

是否自研

对应cgroup v1接口

cpuset.cpus

控制进程运行的CPU范围。

说明

为空时使用parent的CPU范围。

否

cpuset.cpus

cpuset.mems

控制进程分配内存的NUMA节点范围。

说明

为空时使用parent的NUMA节点范围。

否

cpuset.mems

cpuset.cpus.effective

展示进程运行具体生效的CPU范围,受CPU热插拔影响。

否

cpuset.effective_cpus

cpuset.mems.effective

展示进程分配内存具体生效的NUMA节点范围,受内存热插拔影响。

否

cpuset.effective_mems

cpuset.cpus.partition

控制是否独立使用CPU范围,设置为root时,cpuset.cpus内的CPU会被独立使用。

否

可以通过 cpuset.cpu_exclusive实现类似的功能

.__DEBUG__.cpuset.cpus.subpartitions

展示cpuset.cpus.partition为root的子组独立使用了哪些CPU。

说明

kernel cmdline 开启了cgroup_debug才会有这个接口。

否

不涉及

blkio

cgroup v1接口

接口名称

作用

是否自研

对应cgroup v2接口

blkio.throttle.read_bps_device

读bps限流配置接口。

例如:

echo "<major>:<minor> <bps>" > /sys/fs/cgroup/blkio/<cgroup>/blkio.throttle.read_bps_device

否

io.max

blkio.throttle.write_bps_device

写bps限流配置接口。

例如:

echo "<major>:<minor> <bps>" > /sys/fs/cgroup/blkio/<cgroup>/blkio.throttle.write_bps_device

否

io.max

blkio.throttle.read_iops_device

读iops限流配置接口。

例如:

echo "<major>:<minor> <iops>" > /sys/fs/cgroup/blkio/<cgroup>/blkio.throttle.read_iops_device

否

io.max

blkio.throttle.write_iops_device

读iops限流配置接口。

例如:

echo "<major>:<minor> <iops>" > /sys/fs/cgroup/blkio/<cgroup>/blkio.throttle.write_iops_device

否

io.max

blkio.throttle.io_service_bytes

带宽统计接口。

包含所有设备的Read、Write、Sync、Async、Discard、Total等带宽统计信息,单位字节。

否

io.stat

blkio.throttle.io_service_bytes_recursive

带宽统计接口递归版本。

blkio.throttle.io_service_bytes 的递归版本,包含子cgroup的统计信息。

否

不涉及

blkio.throttle.io_serviced

iops统计接口。

包含所有设备的Read、Write、Sync、Async、Discard、Total等带宽统计信息,单位个。

否

io.stat

blkio.throttle.io_serviced_recursive

iops统计接口递归版本。

blkio.throttle.io_serviced 的递归版本,包含子cgroup 的统计。

否

不涉及

blkio.throttle.io_service_time

io服务时间,从io限流层结束到io完成,用于衡量io平均时延。

更多信息,请参见Block IO限流增强监控接口。

是

io.extstat

blkio.throttle.io_wait_time

io等待时间,io在限流层等待的时间,用于衡量io平均时延。

更多信息,请参见Block IO限流增强监控接口。

是

io.extstat

blkio.throttle.io_completed

完成io个数,用于衡量io平均时延。

更多信息,请参见Block IO限流增强监控接口。

是

io.extstat

blkio.throttle.total_bytes_queued

发生限流的io字节统计,用于分析io时延是否与限流有关。

更多信息,请参见Block IO限流增强监控接口。

是

io.extstat

blkio.throttle.total_io_queued

发生限流的io统计,用于分析io时延是否与限流有关。

更多信息,请参见Block IO限流增强监控接口。

是

io.extstat

blkio.cost.model

配置blk-iocost成本模型,当前仅支持auto和user两种。

仅存在于根组,例如:

echo "<major>:<minor> ctrl=user model=linear rbps=<rbps> rseqiops=<rseqiops> rrandiops=<rrandiops> wbps=<wbps> wseqiops=<wseqiops> wrandiops=<wrandiops>" > /sys/fs/cgroup/blkio/blkio.cost.model

更多信息,请参见配置blk-iocost权重限速。

是

io.cost.model

blkio.cost.qos

开启blk-iocost功能并配置QoS策略,用于磁盘拥塞状态判断。

仅存在于根组,例如:

echo "<major>:<minor> enable=1 ctrl=user rpct= rlat=5000 wpct=95.00 wlat=5000 min=50.00 max=150.00" > /sys/fs/cgroup/blkio/blkio.cost.qos

更多信息,请参见配置blk-iocost权重限速。

是

io.cost.qos

blkio.cost.weight

配置cgroup权重接口。

仅存在于非根组,可支持两种配置模式:

  • weight:所有设备配置相同权重。

  • major:minor + weight:特定设备配置权重。

更多信息,请参见配置blk-iocost权重限速。

是

io.cost.weight

blkio.cost.stat

blk-iocost统计接口。仅存在于非根组。

是

不涉及

cgroup v2接口

接口名称

作用

是否自研

对应cgroup v1接口

io.max

限流配置接口,包含读写 bps和iops。例如:

echo "<major>:<minor> rbps=<bps> wbps=<bps> riops=<iops> wiops=<iops>" > /sys/fs/cgroup/<cgroup>/io.max

否

blkio.throttle.read_bps_device

blkio.throttle.read_iops_device

blkio.throttle.write_bps_device

blkio.throttle.write_iops_device

io.stat

io统计信息,包含读/写/discard io的带宽和io 个数。

否

blkio.throttle.io_service_bytes

blkio.throttle.io_serviced

io.extstat

io扩展统计信息,包含读写io的等待时间、服务时间、完成个数、限流io的字节和个数统计。

否

blkio.throttle.io_service_time

blkio.throttle.io_wait_time

blkio.throttle.io_completed

blkio.throttle.total_bytes_queued

blkio.throttle.total_io_queued

io.cost.model

配置blk-iocost成本模型,当前仅支持auto和 user两种。

仅存在于根组,例如:

echo "<major>:<minor> ctrl=user model=linear rbps=<rbps> rseqiops=<rseqiops> rrandiops=<rrandiops> wbps=<wbps> wseqiops=<wseqiops> wrandiops=<wrandiops>" > /sys/fs/cgroup/io.cost.model

更多信息,请参见配置blk-iocost权重限速。

否

blkio.cost.model

io.cost.qos

开启blk-iocost功能并配置QoS策略,用于磁盘拥塞状态判断。

仅存在于根组,例如:

echo "<major>:<minor> enable=1 ctrl=user rpct= rlat=5000 wpct=95.00 wlat=5000 min=50.00 max=150.00" > /sys/fs/cgroup/io.cost.qos

更多信息,请参见配置blk-iocost权重限速。

否

blkio.cost.qos

io.cost.weight

配置cgroup权重接口。

仅存在于非根组,可支持两种配置模式:

  • weight:所有设备配置相同权重。

  • major:minor + weight:特定设备配置权重。

更多信息,请参见配置blk-iocost权重限速。

否

blkio.cost.weight

memory

cgroup v1接口

接口名称

作用

是否自研

对应cgroup v2接口

memory.usage_in_bytes

展示当前内存使用量。

否

不涉及

memory.max_usage_in_bytes

展示内存最大使用量。

否

不涉及

memory.limit_in_bytes

设置内存使用量硬限制。

否

不涉及

memory.soft_limit_in_bytes

设置内存使用量软限制。

否

不涉及

memory.failcnt

展示内存使用达到限制的次数。

否

不涉及

memory.mglru_batch_size

基于mglru框架的内存主动回收,设置批处理回收的内存数量,每批处理内存回收之间会尝试释放CPU。

是

不涉及

memory.mglru_reclaim_kbytes

基于mglru框架的内存主动回收,设置主动回收内存的数量。

是

不涉及

memory.wmark_ratio

该接口用于设置是否启用memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。单位是相对于memcg limit的百分之几。取值范围:0~100。

  • 默认值为0,该值也表示禁用memcg后台异步回收功能。

  • 取值非0时,表示开启memcg后台异步回收功能并设置对应的水位线。

更多信息,请参见Memcg后台异步回收。

是

memory.wmark_ratio

memory.wmark_high

只读接口,说明如下:

  • 当memcg内存使用超过该接口的值时,后台异步回收功能启动。

  • 该接口的值由memory.limit_in_bytes * memory.wmark_ratio / 100计算获得。

  • memcg后台异步回收功能被禁用时,memory.wmark_high默认为一个极大值,从而达到永不触发后台异步回收功能的目的。

  • memcg根组目录下不存在该接口文件。

更多信息,请参见Memcg后台异步回收。

是

memory.wmark_low

只读接口,说明如下:

  • 当memcg内存使用低于该接口的值时,后台异步回收结束。

  • 该接口的值由memory.wmark_high - memory.limit_in_bytes * memory.wmark_scale_factor / 10000计算得出。

  • memcg根组目录下不存在该接口文件。

更多信息,请参见Memcg后台异步回收。

是

memory.wmark_scale_factor

该接口用于控制memory.wmark_high和memory.wmark_low之间的间隔。单位是相对于memcg limit的万分之几。取值范围:1~1000

  • 该接口在创建时,会继承父组的值(该值为50),该值也是默认值,即memcg limit的千分之五。

  • memcg根组目录不存在该接口文件。

更多信息,请参见Memcg后台异步回收。

是

memory.wmark_min_adj

实现memcg全局最低水位线分级功能的接口为memory.wmark_min_adj。

该接口的值,表示基于全局最低水位线(global wmark_min)所作出的调整(adjustment)百分比。取值范围:-25 ~ 50,取值范围说明如下:

  • 该接口创建时,继承父组的值(值为0),即默认值为0。

  • 取值范围中的负值是基于调整范围[0, WMARK_MIN]的百分比,其中WMARK_MIN表示global wmark_min的值,例如:memory.wmark_min_adj=-25, memcg WMARK_MIN is "WMARK_MIN + (WMARK_MIN - 0) * (-25%)"

  • 取值范围中的正值是基于调整范围[WMARK_MIN, WMARK_LOW]的百分比,其中WMARK_MIN和WMARK_LOW分别表示global wmark_min和global wmark_low的值。

  • 当偏移后的global wmark_min被触发后,会执行抑制操作,抑制操作的时间和超出的内存使用为线性比例关系。抑制时间的取值范围:1ms ~ 1000ms。

更多信息,请参见Memcg全局最低水位线分级。

是

memory.force_empty

触发强制页回收。

否

不涉及

memory.use_hierarchy

设置层级统计使能。

是

不涉及

memory.swappiness

设置vmscan时swapiness的参数。

否

不涉及

memory.priority

该接口提供13个级别的memcg优先级以支持不同重要程度的业务。取值范围为0~12,数值越大表示优先级越高。该接口不会继承,默认值为0。

  • 实现一定程度的内存QoS,此处需要说明的优先级值非全局变量,只能在同父cgroup下的兄弟节点进行比较。

  • 对于优先级相等的兄弟节点来说,会按照组的内存使用量来排序选择内存使用最大的进行OOM操作。

是

memory.priority

memory.move_charge_at_immigrate

设置移动时的统计控制策略。

否

不涉及

memory.oom_control

设置oom时的控制策略。

否

不涉及

memory.oom.group

OOM group功能,当发生OOM时,杀死该memcg内的所有进程。

是

memory.oom.group

memory.pressure_level

设置内存压力通知。

否

不涉及

memory.kmem.limit_in_bytes

设置内核内存使用量硬限制。

否

不涉及

memory.kmem.usage_in_bytes

展示内核内存使用量。

否

不涉及

memory.kmem.failcnt

展示内核内存使用达到限制的次数。

否

不涉及

memory.kmem.max_usage_in_bytes

展示内核内存最大使用量。

否

不涉及

memory.kmem.slabinfo

展示内核内存slab使用量。

否

不涉及

memory.kmem.tcp.limit_in_bytes

设置内核tcp内存使用量硬限制。

否

不涉及

memory.kmem.tcp.usage_in_bytes

展示内核tcp内存使用量。

否

不涉及

memory.kmem.tcp.failcnt

展示内核tcp内存使用达到限制的次数。

否

不涉及

memory.kmem.tcp.max_usage_in_bytes

展示内核tcp内存最大使用量。

否

不涉及

memory.memsw.usage_in_bytes

展示内存加swap使用量。

否

不涉及

memory.memsw.max_usage_in_byte

展示内存加swap最大使用量。

否

不涉及

memory.memsw.limit_in_bytes

设置内存加swap使用量限制。

否

不涉及

memory.memsw.failcnt

展示内存加swap使用达到限制的次数。

否

不涉及

memory.swap.high

设置swap使用量限制。

是

memory.swap.high

memory.swap.events

触发swap使用量达到限制时的事件。

是

memory.swap.events

memory.min

设置内存使用量硬保证。

更多信息,请参见cgroup v1接口支持memcg QoS功能。

是

memory.min

memory.low

设置内存使用量软保证。更多信息,请参见cgroup v1接口支持memcg QoS功能。

是

memory.low

memory.high

设置内存使用量限制。更多信息,请参见cgroup v1接口支持memcg QoS功能。

是

memory.high

memory.allow_duptext

在全局开关 (/sys/kernel/mm/duptext/enabled) 打开的前提下,memcg开关用于设置各memcg中的进程是否启用代码多副本功能。取值范围:0~1,默认值为0。

  • 取值为1,表示当前memcg中的进程启用代码多副本功能。

  • 取值为0,表示当前memcg中的进程不启用代码多副本功能。

更多信息,请参见代码多副本功能。

是

memory.allow_duptext

memory.allow_duptext_refresh

二进制文件刚生成/下载,立即开始运行。duptext会在PageDirty、PageWriteback等条件不生效。如果该接口判断出这种情况,通过异步任务的方式再次对duptext会在PageDirty、PageWriteback等条件不生效这种情况做一次刷新。

是

memory.allow_duptext_refresh

memory.duptext_nodes

用于限制duptext的内存分配节点。

是

memory.duptext_nodes

memory.allow_text_unevictable

memcg代码段锁定的开关。

是

memory.allow_text_unevictable

memory.text_unevictable_percent

memcg锁定代码段的内存占用比例。

是

memory.text_unevictable_percent

memory.thp_reclaim

开启或关闭THP reclaim功能。支持以下配置项:

  • reclaim:开启THP reclaim功能。

  • swap:预留配置项,目前暂无实际功能。

  • disable:关闭THP reclaim功能。

THP reclaim功能默认为关闭状态,即接口默认值为disable。

更多信息,请参见THP reclaim功能。

是

memory.thp_reclaim

memory.thp_reclaim_stat

查看THP reclaim功能当前的状态。接口内的参数说明如下:

  • queue_length:当前被THP reclaim管理的透明大页数量。

  • split_hugepage:累计拆分的透明大页数量。

  • reclaim_subpage:累计回收的全零页面数量。

该接口的参数值按照NUMA node的顺序(node0、node1)从左到右排列。

更多信息,请参见THP reclaim功能。

是

memory.thp_reclaim_stat

memory.thp_reclaim_ctrl

控制THP reclaim功能的触发机制。目前支持以下配置项:

  • threshold:默认值为16。表示当透明大页中的全零页面数量超过该值时,会触发THP reclaim功能。

  • reclaim:用于主动触发THP reclaim功能。

更多信息,请参见THP reclaim功能。

是

memory.thp_reclaim_ctrl

memory.thp_control

提供memcg thp控制接口,可以禁止anon/shmem/file thp的申请。

例如不允许离线memcg使用大页,即使不能防止碎片的产生,但能减少THP的争抢,以及内存浪费的问题。

是

memory.thp_control

memory.reclaim_caches

主动回收memcg内的缓存。例如:echo 100M > memory.reclaim_caches。

是

memory.reclaim_caches

memory.pgtable_bind

页表页内存是否强制在本节点申请。

是

memory.pgtable_bind

memory.pgtable_misplaced

跨节点分配的页表页内存的统计 。

是

memory.pgtable_misplaced

memory.oom_offline

快速OOM特性中,用户使用该接口来标记离线任务所在的 memcg。

是

memory.oom_offline

memory.async_fork

async fork(原名 fcm)功能的memcg开关。

是

memory.async_fork

memory.direct_compact_latency

memsli功能:直接内存整理的延迟。

是

memory.direct_compact_latency

memory.direct_reclaim_global_latency

memsli功能:直接全局内存回收的延迟。

是

memory.direct_reclaim_global_latency

memory.direct_reclaim_memcg_latency

memsli功能:直接memcg内存回收的延迟。

是

memory.direct_reclaim_memcg_latency

memory.direct_swapin_latency

memsli功能:直接内存换入的延迟。

是

memory.direct_swapin_latency

memory.direct_swapout_global_latency

memsli功能:直接全局内存换出的延迟。

是

memory.direct_swapout_global_latency

memory.direct_swapout_memcg_latency

memsli功能:直接memcg内存换出的延迟。

是

memory.direct_swapout_memcg_latency

memory.exstat

extend/extra内存统计。当前包含4个自研特性的统计:

  • wmark_min_throttled_ms 【分级 min 水线】

  • wmark_reclaim_work_ms 【memcg 异步回收】

  • unevictable_text_size_kb 【代码段锁定】

  • pagecache_limit_reclaimed_kb 【page cache 限制】

更多信息,请参见Memcg Exstat功能。

自研增强

memory.exstat

memory.idle_page_stats

冷内存:kidled的内存统计数据(单memcg + hierarchy)。

是

memory.idle_page_stats

memory.idle_page_stats.local

冷内存:kidled的内存统计数据(单memcg)。

是

memory.idle_page_stats.local

memory.numa_stat

匿名、文件、锁定内存的NUMA统计。

否

memory.numa_stat

memory.pagecache_limit.enable

开启page cache限制开关。

更多信息,请参见Page Cache限制功能。

是

memory.pagecache_limit.enable

memory.pagecache_limit.size

page cache限制:限制量。

是

memory.pagecache_limit.size

memory.pagecache_limit.sync

page cache限制:限制方式(同步、异步)。

是

memory.pagecache_limit.sync

memory.reap_background

zombie memcg reaper:memcg粒度的后台/异步reap的开关。

是

memory.reap_background

memory.stat

内存的统计。

否

memory.stat

memory.use_priority_oom

开启priority oom开关。

更多信息,请参见Memcg OOM优先级策略功能。

是

memory.use_priority_oom

memory.use_priority_swap

开启priority swap开关。

更多信息,请参见Memcg OOM优先级策略功能。

是

memory.use_priority_swap

cgroup v2接口

接口名称

作用

是否自研

对应cgroup v1接口

memory.current

展示内存使用量。

否

不涉及

memory.min

设置内存使用量硬保证。

更多信息,请参见cgroup v1接口支持memcg QoS功能。

否

memory.min

memory.low

设置内存使用量软保证。

更多信息,请参见cgroup v1接口支持memcg QoS功能。

否

memory.low

memory.high

设置内存使用量限制。

更多信息,请参见cgroup v1接口支持memcg QoS功能。

否

memory.high

memory.max

设置内存使用量限制。

否

memory.max

memory.swap.current

展示swap使用量。

否

不涉及

memory.swap.high

设置swap使用量限制。

否

不涉及

memory.swap.max

设置swap使用量硬限制。

否

不涉及

memory.swap.events

触发swap使用量达到限制时的事件。

否

不涉及

memory.oom.group

OOMgroup功能,当发生OOM时,杀死该memcg内的所有进程。

否

memory.oom.group

memory.wmark_ratio

该接口用于设置是否启用memcg后台异步回收功能,以及设置异步回收功能开始工作的memcg内存水位线。单位是相对于memcg limit的百分之几。取值范围:0~100。

  • 默认值为0,该值也表示禁用memcg后台异步回收功能。

  • 取值为非0时,表示开启memcg后台异步回收功能并设置对应的水位线。

更多信息,请参见Memcg后台异步回收。

是

memory.wmark_ratio

memory.wmark_high

只读接口,说明如下:

  • 当memcg内存使用超过该接口的值时,后台异步回收功能启动。

  • 该接口的值由memory.limit_in_bytes * memory.wmark_ratio / 100计算获得。

  • memcg后台异步回收功能被禁用时,memory.wmark_high默认为一个极大值,从而达到永不触发后台异步回收功能的目的。

  • memcg根组目录下不存在该接口文件。

更多信息,请参见Memcg后台异步回收。

是

memory.wmark_high

memory.wmark_low

只读接口,说明如下:

  • 当memcg内存使用低于该接口的值时,后台异步回收结束。

  • 该接口的值由memory.wmark_high - memory.limit_in_bytes * memory.wmark_scale_factor / 10000计算得出。

  • memcg根组目录下不存在该接口文件。

更多信息,请参见Memcg后台异步回收。

是

memory.wmark_low

memory.wmark_scale_factor

该接口用于控制memory.wmark_high和memory.wmark_low之间的间隔。单位是相对于memcg limit的万分之几。取值范围:1~1000。

  • 该接口在创建时,会继承父组的值(该值为50),该值也是默认值,即memcg limit的千分之五。

  • memcg根组目录不存在该接口文件。

更多信息,请参见Memcg后台异步回收。

是

memory.wmark_scale_factor

memory.wmark_min_adj

实现memcg全局最低水位线分级功能的接口为memory.wmark_min_adj。

该接口的值,表示基于全局最低水位线(global wmark_min)所作出的调整(adjustment)百分比。取值范围:-25 ~ 50,取值范围说明如下:

  • 该接口创建时,继承父组的值(值为0),即默认值为0。

  • 取值范围中的负值是基于调整范围[0, WMARK_MIN]的百分比,其中WMARK_MIN表示global wmark_min的值,例如:memory.wmark_min_adj=-25, memcg WMARK_MIN is "WMARK_MIN + (WMARK_MIN - 0) * (-25%)"

  • 取值范围中的正值是基于调整范围[WMARK_MIN, WMARK_LOW]的百分比,其中WMARK_MIN和WMARK_LOW分别表示global wmark_min和global wmark_low的值。

  • 当偏移后的global wmark_min被触发后,会执行抑制操作,抑制操作的时间和超出的内存使用呈线性比例关系。抑制时间的取值范围:1ms ~ 1000ms。

更多信息,请参见Memcg全局最低水位线分级。

是

memory.wmark_min_adj

memory.priority

该接口提供13个级别的memcg优先级以支持不同重要程度的业务。取值范围为0~12,数值越大表示优先级越高。该接口不会继承,默认值为0。

  • 实现一定程度的内存QoS,此处需要说明的优先级值非全局变量,只能在同父cgroup下的兄弟节点进行比较。

  • 对于优先级相等的兄弟节点来说,会按照组的内存使用量来排序选择内存使用最大的进行OOM操作。

更多信息,请参见Memcg OOM优先级策略功能。

是

memory.priority

memory.use_priority_oom

开启priority oom开关。

更多信息,请参见Memcg OOM优先级策略功能。

是

memory.use_priority_oom

memory.use_priority_swap

开启priority swap开关。

更多信息,请参见Memcg OOM优先级策略功能。

是

memory.use_priority_swap

memory.direct_reclaim_global_latency

memsli功能:直接全局内存回收的延迟。

是

memory.direct_reclaim_global_latency

memory.direct_reclaim_memcg_latency

memsli功能:直接memcg内存回收的延迟。

是

memory.direct_reclaim_memcg_latency

memory.direct_compact_latency

memsli功能:直接内存整理的延迟。

是

memory.direct_compact_latency

memory.direct_swapout_global_latency

memsli功能:直接全局内存换出的延迟。

是

memory.direct_swapout_global_latency

memory.direct_swapout_memcg_latency

memsli功能:直接memcg内存换出的延迟。

是

memory.direct_swapout_memcg_latency

memory.direct_swapin_latency

memsli功能:直接内存换入的延迟。

是

memory.direct_swapin_latency

memory.exstat

extend/extra内存统计。当前包含4个自研特性的统计:

  • wmark_min_throttled_ms 【分级 min 水线】

  • wmark_reclaim_work_ms 【memcg 异步回收】

  • unevictable_text_size_kb 【代码段锁定】

  • pagecache_limit_reclaimed_kb 【page cache 限制】

更多信息,请参见Memcg Exstat功能。

是

memory.exstat

memory.pagecache_limit.enable

page cache限制:开关。

更多信息,请参见Page Cache限制功能。

是

memory.pagecache_limit.enable

memory.pagecache_limit.size

page cache限制:限制量。

更多信息,请参见Page Cache限制功能。

是

memory.pagecache_limit.size

memory.pagecache_limit.sync

page cache限制:限制方式(同步、异步)。

更多信息,请参见Page Cache限制功能。

是

memory.pagecache_limit.sync

memory.idle_page_stats

冷内存:kidled的内存统计数据(单memcg + hierarchy)

是

memory.idle_page_stats

memory.idle_page_stats.local

冷内存:kidled 的内存统计数据(单memcg)。

是

memory.idle_page_stats.local

memory.numa_stat

匿名、文件、锁定内存的NUMA统计。

是

memory.numa_stat

memory.reap_background

zombie memcg reaper:memcg粒度的后台/异步reap的开关。

是

memory.reap_background

memory.stat

内存的统计。

否

memory.stat

memory.use_priority_oom

开启priority oom开关。

更多信息,请参见Memcg OOM优先级策略功能。

是

memory.use_priority_oom

cpuacct

接口名称

作用

是否自研

对应cgroup v2接口

cpuacct.usage

使用CPU的总时间,单位是ns。

否

用cpu.stat展示类似的信息

cpuacct.usage_user

在用户态使用的CPU时间,单位是ns。

否

cpuacct.usage_sys

在内核态使用的CPU时间,单位是ns。

否

cpuacct.usage_percpu

每个CPU的使用时间,单位是ns。

否

cpuacct.usage_percpu_user

在用户态每个CPU使用的时间,单位是ns。

否

cpuacct.usage_percpu_sys

在内核态每个CPU使用的时间,单位是ns。

否

cpuacct.usage_all

cpuacct.usage_percpu_user和cpuacct.usage_percpu_sys信息的汇总,单位是ns。

否

cpuacct.stat

在用户态和内核态使用的CPU时间,单位是tick。

否

cpuacct.proc_stat

展示容器粒度的CPU时间、loadavg、运行进程数量等信息。

是

cpuacct.enable_sli

控制是否统计容器粒度的loadavg。

是

不涉及

cpuacct.sched_cfs_statistics

cfs相关数据统计,例如运行时间,等待同级/非同级cgroup的时间等。

是

cpu.sched_cfs_statistics

cpuacct.wait_latency

进程在队列中等待的延迟分布。

是

cpu.wait_latency

cpuacct.cgroup_wait_latency

进程组在队列中等待的延迟分布,与wait_latency的区别在于,wait_latency统计task se,cgroup_wait_latency统计group se。

是

cpu.cgroup_wait_latency

cpuacct.block_latency

进程被非io原因导致的阻塞的延迟分布。

是

cpu.block_latency

cpuacct.ioblock_latency

进程被io原因导致的阻塞的延迟分布。

是

cpu.ioblock_latency

io.pressure

展示PSI信息,支持poll。更多信息,请参见:

否

不涉及

memory.pressure

否

cpu.pressure

否

freezer

接口名称

作用

是否自研

对应cgroup v2接口

freezer.state

控制冻结状态,可写入FROZEN、THAWED用于冻结或解冻。

否

cgroup.freeze

freezer.self_freezing

展示是否因为自身的冻结状态而冻结。

否

不涉及

freezer.parent_freezing

展示是否因为祖先的冻结状态而冻结。

否

不涉及

ioasids

ioasids子系统的cgroup v1接口和cgroup v2接口没有差别。

接口名称

作用

是否自研

ioasids.current

当前group已经分配的ioasid的数量。

是

ioasids.events

由于超过可分配ioasid的限制而发生的事件数量。

是

ioasids.max

当前group可以分配的总的ioasid数量。

是

net_cls/net_prio

接口名称

作用

是否自研

对应cgroup v2接口

net_cls.classid

配置cgroup当前的class id, 与qdisc或iptable配合使用。

否

不涉及

说明

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

net_prio.prioidx

只读, 内核内部使用的, 当前cgroup在数据结构中的索引值。

否

net_prio.ifpriomap

配置每一个网卡对应的prio值。

否

perf_event

perf_event子系统没有接口,perf_event在cgroup v2上默认使能,和cgroup v1没有差别。

pids

pids子系统的cgroup v1接口和cgroup v2接口没有差别。

接口名称

作用

是否自研

pids.max

控制进程数量上限。

否

pids.current

展示当前进程数量。

否

pids.events

展示因为达到进程数量上限而fork失败的事件次数,并支持fsnotify。

否

rdma

rdma子系统的cgroup v1接口和cgroup v2接口没有差别。

接口名称

作用

是否自研

rdma.max

控制网卡资源使用限制。

否

rdma.current

展示网卡资源使用。

否