![如果 Ubuntu 服务器没有进行任何手动更改,那么 RAM 和 CPU 是如何分配的](https://linux22.com/image/714284/%E5%A6%82%E6%9E%9C%20Ubuntu%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B2%A1%E6%9C%89%E8%BF%9B%E8%A1%8C%E4%BB%BB%E4%BD%95%E6%89%8B%E5%8A%A8%E6%9B%B4%E6%94%B9%EF%BC%8C%E9%82%A3%E4%B9%88%20RAM%20%E5%92%8C%20CPU%20%E6%98%AF%E5%A6%82%E4%BD%95%E5%88%86%E9%85%8D%E7%9A%84.png)
我们有一台运行 R-Studio Server 的 Ubuntu Server (16.04),我们在该服务器上进行统计模拟。这些模拟有时会占用大量 RAM 和 CPU,因此我想知道如果两个用户登录并且每个用户都运行单独的 R 会话,并在其中“竞争”内存和 CPU,内核会如何分配内存和 RAM。
由于我们都不是服务器管理员,所以我们并不真正想应用手动更改,但我们感兴趣的是 RAM 和 CPU 分配是否对所有用户都大致相同。
注意:R-Studio Server Pro 版本允许以相当简单的方式为单个用户分配一定数量的内存,但由于我们没有专业版,所以我们无法更改这些设置。
答案1
RAM 是先到先得的。如果用户 A 运行 9 个进程,每个进程分配 10% 的内存,然后用户 B 登录,则用户 B 将只看到剩余 10% 的内存。如果内存耗尽,Linux 将开始终止进程。据我所知,OOM 终止程序并未针对多用户进行调整,因此在这种情况下可能不公平。
CPU 时间通常按进程分配,而不是按用户分配(但请参见下文)。
任何准备运行的进程(非休眠、非等待 I/O 等)都将被考虑进行调度。(尚未准备好运行的进程将被忽略,因此“不计算在内”。(这有点过于简单,但也差不多了。))
在最简单的模型中,如果两个用户各运行一个进程,那么他们各自获得大约一半的可用 CPU 时间。但是,如果用户 A 运行 10 个进程,而用户 B 运行 1 个进程,那么用户 A 获得 90% 的 CPU,而用户 B 获得 10% 的 CPU(其他条件相同)。
但是,Linux 调度程序可以通过将进程分组,然后在这些组之间分配 CPU 时间来改进这一点。
此外,Linux 还能够根据会话 ID(通常与终端、终端窗口和/或 X 登录会话相关联)自动对进程进行分组。这称为“自动分组”。目标是单个用户在一个窗口中运行繁重的后台任务,在另一个窗口中运行交互式任务,仍然会看到响应迅速的交互式性能。
据我所知,这两种功能在 Ubuntu 上都是默认启用的。
我找不到有关任务组和/或自动分组在多用户工作负载下如何表现的信息。理论上,如果调度程序将每个用户放在单独的任务组中,那么用户将始终获得对 CPU 的平衡访问权(两个用户各占 50%)。但是,我没有找到任何表明这将自动发生的信息。
进一步阅读:
答案2
如果你需要限制同一台服务器上的内存使用量,最好的办法是
- 使用两台虚拟机,最好是 KVM,这样您就可以使用现有的 Ubuntu 服务器来托管虚拟机。但是,这将阻止您轻松地将一个用户的未使用内存与另一个用户共享。
- 使用cgroups限制资源使用
2.1。https://askubuntu.com/questions/510913/how-to-set-a-memory-limit-for-a-specific-process 2.2http://www.fernandoalmeida.net/blog/how-to-limit-cpu-and-memory-usage-with-cgroups-on-debian-ubuntu/
答案3
默认情况下,Ubuntu 中用户的内存是无限的,在这种情况下是“先到先得”。换句话说,用户 A 可以用完所有内存,而不会给第二个用户留下任何空间。
但请注意:如果您配置了限制,它们将始终相同,并且不依赖于当前用户的数量,因此即使您的用户独自使用机器,您也会限制他们。
对于 CPU 来说,情况要好一些,内核调度程序将在进程(而不是用户!)之间分配 CPU 时间。
答案4
这将取决于后台进程正在执行什么操作、安装 Ubuntu 时安装了哪些版本的软件、cron 作业是否正在运行等。唯一真正找出答案的方法是检查您感兴趣的所有场景中的 RAM 使用情况,没有人能够告诉您,因为即使处理器和网卡的数量等因素也会影响 RAM 的使用情况。
您应该能够使用控制组来限制 RAM 使用量,但我不知道是否需要 root 权限。理想情况下,您可以创建多个虚拟机并以此方式分配资源。