![Nice level 和 systemctl CPUShares 属性之间的区别](https://linux22.com/image/105413/Nice%20level%20%E5%92%8C%20systemctl%20CPUShares%20%E5%B1%9E%E6%80%A7%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
据我了解(如有错误请指正)
systemctl set-property ... CPUShares=some_value
限制整个 cgroup 单元的 cpu 时间。如果我们想限制该单元内某个进程的 cpu 时间,我们可以使用以下命令运行该进程
systemd-run ... nice=some_value
我想知道进程的好值和一组进程的 CPUShares 值的概念之间是否存在本质区别?我们可以限制进程的CPUShares,或者设置cgroup单元的nice-value吗?我们什么时候想要做其中之一?
答案1
在 Linux 上,
- 一个好的值适用于任务,这是一个进程或线程(请参阅链接以消除歧义),
- “CPU 份额”值适用于任务组(例如:一个组组)。
默认的非实时 Linux 任务调度程序 (CFQ) 在不同的 cgroup 之间“公平”地分配 CPU 时间。它将使用cpu.shares
每个 cgroup 的值(默认为 1024),相对于其他 cgroup 的cpu.shares
值,为每个 cgroup 授予更多或更少的 CPU 时间(更多共享 = 更多 CPU 带宽)。
现在,每个cgroup内,相对于其他任务的nice值,任务的nice值将用于授予它更多或更少的CPU时间在同一个cgroup内。
预定(7)说:
在组调度下,线程的nice值仅对相对于同一任务组中的其他线程的调度决策有影响。
旁注:
- A任务组是一个 cgroup 或一个自动组(参见预定(7)),
- 您的 Linux 发行版上可能会默认禁用自动分组,请检查
cat /proc/sys/kernel/sched_autogroup_enabled
, - 任务组可以具有层次关系(cgroup 内的 cgroup),我猜测CFQ任务调度器考虑分配CPU时间,
- “最近”的发行版可能默认使用 systemd 将任务放入 cgroup 中(尝试
systemd-cgtop
和systemd-cgls
)。
答案2
通过阅读man systemd-run
,它将创建 a ,从而动态创建service
a 。cgroup
阅读后systemd.exec
,该Nice=
指令将适用于全部执行的进程,因此处理和systmd
的概念的方式非常相似。Nice=
CPUShares=
我对这种关系的理解是它与历史有关。nice
已经存在了几十年,并且始终应用于特定的流程。
另一方面,流程组的概念cgroups
和想法是一个较新的概念,但实现了相同的目标。CPUShares=
我希望systemd
支持Nice=
历史兼容性。
我会使用您觉得舒服的一个,但不会同时使用,以避免混淆。如果您没有偏好,我会使用更新的CPUShares=
概念。