cgroups(Control Groups)自 Linux 2.6.24 起引入核心,是輕量級虛擬化技術(如 LXC、Docker)的基石。它將進程分組,對每組資源(CPU、記憶體、I/O 等)進行限制、優先級分配、統計與隔離。本文梳理 cgroups 核心概念、檔案系統介面與常用操作指令。
每種資源對應一個子系統(subsystem),常見有 cpu、memory、blkio、cpuset、devices、freezer、net_cls 等。掛載方式:
mount -t cgroup -o cpu cpu /sys/fs/cgroup/cpu
建議各子系統獨立掛載目錄(如 /sys/fs/cgroup/cpu、/sys/fs/cgroup/memory),靈活性較高。查看已掛載:mount | awk '$5=="cgroup" {print $0}';查看所有子系統狀態:cat /proc/cgroups。
在子系統掛載點下建立目錄即建立控制群組(cgroup),例如 mkdir /sys/fs/cgroup/cpu/foo。新目錄會自動生成該子系統的配置檔。cgroup 支援多層巢狀結構,路徑代表群組身份;不同子系統下相同路徑對應同一邏輯群組,方便多資源協同控制。每個進程在單一子系統中只屬於一個 cgroup(預設為根群組)。
以 /sys/fs/cgroup/cpu 為例,常見檔案:
cpu.cfs_period_us、cpu.cfs_quota_us:CFS 週期與配額cpu.shares:相對權重cpu.stat:統計資訊tasks、cgroup.procs:成員管理(下文詳述)notify_on_release、release_agent:釋放通知機制將進程加入群組:將 PID 寫入 tasks 檔(echo 5678 > /sys/fs/cgroup/cpu/foo/tasks)。tasks 顯示執行緒 ID(TID),寫入僅影響該執行緒及其子孫;cgroup.procs 顯示執行緒群組 ID(TGID,即常說的 PID),寫入會將整個進程所有執行緒移入。寫入非 TGID 時會自動轉換。進程加入後限制即時生效。查看進程所屬群組:cat /proc/<pid>/cgroup。移出群組:寫入根群組的 tasks。刪除群組:rmdir 目錄(需先清空進程與釋放資源)。
除了檔案系統介面,亦可使用 cgconfigparser、cgexec、lssubsys 等工具。例如 cgexec -g "cpu,blkio:/foo" bash 直接在指定群組啟動程式。文中附贈一個 Bash 版 cgexec 腳本,無需安裝套件即可使用。
可修改群組目錄擁有者,讓非 root 使用者管理特定群組,實現權限最小化。
理解 cgroups 基礎架構是進階容器技術與資源治理的關鍵。建議從單一子系統實驗開始,逐步掌握多資源協同控制。