cgset 命令详解
更新时间:2026-09-17。本文是「一个命令一个文档」系列,聚焦
cgset(control group set,设置控制组参数)——容器与云原生命令族、libcgroup 套件。建组用 cgcreate,cgset负责把资源上限真正写进去,组内启动用 cgexec,读回看 cgget。
cgset 往控制组目录里的参数文件写值,等价于手工 echo value > /sys/fs/cgroup/<控制器>/<组>/<参数>。它是「让 cgroup 真正产生限制」的一步——没有它,cgcreate 建的只是个不拦任何资源的空组。
一、基本用法
cgset -r cpu.shares=256 myapp # 设单个参数
cgset -r cpu.cfs_quota_us=50000 myapp # CPU 硬限(配合 period 100000 = 0.5 核)
cgset -r memory.limit_in_bytes=512M myapp # 内存上限
cgset -r pids.max=200 myapp
cgset -r cpu.shares=512 -r memory.limit_in_bytes=1G myapp # 一次写多个 -r
cgset --copy-from template myapp # 从另一个组整体拷贝参数
-r <name>=<value>可重复出现,一次设置多个参数。参数名就是控制器目录下的文件名。要想知道某组当前能设哪些参数,先 lscgroup 定位目录,再ls /sys/fs/cgroup/memory/myapp/看有哪些可写文件。
二、CPU:权重(shares)与硬限(quota)别混淆
# 相对权重:只在 CPU 竞争时按比例分配,空闲时可以用满
cgset -r cpu.shares=512 myapp # 默认 1024,竞争时约拿一半
# 硬上限:无论别人忙不忙,最多只能用这么多核
cgset -r cpu.cfs_period_us=100000 myapp # 周期 100ms
cgset -r cpu.cfs_quota_us=200000 myapp # 每周期可用 200ms = 最多 2 核这是 cgroup CPU 最常见的坑:
cpu.shares是相对权重(默认 1024),机器空闲时设成 512 的组照样能跑满整核,只有争抢时才体现比例;cpu.cfs_quota_us / cpu.cfs_period_us才是硬配额,quota=200000、period=100000 表示最多 2 核,多了就被限流(throttle)并产生调度延迟。容器 CPU limit 走的是 quota,CPU request/权重走的是 shares,详见容器性能。
三、内存:limit、swap 与 OOM
cgset -r memory.limit_in_bytes=536870912 myapp # 内存硬限 512MiB
cgset -r memory.memsw.limit_in_bytes=536870912 myapp # mem+swap 都设成同值 = 禁止 swap
cgset -r memory.oom_control=1 myapp # v1 关闭 OOM killer(超限挂起而非被杀)内存上限触顶后的行为要清楚:默认内核 OOM killer 会杀掉组内某个进程(容器里常见的 OOMKilled、退出码 137);若把
memory.oom_control设为禁用 OOM,则进程在申请内存时被阻塞挂起而不是被杀。排查内存被杀见 OOM 怎么排查。memsw设成和内存上限相同,表示连 swap 一起算、实际等于不给 swap。
四、blkio 与 pids
# 块设备读写带宽限速(major:minor 用 lsblk 查)
cgset -r blkio.throttle.read_bps_device="8:0 10485760" myapp # sda 读限 10MB/s
cgset -r blkio.throttle.write_iops_device="8:0 100" myapp # 写限 100 IOPS
cgset -r pids.max=300 myapp # 最多 300 个任务,防 fork 炸弹五、v2 等价写法
cgroup v2 统一层级里参数改名并集中到一个目录,cgset 退化为直接写文件:
mkdir -p /sys/fs/cgroup/myapp
echo "50000 100000" > /sys/fs/cgroup/myapp/cpu.max # = quota/period,限 0.5 核
echo 536870912 > /sys/fs/cgroup/myapp/memory.max # 内存上限
echo 300 > /sys/fs/cgroup/myapp/pids.max
echo $PID > /sys/fs/cgroup/myapp/cgroup.procs # 放入进程
# 生产推荐交给 systemd:
systemctl set-property batch.scope CPUQuota=50% MemoryMax=512Mv2 里 CPU 权重文件是
cpu.weight(范围 1–10000,默认 100),硬限合并成cpu.max一行「quota period」;内存是memory.max。做映射时别拿 v1 文件名去 v2 目录找,会报文件不存在。
相关命令
建组 cgcreate、读参数 cgget、组内启动 cgexec、移动已运行进程 cgclassify、列组 lscgroup。内存触顶排障见OOM 排查。
总结
cgset -r 参数=值 组名 = 给 cgroup v1 控制组写资源上限:CPU 要分清 cpu.shares(竞争权重)与 cpu.cfs_quota_us(硬限核数),内存用 memory.limit_in_bytes(触顶默认 OOM 杀进程),IO 用 blkio.throttle;v2 下直接写 cpu.max/memory.max 或用 systemctl set-property,思想一致、文件改名而已。