nice 級別和 systemctl CPUShares 屬性之間的區別
據我了解(如果我錯了,請糾正我),
systemctl set-property ... CPUShares=some_value
限制整個 cgroup 單元的 cpu 時間。如果我們想限制該單元內程序的 cpu 時間,我們可以執行該程序
systemd-run ... nice=some_value
我想知道程序的nice-value概念和一組程序的CPUShares-value概念之間是否存在一些內在差異?我們可以限制一個程序的 CPUShares,或者設置一個 cgroup 單元的 nice-value 嗎?我們什麼時候想做其中之一?
從閱讀
man systemd-run
中,它將動態創建 aservice
,從而創建 acgroup
。從閱讀來看systemd.exec
,該Nice=
指令將適用於所有已執行的程序,因此處理和systmd
的概念的方式非常相似。Nice=``CPUShares=
我對這種關係的理解是它與歷史有關。
nice
已經存在了幾十年,並且總是應用於特定的過程。另一方面,應用於流程組的概念
cgroups
和想法是一個更新的概念,但實現了相同的目標。CPUShares=
我希望
systemd
支持Nice=
歷史兼容性。我會使用您喜歡的任何一個,但不會同時使用兩者以避免混淆。如果您沒有偏好,我會使用較新的
CPUShares=
概念。
在 Linux 上,
- 一個不錯的值適用於一個任務,即一個程序或執行緒(參見連結以了解歧義),
- “CPU 份額”值適用於任務組(例如:cgroup)。
預設的非實時 Linux 任務調度程序 (CFQ) 在不同的 cgroup 之間“公平”分配 CPU 時間。它將使用
cpu.shares
每個 cgroup 的值(預設為 1024),相對於其他 cgroup 的cpu.shares
值,為每個 cgroup 授予或多或少的 CPU 時間(更多份額 = 更多 CPU 頻寬)。現在,在每個 cgroup中,一個任務的 nice 值將用於授予它更多或更少的 CPU 時間,相對於同一 cgroup中其他任務的 nice 值。
附表(7)說:
在組調度下,執行緒的 nice 值僅對與同一任務組中的其他執行緒相關的調度決策產生影響。
旁注:
- 任務組是cgroup 或 autogroup(參見sched(7)),
- 在您的 Linux 發行版上,自動分組可能會被預設禁用,請檢查
cat /proc/sys/kernel/sched_autogroup_enabled
,- 任務組可以具有層次關係(cgroup 中的 cgroup),我猜CFQ 任務調度程序考慮分配 CPU 時間,
- “最近的”發行版可能預設使用 systemd 將任務放入 cgroups(嘗試
systemd-cgtop
和systemd-cgls
)。