如何将进程限制为一个 CPU 内核?
类似于ulimit
或cpulimit
会很好的东西。(只是为了确保:我不想限制使用百分比或执行时间。我想强制应用程序(包括所有子进程、进程(线程))使用一个 cpu 核心(或“n”个 cpu 核心))。
有一个来自 Red Hat 的 cgroups 指南,它可能有点帮助(但没有回答这个问题)。
我知道如何在启动该进程的命令期间通过以下方式将特定进程限制为特定 CPU:
首先,将以下*放入/etc/cgconfig.conf
:
mount {
cpuset = /cgroup/cpuset;
cpu = /cgroup/cpu;
cpuacct = /cgroup/cpuacct;
memory = /cgroup/memory;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
}
group cpu0only {
cpuset {
cpuset.cpus = 0;
cpuset.mems = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
然后启动一个进程并使用以下命令将其专门分配给该 cgroup:
cgexec -g cpuset:cpu0only myprocessname
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式自动限制特定进程名称的所有实例(我认为这是正确的)/etc/cgrules.conf
:
# user:process controller destination
*:myprocessname cpuset cpu0only
Run Code Online (Sandbox Code Playgroud)
我的问题是:我怎样才能做相反的事情?
换句话说,如何将除一组特定的白名单进程及其子进程之外的所有进程分配给受限制的 …
一个简单的例子。我正在运行一个使用 TCP 套接字处理 http 请求的进程。它可能 A) 计算一些意味着 CPU 将成为瓶颈的东西 B) 发送一个可能导致网络成为瓶颈的大文件或 C) 具有半随机访问的复杂数据库查询导致磁盘瓶颈
我是否应该尝试将每个页面/API 调用归类为上述类型中的一种或多种,并尝试平衡每种调用的数量?或者操作系统会为我这样做吗?我如何决定我想要多少线程?
我将为硬件线程 12 和 48 使用 2 个数字(英特尔至强有那么多)。我想有 2/3 的线程用于重型 CPU(8/32),1 个线程用于重型磁盘(或每个磁盘 1 个重型线程),其余 3/15 用于其他任何事情,这意味着不要尝试平衡网络。
我是否应该在仅支持 12/48 线程的硬件上拥有超过 12/48 的线程?我想要更少,所以我不会导致 CPU 进入较慢的节流模式(我忘记了它的名字,但我听说如果一次激活太多芯片会发生这种情况)。如果我必须加载和资源平衡我的线程,我会怎么做?