萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux cgroups 限制 CPU 資源實戰:cfs_quota 硬限制、shares 權重、cpuset 綁核

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

1. 硬限制:cfs_quota_us / cfs_period_us (CFS 調度器)

  • cpu.cfs_period_us:調度週期,默認 100000 µs (100ms)
  • cpu.cfs_quota_us:週期內可用 CPU 時間,默認 -1 (無限制)
  • 公式:CPU 限制 % = quota / period * 100%(單核環境)

實驗:將 Python 死循環限制在 50% CPU

# 啟動佔用 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。

2. 相對權重:cpu.shares (比例分配)

  • 默認 1024,繼承層級關係(子組不可超過父組)
  • 僅在 **CPU 爭用時** 生效;閒置時可跑滿所有核心
# 根組 1024,foo 組 2048 → foo 獲得雙倍 CPU 時間片
echo 2048 > /sys/fs/cgroup/cpu/foo/cpu.shares
# 再創建 foo/bar 1024 → 三者比 1:2:1

3. 綁核隔離:cpuset 子系統

# 掛載 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'

4. 統計與計費:cpuacct 子系統

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 資源治理。

copyright © 萬盛學電腦網 all rights reserved