为了平衡用户在共享计算服务器上的 CPU 消耗,我认为如果可以:
- 为用户的所有进程设置 nice 级别
- 此外,实时调整此级别
- 此外,这个级别不仅适用于未来,而且适用于正在运行的作业
- 此外,从用户当前的整体 CPU 使用率得出这个级别
这个想法是用户可以调用任意数量的作业。但是如果有其他用户,他的优先级会下降,这取决于他要求多少。所以 A 可以一次使用所有 32 个内核。然后另一个用户 B 来了,只开始了一项工作。现在 A 的优先级应该低于 B。然后 C 来启动 8 个作业。他现在应该在 A 和 B 之间有一个优先级。但是,优先级实际上不应该基于进程的数量,而是基于它们的整体 CPU 需求——如果可以确定的话。
我想这可能与将相同份额的 CPU 分配给所有活跃用户相同,只要他们使用它并将其余的分配给所有想要更多的人。
你认为这有可能吗?
你觉得这有道理吗?
每一项任务都为自己
一个过于简单的方法是根本不给它们配额。在这个 32 CPU 的机器上,A + B + C 是 41 个工作。加上内核的一些希望很小的系统开销。但是,并非所有东西都受 CPU 限制,在 I/O、内存和其他方面存在瓶颈。所以平均负载实际上不是 41,响应时间和吞吐量可能是可以容忍的。当然,没有任何控件可以防止进一步的负载导致性能问题。
公平的分享
也许资源应该按比例分配。例如Solaris 的公平共享调度程序就是这样做的。假设 AB 和 C 都是 32 个核心池中某些区域的项目,每个都有 1000 个份额。(有关实际区域示例,请参阅 Greg 的注释。)B 和 C 将以 100% 运行,因为它们使用的少于第三个。但是 A 在 23 个 CPU 上运行,因为需要 1 + 8 才能让 B 和 C 分得一杯羹。如果您的管理员想出一些分配它们的方案,不平等的份额是可能的。
Linux cgroups 后来出现了类似的东西。CPU cgroups 可用于实现比例份额或特定配额。这就是 systemd 切片和 Kubernetes CPU 资源的分配方式。
接下来要运行什么
由于有许多任务等待运行,理想情况下,调度程序不会让任何东西等待太长时间才能在 CPU 上运行。在微观层面上,运行队列或等效工作的方式也与系统的执行方式相关。
Linux CFS 调度程序为每个等待的任务划分时间片,这在这方面是公平的。此外,那些使用较少时间的任务首先完成。它具有优先交互事物,空闲等待用户输入的有用效果。
优先级(包括不错的值)是调度程序决策的输入。而且它不依赖配额人为地限制使用,这很好。然而,调整优先级,即使存在这样做的方案,也有限制。当每个用户都有不同优先级的任务时,一个系统范围的优先级编号无济于事,但仍需要保持公平的资源份额。