文档

cgroup v1与cgroup v2的区别

更新时间:

在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可以开启线程粒度的控制。

说明

只支持CPUpidsperf_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_MINWMARK_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_MINWMARK_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

控制冻结状态,可写入FROZENTHAWED用于冻结或解冻。

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

展示网卡资源使用。