如何限制每个用户可以使用的 CPU 核心数量?

如何限制每个用户可以使用的 CPU 核心数量?

我们有一台计算机,其 CPU 有 32 个核心,它将由几个不同的用户用来运行程序。有没有办法限制每个用户在任何时候可以使用的核心数量,以便一个用户不会独占所有的 CPU 能力?

答案1

虽然这是可能的,这很复杂,而且几乎肯定是个坏主意。如果目前只有一个用户在使用机器,那么将他们限制在 N 个核心上就是浪费资源。一个更好的方法是使用以下命令运行所有内容nice

NAME
       nice - run a program with modified scheduling priority

SYNOPSIS
       nice [OPTION] [COMMAND [ARG]...]

DESCRIPTION
       Run  COMMAND  with an adjusted niceness, which affects process scheduling.  With
       no COMMAND, print the current niceness.  Niceness values range  from  -20  (most
       favorable to the process) to 19 (least favorable to the process).

这是一个很棒的工具,可以设置进程的优先级。因此,如果只有一个用户在运行某个任务,他们将获得所需的 CPU 时间,但如果其他人启动他们自己的(也是经过优化的)任务,他们将彼此共享。这样,如果您的用户都使用 启动命令nice 10 command,那么就不会有人占用资源(也不会有人让服务器瘫痪)。

注意,nice 值越高,优先级越低。这是衡量一个系统如何好的我们应该这样,我们越友善,我们分享的就越多。

还要注意,这不会帮助管理内存分配,它只会影响 CPU 调度。因此,如果多个用户启动多个内存密集型进程,您仍然会遇到问题。如果这是一个问题,您应该研究适当的排队系统,例如扭矩

答案2

总结:从简单的研究来看,似乎可以将命令限制到特定数量的核心,但是在所有情况下,您都必须使用实际强制限制的命令。

cgroups

Linuxcgroups经常使用的一个功能就是限制进程可用的资源。通过一个非常简短的研究,你可以找到一个Arch Wiki 中的示例使用 Matlab (一种科学软件) 配置设置为/etc/cgconfig.conf

group matlab {
    perm {
        admin {
            uid = username;
        }
        task {
            uid = username;
        }
    }

    cpuset {
        cpuset.mems="0";
        cpuset.cpus="0-5";
    }
    memory {
        memory.limit_in_bytes = 5000000000;
    }
}

为了使这样的配置生效,您必须通过cgexec命令运行该过程,例如从同一个 wiki 页面:

$ cgexec -g memory,cpuset:matlab /opt/MATLAB/2012b/bin/matlab -desktop

任务集

A相关问题在 Ask Ubuntu 上如何在 Linux 中将进程限制在一个 CPU 核心上?[重复]tasksetUnix&Linux 网站上展示了一个使用限制进程 CPU的示例。在第一个问题中,它是通过解析特定用户的所有进程来实现的

$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001

在另一个问题中,一个进程通过taskset其自身启动:

$ taskset -c 0 mycommand --option  # start a command with the given affinity

结论

虽然确实可以限制进程,但对于特定用户来说,实现这一点似乎并不那么简单。链接的 Ask Ubuntu 帖子中的示例需要对属于每个用户的进程进行一致扫描,并taskset在每个新用户上使用。更合理的方法是选择性地运行 CPU 密集型应用程序,无论是通过cgexec还是taskset;将所有进程限制为特定数量的 CPU 也是没有意义的,尤其是对于那些实际利用并行性和并发性来更快地运行任务的进程来说——将它们限制为特定数量的 CPU 可能会减慢处理速度。此外,由于terdon 的回答提到这是浪费资源

通过taskset或运行选定的应用程序cgexec需要与您的用户沟通,让他们知道他们可以运行哪些应用程序,或者创建将通过tasksel或启动选定的应用程序的包装脚本cgexec

此外,考虑设置用户或组可以生成的进程数,而不是设置 CPU 数量限制。这可以通过以下方式实现/etc/security/limits.conf文件

也可以看看

相关内容