Kernel 如何限制应用程序中并发可运行进程的数量?

Kernel 如何限制应用程序中并发可运行进程的数量?,kernel,scheduler,cgroups,Kernel,Scheduler,Cgroups,比方说,一个应用程序A产生了20个进程。一次,A非常忙,20个进程处于可运行状态。那么cpu负载将很高。其他应用程序的响应时间将受到20个可运行进程的影响 如果有一种方法可以限制嘈杂环境中可运行进程的数量,它将减轻性能损失。例如,只有5个进程处于可运行状态,其他15个进程处于可中断睡眠状态。cgroups CPU共享或CFS配额对此问题几乎没有帮助。因为cGroup不会阻止将20个进程放入运行队列。要对嘈杂的邻居设置硬限制,可以使用以下方法: 上限强制可调参数 cpu.cfs\u周期\u us

比方说,一个应用程序A产生了20个进程。一次,A非常忙,20个进程处于可运行状态。那么cpu负载将很高。其他应用程序的响应时间将受到20个可运行进程的影响


如果有一种方法可以限制嘈杂环境中可运行进程的数量,它将减轻性能损失。例如,只有5个进程处于可运行状态,其他15个进程处于可中断睡眠状态。cgroups CPU共享或CFS配额对此问题几乎没有帮助。因为cGroup不会阻止将20个进程放入运行队列。

要对嘈杂的邻居设置硬限制,可以使用以下方法:

上限强制可调参数 cpu.cfs\u周期\u us 以微秒(µs,此处表示为“us”)为单位指定一段时间,以确定cgroup对CPU资源的访问应如何定期重新分配。如果cgroup中的任务应该能够在每1秒中访问单个CPU 0.2秒,请将CPU.cfs_quota_us设置为200000,将CPU.cfs_period_us设置为1000000。cpu.cfs_quota_us参数的上限为1秒,下限为1000微秒

cpu.cfs\u配额\u美国 指定cgroup中的所有任务在一个时段(由cpu.cfs\u period\u us定义)内可以运行的总时间(以微秒为单位,此处表示为“us”)。一旦cgroup中的任务用完配额指定的所有时间,它们就会在时段指定的剩余时间内被限制,直到下一个时段才允许运行。如果cgroup中的任务应该能够在每1秒中访问单个CPU 0.2秒,请将CPU.cfs_quota_us设置为200000,将CPU.cfs_period_us设置为1000000。请注意,配额和周期参数在CPU基础上运行。例如,要允许进程充分利用两个cpu,请将cpu.cfs_quota_us设置为200000,将cpu.cfs_period_us设置为100000。 将cpu.cfs_quota_us中的值设置为-1表示cgroup不遵守任何cpu时间限制。这也是每个cgroup(根cgroup除外)的默认值

只需限制其使用,例如,在1000美元的期限内,5000美元的配额。
这将限制其最大使用量为5个CPU,而不指定具体的CPU。

您可以使用/etc/security/limits.conf来控制该行为检查-nproc–最大进程数。通常情况下,应用程序会根据CPU核数创建进程池。如果我限制nproc,应用程序可能会疯掉。是的,这是真的,另一种方式是任务集,Linux调度程序将绑定到给定的CPU关联,并且进程将不会在任何其他CPU上运行。不确定它是否适用于您的问题。是的,我正在使用cpuset隔离吵闹的邻居。这带来了另一个难题——如何有效地为每个应用程序分配CPU核心。