Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux Cgroups (Control Groups) 安裝、配置與資源限制實戰指南

編輯:關於 Linux

Cgroups (Control Groups) 是 Linux 核心提供的進程資源隔離與限制機制,廣泛應用於容器技術、批次任務調度、多租戶資源配額等場景。本文從核心概念、子系統架構、安裝部署到實際資源限制操作,提供完整的落地指南。

一、核心概念架構

術語定義類比
Task單一進程 (PID)容器中的一個應用程式進程
Control Group (cgroup)依據標準劃分的進程集合資源配額桶
HierarchyCgroup 樹狀結構,父子繼承屬性組織架構樹
Subsystem資源控制器 (CPU、Memory、I/O 等)具體資源計量器

關鍵關係:掛載子系統 → 建立 cgroup 節點 → 寫入 PID 與限制參數

二、子系統總覽與系統支援檢查

# 列出所有可用子系統及掛載點
lssubsys -al

# 或查看已掛載的 cgroup v1 掛載點 (傳統)
ls /sys/fs/cgroup/
# 輸出範例:
# blkio  cpu  cpuacct  cpuset  devices  freezer  hugetlb  memory  net_cls  net_prio  perf_event  pids  systemd

# cgroup v2 統一掛載點 (現代系統)
ls /sys/fs/cgroup/unified/  # 或 /sys/fs/cgroup/ (v2 模式下)

Cgroups 子系統列表

常用子系統功能對照

子系統控制資源關鍵參數檔案
cpuCPU 時間片比例cpu.shares (相對權重)、cpu.cfs_quota_us/cpu.cfs_period_us (硬性配額)
memory記憶體使用上限memory.limit_in_bytes、memory.memsw.limit_in_bytes (含 Swap)
blkio塊設備 I/O 頻寬blkio.throttle.read_bps_device、blkio.weight
cpusetCPU 核心/記憶體節點綁定cpuset.cpus、cpuset.mems
pids進程/線程數上限pids.max
devices裝置節點存取控制devices.allow/devices.deny

三、安裝與基礎環境準備

1. 套件安裝 (Debian/Ubuntu 為例)

apt-get update && apt-get install -y cgroup-bin cgroup-tools

cgroup-bin 提供 cgcreate、cgdelete、cgset、cgget、cgexec 等管理命令;cgroup-tools 包含 systemd 整合與服務。

2. 檢查核心支援

grep CGROUP /boot/config-$(uname -r)
# 應見 CONFIG_CGROUPS=y 及各子系統 =y

3. 掛載配置 (/etc/cgconfig.conf)

mount {
    cpu = /sys/fs/cgroup/cpu;
    memory = /sys/fs/cgroup/memory;
    blkio = /sys/fs/cgroup/blkio;
    cpuset = /sys/fs/cgroup/cpuset;
}
# 群組範本
group limited_group {
    cpu {
        cpu.shares = 512;        # 相對權重 (預設 1024)
        cpu.cfs_quota_us = 50000; # 硬限制:每 100ms 可用 50ms (50% 單核)
        cpu.cfs_period_us = 100000;
    }
    memory {
        memory.limit_in_bytes = 1G;
        memory.memsw.limit_in_bytes = 1G;
    }
    blkio {
        blkio.throttle.read_bps_device = "8:0 10485760"; # 限制 sda 讀 10MB/s
    }
}

cgconfig.conf 配置示例

4. 啟動服務並驗證掛載

systemctl restart cgconfig
systemctl restart cgred    # 規則引擎,依 /etc/cgrules.conf 自動歸類進程

# 驗證
mount -t cgroup
ls /sys/fs/cgroup/memory/
# 應見 limited_group 目錄

四、實戰:為進程組施加資源限制

方法一:命令列手動操作 (教學/臨時測試)

# 1. 在 memory 子系統建立 cgroup
mkdir /sys/fs/cgroup/memory/test_group

# 2. 設定記憶體硬限制 500MB
echo 524288000 > /sys/fs/cgroup/memory/test_group/memory.limit_in_bytes

# 3. 將目標 PID 加入 cgroup
echo 12345 > /sys/fs/cgroup/memory/test_group/cgroup.procs

# 4. 驗證限制生效
cat /sys/fs/cgroup/memory/test_group/memory.usage_in_bytes
# 進程嘗試分配超過 500MB 將觸發 OOM Killer

方法二:使用 cgcreate/cgexec (生產推薦)

# 建立群組
cgcreate -g memory,cpu:myapp

# 設定參數
cgset -r memory.limit_in_bytes=2G myapp
cgset -r cpu.cfs_quota_us=200000 myapp  # 2 核配額 (200ms/100ms)

# 在 cgroup 內啟動程式
cgexec -g memory,cpu:myapp /usr/bin/java -jar app.jar

# 既有進程加入
cgclassify -g memory,cpu:myapp 12345

方法三:systemd 服務整合 (現代標準)

# /etc/systemd/system/myapp.service
[Service]
ExecStart=/usr/bin/myapp
MemoryLimit=2G
CPUQuota=200%
# systemd 自動建立對應 cgroup v2 節點
# 管理命令:systemctl status myapp, systemd-cgtop

五、驗證與監控

# 即時監控所有 cgroup 資源使用
cgtop

# 查看特定群組統計
cgget -r memory.usage_in_bytes -r cpuacct.usage myapp

# 列出群組內進程
cat /sys/fs/cgroup/memory/myapp/cgroup.procs
ps -fp $(cat /sys/fs/cgroup/memory/myapp/cgroup.procs)

六、cgroup v1 vs v2 關鍵差異

特性v1 (傳統)v2 (統一)
掛載結構每子系統獨立掛載單一統一掛載點 (/sys/fs/cgroup)
控制器啟用掛載時指定cgroup.subtree_control 動態啟用
進程隸屬可同時屬多樹單一層級,進程只屬一個 leaf cgroup
介面工具cgroup-bin, libcgroupsystemd, cgroup2fs, cgmanager

現代發行版 (RHEL 8+, Ubuntu 20.04+, Debian 10+) 預設啟用 v2,建議新部署直接採用 systemd + v2 介面。

七、最佳實踐與避坑指南

  1. 設定合理的 memory.memsw.limit_in_bytes:防止 Swap 爆滿導致系統整體卡頓
  2. CPU 限制優先用 cpu.cfs_quota_us:cpu.shares 僅在 CPU 爭用時生效,無法硬性保護
  3. 避免巢狀過深:層級超過 4-5 層會增加調度開銷
  4. 監控 memory.failcnt:計數器增長表示觸發限制,需擴容或優化
  5. 配合 oom_score_adj:調整核心 OOM Killer 選擇傾向,保護關鍵進程

透過 Cgroups 精細化的資源劃分與限制,可實現進程級的服務質量保障 (QoS)、故障隔離與多租戶成本控制,是現代 Linux 基礎設施不可或缺的核心能力。

Copyright © Windows教程網 All Rights Reserved