在 Linux 系統中,cgroups(控制群組)是限制、監控與隔離進程資源使用的核心機制。本文將詳細說明如何透過 cgroups 的 cpu 子系統,精準控制進程的 CPU 使用率,避免單一程式佔用過多資源導致系統無回應。
cgroups 使用 cpu.cfs_period_us(週期,預設 100,000 微秒 = 100ms)與 cpu.cfs_quota_us(配額,預設 -1 代表無限制)兩個參數,配合完全公平排程器(CFS)來限制單位時間內的 CPU 使用時間。配額佔週期的比例即為該控制群組可使用的 CPU 百分比。
首先啟動一個佔滿 CPU 的測試程序:
# echo 'while True: pass' | python &
[1] 1532
使用 top 觀察,該進程(PID 1532)佔用 99.6% CPU。接著建立控制群組 /foo 並設定配額:
echo 50000 > /sys/fs/cgroup/cpu/foo/cpu.cfs_quota_us
echo 1532 > /sys/fs/cgroup/cpu/foo/tasks
此時 cpu.cfs_quota_us 設為 50,000,佔週期 100,000 的 50%。再次執行 top,該進程 CPU 使用率即降至約 50%。注意:單核心環境下數值對應直觀;多核心時,配額可超過週期(最多 n 核 × 週期)。
子群組的資源設定受父群組限制:cpu.cfs_period_us 不得小於父層,cpu.cfs_quota_us 不得大於父層。另有 cpu.rt_period_us、cpu.rt_runtime_us 用於即時進程限制,一般較少使用。
cpu.stat 提供 nr_periods(總週期)、nr_throttled(被節流週期)、throttled_time(被限制的總 CPU 時間),可作為資源使用監控依據。
cpu.shares 採相對權重方式分配 CPU,而非硬性限制。例如根群組 1024、/foo 2048,當兩組皆滿載時,/foo 可獲得雙倍 CPU 時間。若其他群組閒置,單一群組仍可跑滿全部 CPU,資源利用率較高。
透過 cpuset.cpus、cpuset.mems 可限定進程可使用的 CPU 核心與記憶體節點(支援 0,1,2 或 0-3 範圍格式)。啟用前必須同時設定兩者且相容,否則會報錯。驗證方式:cat /proc/<pid>/status | grep '_allowed_list'。
cpuacct.stat 記錄用戶態/核心態 CPU 時間(單位 jiffies,通常 100 Hz);cpuacct.usage 與 cpuacct.usage_percpu 以奈秒為單位統計總 CPU 消耗,適合雲端計費場景。
在 SLES 11 SP2/SP3(核心 3.0.x)中,寫入 cgroup.procs 不生效,必須寫入 tasks;其他核心版本未發現此問題。
掌握 cgroups CPU 控制技巧,能有效防止資源爭搶,保障關鍵服務穩定運行。建議在測試環境驗證參數後再套用至生產系統。
Linux 掛載 LVM 邏輯卷完整指南:從 PV/VG/LV 掃描到正確掛載
Ubuntu GNOME 建立自訂應用程式啟動器:為 MATLAB 等無 .desktop 檔軟體加入選單與圖示
Ubuntu 從原始碼編譯安裝 Node.js 並配置 Python 依賴開發環境
Linux 網路管理必備指令速查表:curl、wget、ping、ss、ip、dig、tc、nmap 實戰
Linux 使用 Shell 腳本分析 Nginx 日誌抵禦小規模 DDoS 攻擊
Linux 硬碟壞軌修復實戰:e2fsck 檢查、fdisk 重分區、mkfs.ext4 格式化、資料搶救流程