cgroups(Control Groups)是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制,包括CPU、内存、block I/O、网络带宽等
可以通过man cgoups
查看更多信息
1. 内存限制
创建cgroup
mkdir /sys/fs/cgroup/memory/memtest
设置内存限制
假设将内存限制设置为 100MB
echo 100M > /sys/fs/cgroup/memory/memtest/memory.limit_in_bytes
写入文件会自动转化为bytes: 104857600
测试
memory_hog.py
import time
data = []
while True:
data.append('A' * 1000000) # 每次分配约 1MB 内存
time.sleep(0.1)
将进程id写入cgroup后运行,$$为shell的id,启动的python均为其子id
echo $$ | tee /sys/fs/cgroup/memory/memtest/cgroup.procs
python3 memory_hog.py
观察内存占用
watch -n ``1` `"cat /sys/fs/cgroup/memory/memtest/memory.usage_in_bytes"
过几秒后进程会被killed,查看dmesg
查看memory.oom_control
oom_kill_disable ``0
under_oom ``0
oom_kill ``1
文件说明
/sys/fs/cgroup/memory下文件
cgroup.procs:包含属于该 cgroup 的进程 ID。
memory.limit_in_bytes:设置内存使用上限。
memory.usage_in_bytes:显示当前内存使用量。
memory.max_usage_in_bytes:记录最大内存使用量。
memory.failcnt:记录达到内存限制的次数。
memory.soft_limit_in_bytes:设置软限制,系统内存压力大时才生效。
memory.oom_control:控制 OOM(内存不足)行为。
memory.stat:提供详细的内存使用统计。
memory.swappiness:控制内存交换倾向。
memory.use_hierarchy:控制是否将限制应用到子 cgroup。
memory.force_empty:尝试释放 cgroup 中的所有内存。
memory.pressure_level:报告内存压力水平。
memory.numa_stat:NUMA 相关的内存统计。
memory.kmem.* 文件:用于管理内核内存。
memory.memsw.* 文件:管理内存+交换空间的使用。
memory.move_charge_at_immigrate:控制进程迁移时的内存计费。
tasks:包含属于该 cgroup 的线程 ID。
notify_on_release:控制 cgroup 释放时的通知。
cgroup.event_control:用于事件通知机制。
cgroup.clone_children:控制子 cgroup 是否继承父 cgroup 的 cpuset 配置。