Nice level 和 systemctl CPUShares 属性之间的区别

Nice level 和 systemctl CPUShares 属性之间的区别

据我了解(如有错误请指正)

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-cgtopsystemd-cgls)。

答案2

通过阅读man systemd-run,它将创建 a ,从而动态创建servicea 。cgroup阅读后systemd.exec,该Nice=指令将适用于全部执行的进程,因此处理和systmd的概念的方式非常相似。Nice=CPUShares=

我对这种关系的理解是它与历史有关。nice已经存在了几十年,并且始终应用于特定的流程。

另一方面,流程组的概念cgroups和想法是一个较新的概念,但实现了相同的目标。CPUShares=

我希望systemd支持Nice=历史兼容性。

我会使用您觉得舒服的一个,但不会同时使用,以避免混淆。如果您没有偏好,我会使用更新的CPUShares=概念。

相关内容