Systemd

nice 級別和 systemctl CPUShares 屬性之間的區別

  • December 1, 2021

據我了解(如果我錯了,請糾正我),

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中,它將動態創建 a service,從而創建 a cgroup。從閱讀來看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-cgtopsystemd-cgls)。

引用自:https://unix.stackexchange.com/questions/344936