根据用户进程的CPU使用率实时设置所有用户进程的nice值

根据用户进程的CPU使用率实时设置所有用户进程的nice值

为了平衡共享计算服务器上的用户 CPU 消耗,我认为如果能够做到以下几点会非常有用:

  1. 为用户的所有进程设置良好级别
  2. 此外,实时调整此级别
  3. 此外,该级别不仅适用于未来,也适用于正在运行的工作
  4. 此外,根据用户当前的整体 CPU 使用率得出此级别

这个想法是,用户可以调用任意数量的作业。但如果有其他用户,他的优先级将根据他要求的多少而下降。因此,A 可以一次使用所有 32 个核心。然后另一个用户 B 来了,只启动 1 个作业。现在 A 的优先级应该低于 B。然后 C 来了,启动 8 个作业。他现在的优先级应该在 A 和 B 之间。然而,优先级实际上不应该基于进程的数量,而应该基于它们的整体 CPU 需求——如果可以确定的话。

我猜这可能与将相同份额的 CPU 分配给所有活跃用户(只要他们使用)并将其余部分分配给所有想要更多 CPU 的用户相同。

您认为这有实现的可能吗?

您觉得这有道理吗?

答案1

每项任务都为自己而做

一种过于简单的方法是根本不对它们进行配额。在这个 32 CPU 的机器上,A + B + C 是 41 个作业。加上一些希望很小的内核系统开销。但是,并非所有东西都受 CPU 限制,并且 I/O、内存和其他方面都存在瓶颈。因此平均负载实际上不是 41,响应时间和吞吐量可能是可以容忍的。当然,没有控制措施来防止进一步的负载导致性能问题。

公平的分享

也许应该按比例分配资源。例如Solaris 的公平份额调度程序确实如此。假设 AB 和 C 都是 32 个核心池中某些区域中的项目,每个项目都有 1000 份额。(参见Greg 的实际区域示例笔记。)B 和 C 会以 100% 运行,因为它们使用的 CPU 比第三个少。但 A 以 23 个 CPU 运行,因为需要 1 + 8 才能让 B 和 C 获得其份额。如果您作为管理员想出一些分配方案,则可能会出现不平等的份额。

后来,Linux cgroups 也出现了类似的功能。CPU cgroups 可用于实现比例共享或特定配额。这就是 systemd 切片和 Kubernetes CPU 资源的分配方式。

下一步要运行什么

由于有许多任务等待运行,理想情况下,调度程序不会让任何任务在 CPU 上等待太久。在微观层面,运行队列或等效工作的方式也与系统性能有关。

Linux CFS 调度程序为每个等待的任务划分时间片,从这个角度来看这是公平的。此外,那些使用时间较少的任务将首先运行。这具有优先处理交互任务的有用效果,空闲任务等待用户输入。

优先级(包括 nice 值)是调度程序决策的输入。它不依赖于人为限制使用的配额,这一点很好。但是,即使存在调整优先级的方案,调整优先级也有限制。当每个用户都有不同优先级的任务但仍需要保持公平的资源份额时,一个系统范围的优先级数字无济于事。

相关内容