在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。
| 否 | 不涉及 |
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权重接口。 仅存在于非根组,可支持两种配置模式:
更多信息,请参见配置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权重接口。 仅存在于非根组,可支持两种配置模式:
更多信息,请参见配置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。
更多信息,请参见Memcg后台异步回收。 | 是 | memory.wmark_ratio |
memory.wmark_high | 只读接口,说明如下:
更多信息,请参见Memcg后台异步回收。 | 是 | |
memory.wmark_low | 只读接口,说明如下:
更多信息,请参见Memcg后台异步回收。 | 是 | |
memory.wmark_scale_factor | 该接口用于控制memory.wmark_high和memory.wmark_low之间的间隔。单位是相对于memcg limit的万分之几。取值范围:1~1000
更多信息,请参见Memcg后台异步回收。 | 是 | |
memory.wmark_min_adj | 实现memcg全局最低水位线分级功能的接口为memory.wmark_min_adj。 该接口的值,表示基于全局最低水位线(global wmark_min)所作出的调整(adjustment)百分比。取值范围:-25 ~ 50,取值范围说明如下:
更多信息,请参见Memcg全局最低水位线分级。 | 是 | |
memory.force_empty | 触发强制页回收。 | 否 | 不涉及 |
memory.use_hierarchy | 设置层级统计使能。 | 是 | 不涉及 |
memory.swappiness | 设置vmscan时swapiness的参数。 | 否 | 不涉及 |
memory.priority | 该接口提供13个级别的memcg优先级以支持不同重要程度的业务。取值范围为0~12,数值越大表示优先级越高。该接口不会继承,默认值为0。
| 是 | 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。
更多信息,请参见代码多副本功能。 | 是 | 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功能。支持以下配置项:
THP reclaim功能默认为关闭状态,即接口默认值为disable。 更多信息,请参见THP reclaim功能。 | 是 | memory.thp_reclaim |
memory.thp_reclaim_stat | 查看THP reclaim功能当前的状态。接口内的参数说明如下:
该接口的参数值按照NUMA node的顺序(node0、node1)从左到右排列。 更多信息,请参见THP reclaim功能。 | 是 | memory.thp_reclaim_stat |
memory.thp_reclaim_ctrl | 控制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内的缓存。例如: | 是 | 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个自研特性的统计:
更多信息,请参见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。
更多信息,请参见Memcg后台异步回收。 | 是 | memory.wmark_ratio |
memory.wmark_high | 只读接口,说明如下:
更多信息,请参见Memcg后台异步回收。 | 是 | memory.wmark_high |
memory.wmark_low | 只读接口,说明如下:
更多信息,请参见Memcg后台异步回收。 | 是 | memory.wmark_low |
memory.wmark_scale_factor | 该接口用于控制memory.wmark_high和memory.wmark_low之间的间隔。单位是相对于memcg limit的万分之几。取值范围:1~1000。
更多信息,请参见Memcg后台异步回收。 | 是 | memory.wmark_scale_factor |
memory.wmark_min_adj | 实现memcg全局最低水位线分级功能的接口为memory.wmark_min_adj。 该接口的值,表示基于全局最低水位线(global wmark_min)所作出的调整(adjustment)百分比。取值范围:-25 ~ 50,取值范围说明如下:
更多信息,请参见Memcg全局最低水位线分级。 | 是 | memory.wmark_min_adj |
memory.priority | 该接口提供13个级别的memcg优先级以支持不同重要程度的业务。取值范围为0~12,数值越大表示优先级越高。该接口不会继承,默认值为0。
更多信息,请参见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个自研特性的统计:
更多信息,请参见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 | 控制冻结状态,可写入 | 否 | 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 | 展示网卡资源使用。 | 否 |