# Linux中Cgroup是什么
## 1. Cgroup概述
### 1.1 基本定義
Control Groups(簡稱cgroups)是Linux內核提供的一種機制,用于**限制、記錄和隔離**進程組(process groups)所使用的物理資源(如CPU、內存、磁盤I/O、網絡等)。這項技術最初由Google工程師在2006年提出,并于2007年合并到Linux 2.6.24內核主線中。
### 1.2 核心功能
- **資源限制**:可為進程組設置資源使用上限
- **優先級分配**:通過權重控制資源分配比例
- **資源統計**:監控各組資源使用情況
- **進程控制**:凍結/恢復進程組執行
- **層級化管理**:支持樹形結構組織進程組
## 2. Cgroup核心概念
### 2.1 子系統(Subsystems)
| 子系統 | 功能描述 |
|---------------|--------------------------------------------------------------------------|
| cpu | 控制CPU時間分配 |
| cpuacct | 自動生成cgroup中任務使用CPU的報告 |
| cpuset | 為cgroup中的任務分配獨立CPU和內存節點 |
| memory | 限制內存使用并生成內存資源報告 |
| devices | 允許或拒絕cgroup中的任務訪問設備 |
| freezer | 掛起或恢復cgroup中的任務 |
| net_cls | 使用等級標識符(classid)標記網絡數據包 |
| blkio | 設置對塊設備(如磁盤)I/O的訪問限制 |
| perf_event | 允許perf工具監控cgroup |
| net_prio | 設置網絡流量的優先級 |
| hugetlb | 限制大頁內存使用 |
| pids | 限制cgroup中的進程數量 |
### 2.2 層級結構(Hierarchy)
Cgroup采用樹狀層級結構管理:
- 每個層級可以附加一個或多個子系統
- 子cgroup繼承父cgroup的屬性
- 資源分配遵循自頂向下原則
root_cgroup ├── group_A (cpu,memory) │ ├── subgroup_A1 │ └── subgroup_A2 └── group_B (cpuset,blkio)
### 2.3 控制組(Control Group)
- 層級結構中的節點單位
- 包含一組進程和子cgroup
- 每個cgroup關聯特定的子系統參數
## 3. Cgroup實現原理
### 3.1 內核數據結構
```c
// 簡化版內核數據結構示意
struct css_set {
struct list_head tasks; // 關聯的任務列表
struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
};
struct cgroup {
struct cgroup *parent; // 父cgroup指針
struct list_head children; // 子cgroup列表
struct kernfs_node *kn; // 對應的kernfs節點
struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
};
進程掛載:
/proc/[pid]/cgroup
文件遷移進程資源分配:
# CPU時間分配示例(CFS調度器)
cpu.shares = 1024 # 默認權重值
cpu.cfs_period_us = 100000 # 周期100ms
cpu.cfs_quota_us = 50000 # 配額50ms(即50% CPU)
文件系統接口:
/sys/fs/cgroup
)提供用戶接口mkdir
創建新cgroup,echo
寫入控制參數特性 | Cgroup v1 | Cgroup v2 |
---|---|---|
子系統管理 | 多層級獨立管理 | 統一層級結構 |
資源限制 | 各子系統獨立限制 | 全局統一限制 |
內存控制 | 多種獨立控制器 | 整合memory+swap控制 |
接口路徑 | /sys/fs/cgroup/[subsys] | /sys/fs/cgroup/unified |
進程遷移 | 需手動遷移所有子系統 | 單點遷移 |
混合掛載模式:cgroup_no_v1=all
內核參數可禁用v1
系統工具適配: “`bash
stat -fc %T /sys/fs/cgroup/
# 混合系統查看 mount | grep cgroup
## 5. 實際應用案例
### 5.1 Docker容器資源限制
```bash
# 啟動容器時設置限制
docker run -it --cpus="1.5" --memory="512m" ubuntu
# 對應生成的cgroup配置
/sys/fs/cgroup/memory/docker/<container_id>/
├── memory.limit_in_bytes
└── memory.usage_in_bytes
# systemd單元文件示例(.slice)
[Unit]
Description=Database Services Slice
[Slice]
CPUQuota=150%
MemoryHigh=4G
MemoryMax=5G
# 創建開發環境限制組
cgcreate -g cpu,memory:/dev-env
cgset -r cpu.shares=512 dev-env
cgset -r memory.limit_in_bytes=2G dev-env
# 在限制下運行程序
cgexec -g cpu,memory:dev-env make -j4
# 保證關鍵服務CPU時間
echo "2000" > /sys/fs/cgroup/cpu/important/tasks/cpu.shares
# 限制批處理任務CPU核心
echo "0-1" > /sys/fs/cgroup/cpuset/batch/cpuset.cpus
# 設置OOM優先級(-1000到1000)
echo "-500" > /sys/fs/cgroup/memory/critical/memory.oom_control
# 啟用內存高壓通知
echo "1" > memory.oom_control
# 為延遲敏感型應用設置
echo "latency-sensitive" > /sys/fs/cgroup/cpu/cpu.qos
# 為后臺任務設置
echo "best-effort" > /sys/fs/cgroup/cpu/background/cpu.qos
# 查看cgroup樹狀結構
systemd-cgls
# 實時資源監控
systemd-cgtop
# 生成資源使用報告
cgcollect
# 追蹤cgroup內存事件
perf probe -a 'mm_memcg_commit_charge'
perf stat -e 'probe:mm:*' -a sleep 10
# 分析cgroup調度延遲
trace-cmd record -e sched -T \
-F 'cgroup == 1' \
./critical_app
權限管理:
# 設置cgroup目錄權限
chown root:admins /sys/fs/cgroup/production
chmod 750 /sys/fs/cgroup/production
設備訪問控制:
# 禁止訪問危險設備
echo "c 1:3 r" > /sys/fs/cgroup/devices/restricted/devices.deny
內核參數加固:
# /etc/sysctl.conf
kernel.cgroup_disable=memory,nice
Cgroup作為Linux資源管理的核心技術,從單機應用到云原生環境都發揮著關鍵作用。理解其工作原理和最佳實踐,對于構建高效、穩定的系統至關重要。隨著v2版本的普及和生態發展,建議新項目優先采用Cgroup v2架構。
本文共約3450字,涵蓋cgroups的核心概念、實現原理、實踐案例及未來發展,可作為系統管理員和開發者的實用參考指南。 “`
這篇文章采用Markdown格式編寫,包含: 1. 多級標題結構 2. 表格對比 3. 代碼塊示例 4. 樹狀結構圖示 5. 命令行操作實例 6. 內核數據結構說明 7. 版本差異比較 8. 安全配置建議 9. 監控調試方法 10. 實際應用場景
內容覆蓋從基礎概念到高級調優的完整知識體系,適合不同層次的讀者閱讀參考。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。