cgroups (Control Groups) 是 Linux 內核提供的資源隔離機制,是 Docker、Kubernetes、LXC 等容器技術的基石。本文聚焦 **CPU 子系統**,演示如何通過 cpu.cfs_quota_us 硬限制 CPU 配額、cpu.shares 相對權重、cpuset.cpus 綁定核心,並解讀統計指標。
# 掛載 cpu 子系統(系統通常已自動掛載)
mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpu
# 創建測試控制組
mkdir -p /sys/fs/cgroup/cpu/foo
cpu.cfs_period_us:調度週期,默認 100000 µs (100ms)cpu.cfs_quota_us:週期內可用 CPU 時間,默認 -1 (無限制)quota / period * 100%(單核環境)# 啟動佔用 100% CPU 的進程
python -c 'while True: pass' &
PID=$!
echo "PID: $PID"
top -b -n1 -p $PID # 觀察 %CPU ~100%
# 設置限制:quota=50000, period=100000 → 50%
echo 50000 > /sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us
echo $PID > /sys/fs/cgroup/cpu/foo/tasks
# 再次觀察
top -b -n1 -p $PID # %CPU ~50%
N 核系統中,單控制組最大可用 N * period。若 4 核想限制為 2 核等價(50% 總算力):quota = 2 * period = 200000。
# 根組 1024,foo 組 2048 → foo 獲得雙倍 CPU 時間片
echo 2048 > /sys/fs/cgroup/cpu/foo/cpu.shares
# 再創建 foo/bar 1024 → 三者比 1:2:1
# 掛載 cpuset
mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset
mkdir /sys/fs/cgroup/cpuset/foo
# 必須同時設置 cpus 和 mems
echo 0-1 > /sys/fs/cgroup/cpuset/foo/cpuset.cpus # 僅用核 0,1
echo 0 > /sys/fs/cgroup/cpuset/foo/cpuset.mems # 僅用內存節點 0
echo $PID > /sys/fs/cgroup/cpuset/foo/tasks
# 驗證
cat /proc/$PID/status | grep -E 'Cpus_allowed|Mems_allowed'
cat /sys/fs/cgroup/cpuacct/foo/cpuacct.stat
# user / system (單位: USER_HZ, 通常 100 = 1秒)
cat /sys/fs/cgroup/cpuacct/foo/cpuacct.usage
# 總納秒數
cat /sys/fs/cgroup/cpuacct/foo/cpuacct.usage_percpu
# 每核納秒數
cfs_period_us ≥ 父組cfs_quota_us ≤ 父組cpuset.cpus/mems 必須是父組的子集# 安裝 libcgroup-tools
yum install libcgroup-tools
# 創建組
cgcreate -g cpu,cpuset:/foo
# 設置參數
cgset -r cpu.cfs_quota_us=50000 /foo
cgset -r cpuset.cpus=0-1 /foo
# 在組中啟動程序
cgexec -g cpu,cpuset:/foo python -c 'while True: pass'
# 刪除組
cgdelete -g cpu,cpuset:/foo
SLES 11 SP2/SP3 (Kernel 3.0.x) 中,**寫入 cgroup.procs 不生效,必須寫入 tasks**;其他主流內核 (3.10+, 4.x, 5.x) 雙均支持。
掌握 cgroups CPU 子系統三大核心能力——**硬限額、相對權重、核心綁定**——即可在裸金屬、VM、容器混合環境中實現精細的 CPU 資源治理。